Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 09 Jun 2026 19:32:11 +0000
From:      =?utf-8?Q?Jes=C3=BAs?= Daniel Colmenares Oviedo <dtxdf@FreeBSD.org>
To:        ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org
Subject:   git: bf518db907b4 - main - www/py-yubal-api: New port: Self-hosted YouTube Music downloader (API)
Message-ID:  <6a286a3b.18ead.196f7e95@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by dtxdf:

URL: https://cgit.FreeBSD.org/ports/commit/?id=bf518db907b4c64b103c35a53b9d3c7595cdd407

commit bf518db907b4c64b103c35a53b9d3c7595cdd407
Author:     Jesús Daniel Colmenares Oviedo <dtxdf@FreeBSD.org>
AuthorDate: 2026-06-09 18:10:23 +0000
Commit:     Jesús Daniel Colmenares Oviedo <dtxdf@FreeBSD.org>
CommitDate: 2026-06-09 19:31:33 +0000

    www/py-yubal-api: New port: Self-hosted YouTube Music downloader (API)
    
    yubal is a self-hosted YouTube Music downloader. Paste a link, get
    a tagged, organized library.
    
    Scheduled sync. Smart deduplication. Media server ready. Browser
    extension included.
    
    WWW: https://github.com/guillevc/yubal/
---
 www/Makefile                                       |   1 +
 www/py-yubal-api/Makefile                          |  57 ++++++++
 www/py-yubal-api/distinfo                          |   5 +
 .../files/patch-src_yubal__api_domain_types.py     |  13 ++
 .../patch-src_yubal__api_services_log__buffer.py   |  19 +++
 www/py-yubal-api/files/yubal.in                    |  45 ++++++
 www/py-yubal-api/pkg-descr                         |   5 +
 www/py-yubal-api/pkg-plist                         | 158 +++++++++++++++++++++
 8 files changed, 303 insertions(+)

diff --git a/www/Makefile b/www/Makefile
index b8d7f5cdcffc..575b9e718c50 100644
--- a/www/Makefile
+++ b/www/Makefile
@@ -2038,6 +2038,7 @@
     SUBDIR += py-yt-dlp
     SUBDIR += py-yt-dlp-ejs
     SUBDIR += py-yubal
+    SUBDIR += py-yubal-api
     SUBDIR += pydio-cells
     SUBDIR += qdecoder
     SUBDIR += qhttpengine
diff --git a/www/py-yubal-api/Makefile b/www/py-yubal-api/Makefile
new file mode 100644
index 000000000000..b13839a21fa1
--- /dev/null
+++ b/www/py-yubal-api/Makefile
@@ -0,0 +1,57 @@
+PORTNAME=	yubal-api
+DISTVERSIONPREFIX=	v
+DISTVERSION=	0.9.0
+CATEGORIES=	www python
+MASTER_SITES=	LOCAL/dtxdf/yubal/:assets
+PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}
+# For instructions on how to create assets:
+#   https://github.com/DtxdF/port-assets-makejails/tree/main/yubal
+DISTFILES=	yubal-${DISTVERSIONPREFIX}${DISTVERSION}.frontend${EXTRACT_SUFX}:assets
+
+MAINTAINER=	dtxdf@FreeBSD.org
+COMMENT=	Self-hosted YouTube Music downloader (API)
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKDIR}/yubal-${DISTVERSION}/LICENSE
+
+BUILD_DEPENDS=	${PYTHON_PKGNAMEPREFIX}uv-build>=0:devel/py-uv-build@${PY_FLAVOR}
+RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}alembic>=0:databases/py-alembic@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}croniter>=0:sysutils/py-croniter@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}fastapi>=0:www/py-fastapi@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}pydantic-settings>=0:devel/py-pydantic-settings@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}rich>=0:textproc/py-rich@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}sqlmodel>=0:databases/py-sqlmodel@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}tzdata>=0:devel/py-tzdata@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}uvicorn>=0:www/py-uvicorn@${PY_FLAVOR} \
+		${PYTHON_PKGNAMEPREFIX}yubal>=0:www/py-yubal@${PY_FLAVOR}
+
+USES=		python
+USE_GITHUB=	yes
+GH_ACCOUNT=	guillevc
+GH_PROJECT=	yubal
+USE_PYTHON=	pep517
+USE_RC_SUBR=	yubal
+
+NO_ARCH=	yes
+SUB_LIST=	HOMEDIR=${YUBAL_HOMEDIR} \
+		USER=${YUBAL_USER}
+
+WRKSRC_SUBDIR=	packages/api
+
+USERS=		${YUBAL_USER}
+GROUPS=		${YUBAL_GROUP}
+
+PLIST_SUB=	GROUP=${YUBAL_GROUP} \
+		HOMEDIR=${YUBAL_HOMEDIR} \
+		USER=${YUBAL_USER}
+
+YUBAL_USER=	www
+YUBAL_GROUP=	www
+YUBAL_HOMEDIR=	/var/db/yubal
+
+post-install:
+	@${MKDIR} ${STAGEDIR}${WWWDIR}/web/dist
+	@cd ${WRKDIR}/yubal-frontend && ${COPYTREE_SHARE} . ${STAGEDIR}${WWWDIR}/web/dist
+	@${MKDIR} ${STAGEDIR}${YUBAL_HOMEDIR}
+
+.include <bsd.port.mk>
diff --git a/www/py-yubal-api/distinfo b/www/py-yubal-api/distinfo
new file mode 100644
index 000000000000..6da989f12433
--- /dev/null
+++ b/www/py-yubal-api/distinfo
@@ -0,0 +1,5 @@
+TIMESTAMP = 1780944637
+SHA256 (yubal-v0.9.0.frontend.tar.gz) = fed1e8b38abee9d00a65a5addb71b84be515e95894ce4bfdff04d317c54af658
+SIZE (yubal-v0.9.0.frontend.tar.gz) = 1523865
+SHA256 (guillevc-yubal-v0.9.0_GH0.tar.gz) = 19ba551b6411c613fcf6fb488d49a6d9df47bba9c1d03dfa47698dc5f5efc398
+SIZE (guillevc-yubal-v0.9.0_GH0.tar.gz) = 12894665
diff --git a/www/py-yubal-api/files/patch-src_yubal__api_domain_types.py b/www/py-yubal-api/files/patch-src_yubal__api_domain_types.py
new file mode 100644
index 000000000000..359d501129dc
--- /dev/null
+++ b/www/py-yubal-api/files/patch-src_yubal__api_domain_types.py
@@ -0,0 +1,13 @@
+--- src/yubal_api/domain/types.py.orig	2026-06-08 18:55:40 UTC
++++ src/yubal_api/domain/types.py
+@@ -2,7 +2,8 @@ from datetime import datetime
+ 
+ from collections.abc import Callable
+ from datetime import datetime
++from typing import TypeAlias
+ 
+ # Callable type aliases for dependency injection
+-type Clock = Callable[[], datetime]
+-type IdGenerator = Callable[[], str]
++Clock: TypeAlias = Callable[[], datetime]
++IdGenerator: TypeAlias = Callable[[], str]
diff --git a/www/py-yubal-api/files/patch-src_yubal__api_services_log__buffer.py b/www/py-yubal-api/files/patch-src_yubal__api_services_log__buffer.py
new file mode 100644
index 000000000000..3c89368dd4ed
--- /dev/null
+++ b/www/py-yubal-api/files/patch-src_yubal__api_services_log__buffer.py
@@ -0,0 +1,19 @@
+--- src/yubal_api/services/log_buffer.py.orig	2026-06-08 20:18:05 UTC
++++ src/yubal_api/services/log_buffer.py
+@@ -8,7 +8,7 @@ from datetime import datetime
+ from collections.abc import AsyncIterator
+ from contextlib import asynccontextmanager
+ from datetime import datetime
+-from typing import Any, ClassVar, override
++from typing import Any, ClassVar
+ 
+ from yubal_api.schemas.logs import LogEntry, LogEntryType, LogStats
+ 
+@@ -123,7 +123,6 @@ class BufferHandler(logging.Handler):
+         super().__init__()
+         self._buffer = buffer
+ 
+-    @override
+     def emit(self, record: logging.LogRecord) -> None:
+         """Serialize log record to validated JSON and append to buffer."""
+         try:
diff --git a/www/py-yubal-api/files/yubal.in b/www/py-yubal-api/files/yubal.in
new file mode 100644
index 000000000000..ff91e28cbb2f
--- /dev/null
+++ b/www/py-yubal-api/files/yubal.in
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+# PROVIDE: yubal
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+#
+# Configuration settings for Yubal in /etc/rc.conf
+#
+# yubal_enable (bool):     Enable yubal. (Default=NO)
+# yubal_env_file (str):    Path containing the environment variables
+#                          to be used by yubal. (Default: %%PREFIX%%/etc/yubal.env)
+# yubal_logfile (str):     Log file name. (Default: /var/log/yubal.log)
+# yubal_runas (str):       User to run yubal as. (Default: %%USER%%)
+
+. /etc/rc.subr
+
+name=yubal
+desc="Self-hosted YouTube Music downloader"
+rcvar="${name}_enable"
+
+load_rc_config "${name}"
+
+: ${yubal_enable:="NO"}
+: ${yubal_env_file:="%%PREFIX%%/etc/${name}.env"}
+: ${yubal_logfile:="/var/log/${name}.log"}
+: ${yubal_runas:="%%USER%%"}
+
+pidfile="/var/run/${name}.pid"
+start_cmd="${name}_start"
+procname="%%PREFIX%%/bin/python%%PYTHON_VER%%"
+
+yubal_start()
+{
+	startmsg -n "Starting ${name}"
+	cd "/var/db/${name}"
+	env \
+		YUBAL_ROOT="%%WWWDIR%%" \
+		YUBAL_DATA="%%HOMEDIR%%/data" \
+		YUBAL_CONFIG="%%HOMEDIR%%/config" \
+			 /usr/sbin/daemon -o "${yubal_logfile}" -u "${yubal_runas}" -p "${pidfile}" \
+				"${procname}" -m yubal_api
+	startmsg "."
+}
+
+run_rc_command "${1}"
diff --git a/www/py-yubal-api/pkg-descr b/www/py-yubal-api/pkg-descr
new file mode 100644
index 000000000000..d4ae1ee56de5
--- /dev/null
+++ b/www/py-yubal-api/pkg-descr
@@ -0,0 +1,5 @@
+yubal is a self-hosted YouTube Music downloader. Paste a link, get
+a tagged, organized library.
+
+Scheduled sync. Smart deduplication. Media server ready. Browser
+extension included.
diff --git a/www/py-yubal-api/pkg-plist b/www/py-yubal-api/pkg-plist
new file mode 100644
index 000000000000..67b8409771cf
--- /dev/null
+++ b/www/py-yubal-api/pkg-plist
@@ -0,0 +1,158 @@
+%%PYTHON_SITELIBDIR%%/yubal_api-0.9.0.dist-info/METADATA
+%%PYTHON_SITELIBDIR%%/yubal_api-0.9.0.dist-info/RECORD
+%%PYTHON_SITELIBDIR%%/yubal_api-0.9.0.dist-info/WHEEL
+%%PYTHON_SITELIBDIR%%/yubal_api/__init__.py
+%%PYTHON_SITELIBDIR%%/yubal_api/__main__.py
+%%PYTHON_SITELIBDIR%%/yubal_api/__pycache__/__init__%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/__pycache__/__init__%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/__pycache__/__main__%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/__pycache__/__main__%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/__pycache__/settings%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/__pycache__/settings%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/alembic.ini
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__init__.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__pycache__/__init__%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__pycache__/__init__%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__pycache__/app%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__pycache__/app%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__pycache__/container%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__pycache__/container%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__pycache__/deps%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__pycache__/deps%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__pycache__/exceptions%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/__pycache__/exceptions%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/app.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/container.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/deps.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/exceptions.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__init__.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/__init__%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/__init__%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/cookies%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/cookies%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/health%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/health%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/info%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/info%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/jobs%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/jobs%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/logs%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/logs%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/scheduler%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/scheduler%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/subscriptions%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/__pycache__/subscriptions%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/cookies.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/health.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/info.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/jobs.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/logs.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/scheduler.py
+%%PYTHON_SITELIBDIR%%/yubal_api/api/routes/subscriptions.py
+%%PYTHON_SITELIBDIR%%/yubal_api/db/__init__.py
+%%PYTHON_SITELIBDIR%%/yubal_api/db/__pycache__/__init__%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/db/__pycache__/__init__%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/db/__pycache__/engine%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/db/__pycache__/engine%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/db/__pycache__/subscription%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/db/__pycache__/subscription%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/db/__pycache__/subscription_repository%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/db/__pycache__/subscription_repository%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/db/engine.py
+%%PYTHON_SITELIBDIR%%/yubal_api/db/subscription.py
+%%PYTHON_SITELIBDIR%%/yubal_api/db/subscription_repository.py
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/__init__.py
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/__pycache__/__init__%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/__pycache__/__init__%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/__pycache__/enums%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/__pycache__/enums%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/__pycache__/job%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/__pycache__/job%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/__pycache__/types%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/__pycache__/types%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/enums.py
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/job.py
+%%PYTHON_SITELIBDIR%%/yubal_api/domain/types.py
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/README
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/__pycache__/env%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/__pycache__/env%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/env.py
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/script.py.mako
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/versions/03132d5514f9_add_subscription_thumbnail_url.py
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/versions/__pycache__/03132d5514f9_add_subscription_thumbnail_url%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/versions/__pycache__/03132d5514f9_add_subscription_thumbnail_url%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/versions/__pycache__/b36ae7fb398c_initial_schema%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/versions/__pycache__/b36ae7fb398c_initial_schema%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/migrations/versions/b36ae7fb398c_initial_schema.py
+%%PYTHON_SITELIBDIR%%/yubal_api/py.typed
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__init__.py
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/__init__%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/__init__%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/cookies%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/cookies%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/health%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/health%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/jobs%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/jobs%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/logs%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/logs%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/scheduler%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/scheduler%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/subscriptions%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/subscriptions%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/types%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/__pycache__/types%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/cookies.py
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/health.py
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/jobs.py
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/logs.py
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/scheduler.py
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/subscriptions.py
+%%PYTHON_SITELIBDIR%%/yubal_api/schemas/types.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__init__.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/__init__%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/__init__%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/job_event_bus%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/job_event_bus%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/job_executor%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/job_executor%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/job_store%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/job_store%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/log_buffer%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/log_buffer%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/playlist_info_service%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/playlist_info_service%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/protocols%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/protocols%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/scheduler%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/scheduler%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/shutdown_coordinator%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/shutdown_coordinator%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/subscription_service%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/subscription_service%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/sync_service%%PYTHON_TAG%%.opt-1.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/__pycache__/sync_service%%PYTHON_TAG%%.pyc
+%%PYTHON_SITELIBDIR%%/yubal_api/services/job_event_bus.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/job_executor.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/job_store.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/log_buffer.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/playlist_info_service.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/protocols.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/scheduler.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/shutdown_coordinator.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/subscription_service.py
+%%PYTHON_SITELIBDIR%%/yubal_api/services/sync_service.py
+%%PYTHON_SITELIBDIR%%/yubal_api/settings.py
+%%WWWDIR%%/web/dist/assets/index-CB2szv8f.css
+%%WWWDIR%%/web/dist/assets/index-Cb_kQ0nn.js
+%%WWWDIR%%/web/dist/assets/index-Cb_kQ0nn.js.map
+%%WWWDIR%%/web/dist/assets/rolldown-runtime-Cyuzqnbw.js
+%%WWWDIR%%/web/dist/assets/vendor-heroui-CDEHibTy.js
+%%WWWDIR%%/web/dist/assets/vendor-heroui-CDEHibTy.js.map
+%%WWWDIR%%/web/dist/assets/vendor-icons-i1raa0kC.js
+%%WWWDIR%%/web/dist/assets/vendor-icons-i1raa0kC.js.map
+%%WWWDIR%%/web/dist/assets/vendor-react-cO5FtseH.js
+%%WWWDIR%%/web/dist/assets/vendor-react-cO5FtseH.js.map
+%%WWWDIR%%/web/dist/favicon.svg
+%%WWWDIR%%/web/dist/index.html
+@dir(%%USER%%,%%GROUP%%,775) %%HOMEDIR%%


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a286a3b.18ead.196f7e95>