From nobody Tue Jun 9 19:32:11 2026 X-Original-To: dev-commits-ports-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gZfDr0Yc0z6gWsF for ; Tue, 09 Jun 2026 19:32:12 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gZfDq4DD7z3rqR for ; Tue, 09 Jun 2026 19:32:11 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781033531; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=LpCsgzQfd7hXjNXpOPLSD0aXJ8D0auSc/1rtM167uxY=; b=m8Jm+o4S0LQrKwm3zlGL5sBz6NyQJ4RceFdiOJFux958VLMRkETRPo13Jhj7K6B1su7xgT rjEDGktXdw9McNjSAnqOswJ9MHbKLd4qXc8K6Ry5bIZU3e54IZQi1BVITgndd0P0j4rLzy jwEb8s0Fh6bhwKzb00QvD7V59ZuEvzNThK7R9D/ajUPgeajPi5LSAURMB9ytZWy8GH0WwJ Ov3fBvmxC929EuH/k/GHfI5TW9IvzOmRgQbXPp6k9zXOrwdp5Jz2XigvOEShJj+iDBbz8N hn7jdZJ71NQeBjkT+taoyaDZk0YR3dEPszyWGvQY8No/Ph4MvXSo8TneiNoEMw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1781033531; a=rsa-sha256; cv=none; b=t53jA5mfoLXnUBaa1kweA+fsSzlhCLxWsbrnHfVbNQmkkrbYPGfG4SJLkNf1O3Zp6A2Vpm 4JHoVJtkSA9sNoD2ey+bgy4CKmQUV80J8WYj2mVwLPR/dKNgMPb6dZ+QO45ZWeD15ttLu6 itaUGs2F/gC6U9adpKkWtq4FXG8Flgqvb6aNyX73UQ2q7uEFtHA/iuQ3ECBaemUpJzAeJv Qw2kTpCXg7Ha1kAu+/ko1sThL0sINhZu9siHwbtuWRO9oupK7Hp3K48fungSbkM7dLHETd 4zRrCOSpepEHoppUZ0liM88rqnRVoqj20i6L6NAzOn0/ajnT5Sej9GhldAyCjg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1781033531; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=LpCsgzQfd7hXjNXpOPLSD0aXJ8D0auSc/1rtM167uxY=; b=gozcl7BwTnSK32JgPFgU6APixJnNokpSMGwu6HxfU7CISqZeawbdSJIOBQQC95pkoeIB1Y j1+WAhCvwFGigLBv7Nryxh2EZydqiqwrISfIu5+A0U0FwRpUnztx+jS3hh5P8afU/IZXeT g740UF0BHonLPH4nVfSS6vSbMdgg/tW0+1sztE4nFl07CpLqLWHzOJyDJWYbACxwhWZ/au mRVSYhIRfnkRZikwr9mE4yG4Dmfjd8Vp9Dj9ueJXGap3FDPROj+K3Y02wF33ysu+lftV15 bhyMZYaSo+5HYumuF5XmV+//u40A7SgFJ6TfloOIQ8AoJKsGUajOQ5DtF99COw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gZfDq3Z1RzpKL for ; Tue, 09 Jun 2026 19:32:11 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 18ead by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 09 Jun 2026 19:32:11 +0000 To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org From: =?utf-8?Q?Jes=C3=BAs?= Daniel Colmenares Oviedo Subject: git: bf518db907b4 - main - www/py-yubal-api: New port: Self-hosted YouTube Music downloader (API) List-Id: Commit messages for all branches of the ports repository List-Archive: https://lists.freebsd.org/archives/dev-commits-ports-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-ports-all@freebsd.org Sender: owner-dev-commits-ports-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: dtxdf X-Git-Repository: ports X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: bf518db907b4c64b103c35a53b9d3c7595cdd407 Auto-Submitted: auto-generated Date: Tue, 09 Jun 2026 19:32:11 +0000 Message-Id: <6a286a3b.18ead.196f7e95@gitrepo.freebsd.org> 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 AuthorDate: 2026-06-09 18:10:23 +0000 Commit: Jesús Daniel Colmenares Oviedo 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 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%%