From a230ab02f8f1d3e4cd64bc6e45ea88d90223b6c8 Mon Sep 17 00:00:00 2001 From: Priveetee Date: Thu, 25 Jun 2026 22:58:23 +0200 Subject: [PATCH 1/5] fix: pass remote login flag to server --- docker-compose.dev.yml | 1 + docker-compose.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 38b53e1..2812503 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -16,6 +16,7 @@ services: env_file: .env environment: DOWNLOADER_SERVICE_URL: http://typetype-downloader:18093 + YOUTUBE_REMOTE_LOGIN_ENABLED: ${YOUTUBE_REMOTE_LOGIN_ENABLED:-false} YOUTUBE_REMOTE_LOGIN_SERVICE_URL: http://typetype-token:8081 YOUTUBE_REMOTE_LOGIN_CALLBACK_BASE_URL: http://typetype-server:8080 YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN: ${YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN:-} diff --git a/docker-compose.yml b/docker-compose.yml index 715c645..978b941 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,6 +22,7 @@ services: GITHUB_REPO: ${GITHUB_REPO:-Priveetee/TypeType-Server} GITHUB_ISSUE_TEMPLATE: ${GITHUB_ISSUE_TEMPLATE:-bug_report_backend.md} DOWNLOADER_SERVICE_URL: http://typetype-downloader:18093 + YOUTUBE_REMOTE_LOGIN_ENABLED: ${YOUTUBE_REMOTE_LOGIN_ENABLED:-true} YOUTUBE_REMOTE_LOGIN_SERVICE_URL: http://typetype-token:8081 YOUTUBE_REMOTE_LOGIN_CALLBACK_BASE_URL: http://typetype-server:8080 YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN: ${YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN:-} From 723eb86cd4946a8a2059180c32dab473e1d024d4 Mon Sep 17 00:00:00 2001 From: Priveetee Date: Fri, 26 Jun 2026 22:40:36 +0200 Subject: [PATCH 2/5] chore: align stack postgres environment --- .env.example | 6 +++--- docker-compose.dev.yml | 23 +++++++++++++++-------- docker-compose.yml | 25 +++++++++++++------------ scripts/setup-stack.sh | 30 +++++++++++++++--------------- 4 files changed, 46 insertions(+), 38 deletions(-) diff --git a/.env.example b/.env.example index c7ac4dd..a541f34 100644 --- a/.env.example +++ b/.env.example @@ -8,9 +8,9 @@ HOST_PORT_SERVER_BETA=18080 HOST_PORT_DOWNLOADER_BETA=19093 HOST_PORT_TOKEN_BETA=18081 HOST_PORT_GARAGE_S3_BETA=3900 -DATABASE_URL=jdbc:postgresql://postgres:5432/typetype -DATABASE_USER=typetype -DATABASE_PASSWORD=typetype +POSTGRES_DB=typetype +POSTGRES_USER=typetype +POSTGRES_PASSWORD=typetype DRAGONFLY_URL=redis://dragonfly:6379 GITHUB_REPO=Priveetee/TypeType-Server GITHUB_ISSUE_TEMPLATE=bug_report_backend.md diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 2812503..46b3a44 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -15,6 +15,9 @@ services: - "${HOST_PORT_SERVER_BETA:-18080}:8080" env_file: .env environment: + DATABASE_URL: ${DATABASE_URL:-jdbc:postgresql://postgres:5432/${POSTGRES_DB:-typetype}} + DATABASE_USER: ${DATABASE_USER:-${POSTGRES_USER:-typetype}} + DATABASE_PASSWORD: ${DATABASE_PASSWORD:-${POSTGRES_PASSWORD:-typetype}} DOWNLOADER_SERVICE_URL: http://typetype-downloader:18093 YOUTUBE_REMOTE_LOGIN_ENABLED: ${YOUTUBE_REMOTE_LOGIN_ENABLED:-false} YOUTUBE_REMOTE_LOGIN_SERVICE_URL: http://typetype-token:8081 @@ -42,7 +45,9 @@ services: HTTP_PORT: "18093" PUBLIC_BASE_URL: /api/downloader TYPETYPE_API_BASE: http://typetype-server:8080 - DB_URL: postgres://typetype:typetype@postgres:5432/typetype_downloader?sslmode=disable + DB_URL: ${DB_URL:-postgres://${POSTGRES_USER:-typetype}:${POSTGRES_PASSWORD:-typetype}@postgres:5432/typetype_downloader?sslmode=disable} + DB_USER: ${DB_USER:-${POSTGRES_USER:-typetype}} + DB_PASSWORD: ${DB_PASSWORD:-${POSTGRES_PASSWORD:-typetype}} REDIS_HOST: dragonfly REDIS_PORT: "6379" REDIS_QUEUE_KEY: downloader:queue @@ -91,9 +96,9 @@ services: postgres: image: postgres:17 environment: - POSTGRES_DB: typetype - POSTGRES_USER: typetype - POSTGRES_PASSWORD: typetype + POSTGRES_DB: ${POSTGRES_DB:-typetype} + POSTGRES_USER: ${POSTGRES_USER:-typetype} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-typetype} volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped @@ -104,15 +109,17 @@ services: postgres: condition: service_started environment: - PGPASSWORD: typetype + POSTGRES_DB: ${POSTGRES_DB:-typetype} + POSTGRES_USER: ${POSTGRES_USER:-typetype} + PGPASSWORD: ${POSTGRES_PASSWORD:-typetype} command: - /bin/sh - -ec - | - until pg_isready -h postgres -U typetype -d typetype; do sleep 1; done - EXISTS=$$(psql -h postgres -U typetype -d typetype -tAc "SELECT 1 FROM pg_database WHERE datname='typetype_downloader'") + until pg_isready -h postgres -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"; do sleep 1; done + EXISTS=$$(psql -h postgres -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" -tAc "SELECT 1 FROM pg_database WHERE datname='typetype_downloader'") if [ "$$EXISTS" != "1" ]; then - psql -h postgres -U typetype -d typetype -c "CREATE DATABASE typetype_downloader" + psql -h postgres -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" -c "CREATE DATABASE typetype_downloader" fi restart: "no" diff --git a/docker-compose.yml b/docker-compose.yml index 978b941..227bb72 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,9 +15,9 @@ services: - "${HOST_PORT_SERVER:-8080}:8080" environment: ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-http://localhost:8082,http://127.0.0.1:8082,http://localhost:5173,http://127.0.0.1:5173} - DATABASE_URL: ${DATABASE_URL:-jdbc:postgresql://postgres:5432/typetype} - DATABASE_USER: ${DATABASE_USER:-typetype} - DATABASE_PASSWORD: ${DATABASE_PASSWORD:-typetype} + DATABASE_URL: ${DATABASE_URL:-jdbc:postgresql://postgres:5432/${POSTGRES_DB:-typetype}} + DATABASE_USER: ${DATABASE_USER:-${POSTGRES_USER:-typetype}} + DATABASE_PASSWORD: ${DATABASE_PASSWORD:-${POSTGRES_PASSWORD:-typetype}} DRAGONFLY_URL: ${DRAGONFLY_URL:-redis://dragonfly:6379} GITHUB_REPO: ${GITHUB_REPO:-Priveetee/TypeType-Server} GITHUB_ISSUE_TEMPLATE: ${GITHUB_ISSUE_TEMPLATE:-bug_report_backend.md} @@ -27,7 +27,6 @@ services: YOUTUBE_REMOTE_LOGIN_CALLBACK_BASE_URL: http://typetype-server:8080 YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN: ${YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN:-} YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN_FILE: /run/typetype-secrets/youtube_remote_login_internal_token - YOUTUBE_SESSION_ENCRYPTION_KEY: ${YOUTUBE_SESSION_ENCRYPTION_KEY:-} YOUTUBE_SESSION_ENCRYPTION_KEY_FILE: /run/typetype-secrets/youtube_session_encryption_key YOUTUBE_REMOTE_LOGIN_TTL_MS: ${YOUTUBE_REMOTE_LOGIN_TTL_MS:-480000} YOUTUBE_REMOTE_LOGIN_MAX_SESSIONS: ${YOUTUBE_REMOTE_LOGIN_MAX_SESSIONS:-2} @@ -76,7 +75,7 @@ services: HTTP_PORT: "18093" PUBLIC_BASE_URL: /api/downloader TYPETYPE_API_BASE: http://typetype-server:8080 - DB_URL: postgres://typetype:typetype@postgres:5432/typetype_downloader?sslmode=disable + DB_URL: ${DB_URL:-postgres://${POSTGRES_USER:-typetype}:${POSTGRES_PASSWORD:-typetype}@postgres:5432/typetype_downloader?sslmode=disable} REDIS_HOST: dragonfly REDIS_PORT: "6379" REDIS_QUEUE_KEY: downloader:queue @@ -131,9 +130,9 @@ services: postgres: image: postgres:17 environment: - POSTGRES_DB: typetype - POSTGRES_USER: typetype - POSTGRES_PASSWORD: typetype + POSTGRES_DB: ${POSTGRES_DB:-typetype} + POSTGRES_USER: ${POSTGRES_USER:-typetype} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-typetype} volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped @@ -144,15 +143,17 @@ services: postgres: condition: service_started environment: - PGPASSWORD: typetype + POSTGRES_DB: ${POSTGRES_DB:-typetype} + POSTGRES_USER: ${POSTGRES_USER:-typetype} + PGPASSWORD: ${POSTGRES_PASSWORD:-typetype} command: - /bin/sh - -ec - | - until pg_isready -h postgres -U typetype -d typetype; do sleep 1; done - EXISTS=$$(psql -h postgres -U typetype -d typetype -tAc "SELECT 1 FROM pg_database WHERE datname='typetype_downloader'") + until pg_isready -h postgres -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"; do sleep 1; done + EXISTS=$$(psql -h postgres -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" -tAc "SELECT 1 FROM pg_database WHERE datname='typetype_downloader'") if [ "$$EXISTS" != "1" ]; then - psql -h postgres -U typetype -d typetype -c "CREATE DATABASE typetype_downloader" + psql -h postgres -U "$$POSTGRES_USER" -d "$$POSTGRES_DB" -c "CREATE DATABASE typetype_downloader" fi restart: "no" diff --git a/scripts/setup-stack.sh b/scripts/setup-stack.sh index 561772a..d43f5c0 100755 --- a/scripts/setup-stack.sh +++ b/scripts/setup-stack.sh @@ -9,9 +9,9 @@ DEFAULT_HOST_PORT_WEB="8082" DEFAULT_HOST_PORT_SERVER="8080" DEFAULT_HOST_PORT_TOKEN="8081" DEFAULT_HOST_PORT_GARAGE_S3="3900" -DEFAULT_DATABASE_URL="jdbc:postgresql://postgres:5432/typetype" -DEFAULT_DATABASE_USER="typetype" -DEFAULT_DATABASE_PASSWORD="typetype" +DEFAULT_POSTGRES_DB="typetype" +DEFAULT_POSTGRES_USER="typetype" +DEFAULT_POSTGRES_PASSWORD="typetype" DEFAULT_DRAGONFLY_URL="redis://dragonfly:6379" DEFAULT_GITHUB_REPO="Priveetee/TypeType-Server" DEFAULT_GITHUB_ISSUE_TEMPLATE="bug_report_backend.md" @@ -201,9 +201,9 @@ if [[ -f "${ENV_FILE}" ]]; then prompt_value HOST_PORT_WEB "HOST_PORT_WEB" "${DEFAULT_HOST_PORT_WEB}" prompt_value HOST_PORT_SERVER "HOST_PORT_SERVER" "${DEFAULT_HOST_PORT_SERVER}" prompt_value HOST_PORT_TOKEN "HOST_PORT_TOKEN" "${DEFAULT_HOST_PORT_TOKEN}" - prompt_value DATABASE_URL "DATABASE_URL" "${DEFAULT_DATABASE_URL}" - prompt_value DATABASE_USER "DATABASE_USER" "${DEFAULT_DATABASE_USER}" - prompt_value DATABASE_PASSWORD "DATABASE_PASSWORD" "${DEFAULT_DATABASE_PASSWORD}" + prompt_value POSTGRES_DB "POSTGRES_DB" "${DEFAULT_POSTGRES_DB}" + prompt_value POSTGRES_USER "POSTGRES_USER" "${DEFAULT_POSTGRES_USER}" + prompt_value POSTGRES_PASSWORD "POSTGRES_PASSWORD" "${DEFAULT_POSTGRES_PASSWORD}" prompt_value DRAGONFLY_URL "DRAGONFLY_URL" "${DEFAULT_DRAGONFLY_URL}" prompt_value GITHUB_REPO "GITHUB_REPO" "${DEFAULT_GITHUB_REPO}" prompt_value GITHUB_ISSUE_TEMPLATE "GITHUB_ISSUE_TEMPLATE" "${DEFAULT_GITHUB_ISSUE_TEMPLATE}" @@ -215,9 +215,9 @@ ALLOWED_ORIGINS=${ALLOWED_ORIGINS} HOST_PORT_WEB=${HOST_PORT_WEB} HOST_PORT_SERVER=${HOST_PORT_SERVER} HOST_PORT_TOKEN=${HOST_PORT_TOKEN} -DATABASE_URL=${DATABASE_URL} -DATABASE_USER=${DATABASE_USER} -DATABASE_PASSWORD=${DATABASE_PASSWORD} +POSTGRES_DB=${POSTGRES_DB} +POSTGRES_USER=${POSTGRES_USER} +POSTGRES_PASSWORD=${POSTGRES_PASSWORD} DRAGONFLY_URL=${DRAGONFLY_URL} GITHUB_REPO=${GITHUB_REPO} GITHUB_ISSUE_TEMPLATE=${GITHUB_ISSUE_TEMPLATE} @@ -231,9 +231,9 @@ else prompt_value HOST_PORT_WEB "HOST_PORT_WEB" "${DEFAULT_HOST_PORT_WEB}" prompt_value HOST_PORT_SERVER "HOST_PORT_SERVER" "${DEFAULT_HOST_PORT_SERVER}" prompt_value HOST_PORT_TOKEN "HOST_PORT_TOKEN" "${DEFAULT_HOST_PORT_TOKEN}" - prompt_value DATABASE_URL "DATABASE_URL" "${DEFAULT_DATABASE_URL}" - prompt_value DATABASE_USER "DATABASE_USER" "${DEFAULT_DATABASE_USER}" - prompt_value DATABASE_PASSWORD "DATABASE_PASSWORD" "${DEFAULT_DATABASE_PASSWORD}" + prompt_value POSTGRES_DB "POSTGRES_DB" "${DEFAULT_POSTGRES_DB}" + prompt_value POSTGRES_USER "POSTGRES_USER" "${DEFAULT_POSTGRES_USER}" + prompt_value POSTGRES_PASSWORD "POSTGRES_PASSWORD" "${DEFAULT_POSTGRES_PASSWORD}" prompt_value DRAGONFLY_URL "DRAGONFLY_URL" "${DEFAULT_DRAGONFLY_URL}" prompt_value GITHUB_REPO "GITHUB_REPO" "${DEFAULT_GITHUB_REPO}" prompt_value GITHUB_ISSUE_TEMPLATE "GITHUB_ISSUE_TEMPLATE" "${DEFAULT_GITHUB_ISSUE_TEMPLATE}" @@ -245,9 +245,9 @@ ALLOWED_ORIGINS=${ALLOWED_ORIGINS} HOST_PORT_WEB=${HOST_PORT_WEB} HOST_PORT_SERVER=${HOST_PORT_SERVER} HOST_PORT_TOKEN=${HOST_PORT_TOKEN} -DATABASE_URL=${DATABASE_URL} -DATABASE_USER=${DATABASE_USER} -DATABASE_PASSWORD=${DATABASE_PASSWORD} +POSTGRES_DB=${POSTGRES_DB} +POSTGRES_USER=${POSTGRES_USER} +POSTGRES_PASSWORD=${POSTGRES_PASSWORD} DRAGONFLY_URL=${DRAGONFLY_URL} GITHUB_REPO=${GITHUB_REPO} GITHUB_ISSUE_TEMPLATE=${GITHUB_ISSUE_TEMPLATE} From f1fb49b35b438caeefdb1f18405cfc2251339ec7 Mon Sep 17 00:00:00 2001 From: Priveetee Date: Fri, 26 Jun 2026 22:41:19 +0200 Subject: [PATCH 3/5] feat: refine subscriptions and settings UI --- apps/web/src/components/channel-avatar.tsx | 16 ++-- apps/web/src/components/history-card.tsx | 33 +++++--- apps/web/src/components/history-filter.tsx | 10 +-- .../components/subscription-channel-list.tsx | 80 ++++++++++++------- .../src/components/subscriptions-header.tsx | 50 ++++++++++++ apps/web/src/hooks/use-subscription-feed.ts | 4 +- apps/web/src/hooks/use-subscriptions.ts | 8 +- apps/web/src/lib/proxy.ts | 7 +- apps/web/src/routes/history.tsx | 2 +- apps/web/src/routes/settings.tsx | 2 +- apps/web/src/routes/subscriptions.tsx | 77 +++++++++--------- .../src/routes/subscriptions_.channels.tsx | 69 ++++++++++++++++ .../src/settings/settings-content-toggles.tsx | 10 ++- .../src/settings/settings-landing-page.tsx | 8 +- .../settings/settings-video-preferences.tsx | 4 +- 15 files changed, 274 insertions(+), 106 deletions(-) create mode 100644 apps/web/src/components/subscriptions-header.tsx create mode 100644 apps/web/src/routes/subscriptions_.channels.tsx diff --git a/apps/web/src/components/channel-avatar.tsx b/apps/web/src/components/channel-avatar.tsx index c63b18f..32072b2 100644 --- a/apps/web/src/components/channel-avatar.tsx +++ b/apps/web/src/components/channel-avatar.tsx @@ -21,16 +21,16 @@ function getInitial(name: string): string { } export function ChannelAvatar({ src, name, className = "w-8 h-8" }: Props) { - const [failed, setFailed] = useState(false); + const [failedSrc, setFailedSrc] = useState(null); + const failed = failedSrc === src; if (!src || failed) { return (
- {getInitial(name)} + {getInitial(name)}
); } @@ -38,11 +38,13 @@ export function ChannelAvatar({ src, name, className = "w-8 h-8" }: Props) { return ( setFailed(true)} + onError={() => setFailedSrc(src)} + title={name} /> ); } diff --git a/apps/web/src/components/history-card.tsx b/apps/web/src/components/history-card.tsx index 4eef8ac..e092cc8 100644 --- a/apps/web/src/components/history-card.tsx +++ b/apps/web/src/components/history-card.tsx @@ -50,21 +50,21 @@ export function HistoryCard({ item, onRemove, index }: HistoryCardProps) { return (
-
+
{item.title} @@ -93,34 +93,41 @@ export function HistoryCard({ item, onRemove, index }: HistoryCardProps) {
-
+
{item.channelUrl ? ( - - + + ) : ( - + + + )} -
+
-

{item.title}

+

+ {item.title} +

{item.channelUrl ? ( {item.channelName} ) : ( -

{item.channelName}

+

{item.channelName}

)} -

Watched {formatWatchedAt(item.watchedAt)}

+

+ Watched {formatWatchedAt(item.watchedAt)} +

diff --git a/apps/web/src/components/history-filter.tsx b/apps/web/src/components/history-filter.tsx index 4664dfb..6109c59 100644 --- a/apps/web/src/components/history-filter.tsx +++ b/apps/web/src/components/history-filter.tsx @@ -91,7 +91,7 @@ export function HistoryFilter({ }; return ( -