diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 218a117..0a38d01 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,7 +26,7 @@ jobs: validate-trusted: if: github.event_name != 'pull_request' - runs-on: [self-hosted, Linux, X64, arko, typetype] + runs-on: [self-hosted, Linux, X64, r730, typetype] steps: - uses: actions/checkout@v7.0.1 with: diff --git a/.github/workflows/component-image.yml b/.github/workflows/component-image.yml index a9b052e..0952fa6 100644 --- a/.github/workflows/component-image.yml +++ b/.github/workflows/component-image.yml @@ -17,7 +17,7 @@ concurrency: jobs: validate: - runs-on: [self-hosted, Linux, X64, arko, typetype] + runs-on: [self-hosted, Linux, X64, r730, typetype] outputs: channel: ${{ steps.payload.outputs.channel }} component: ${{ steps.payload.outputs.component }} @@ -100,7 +100,7 @@ jobs: deploy-beta: needs: validate if: needs.validate.outputs.channel == 'beta' - runs-on: [self-hosted, Linux, X64, arko, typetype] + runs-on: [self-hosted, Linux, X64, r730, typetype] environment: beta steps: - name: Validate deployment configuration @@ -144,6 +144,6 @@ jobs: record-stable: needs: validate if: needs.validate.outputs.channel == 'stable' - runs-on: [self-hosted, Linux, X64, arko, typetype] + runs-on: [self-hosted, Linux, X64, r730, typetype] steps: - run: echo "Stable image recorded; no deployment was started." diff --git a/Docs-TypeType b/Docs-TypeType index 4aaaa73..e8183d0 160000 --- a/Docs-TypeType +++ b/Docs-TypeType @@ -1 +1 @@ -Subproject commit 4aaaa738418f39019d06cc194d013725f951bff1 +Subproject commit e8183d0dc1227737b9c191167f9d4a3195543cf9 diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 960b01e..12f68a4 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,25 +1,100 @@ -# TypeType 1.7.3 +# TypeType 1.8.0 -TypeType 1.7.3 fixes BiliBili videos that failed during stream extraction after a metadata format change. +TypeType 1.8.0 improves playback reliability, the watch experience, +account portability, sharing and localization. ## Playback -- Update PipePipeExtractor to the BiliBili metadata fix used by TypeType-Server. -- Restore BiliBili stream extraction and preserve the available audio and video formats. -- Update TypeType-Server to `1.7.2`. [PR #83](https://github.com/TypeType-Video/TypeType-Server/pull/83) +- Recover stalled SABR segment requests instead of leaving playback stuck. +- Preserve the exact playback position across WebKit provider changes. +- Isolate WebKit seeks to prevent stale media state. +- Improve paused Firefox seeks by filling the playback buffer first. +- Synchronize compact player controls after seeking. +- Reduce playback regressions when switching or recovering media sources. +- Update TypeType-Player to MSE `0.1.59`. +- Keep BiliBili stream extraction compatible with the fixes introduced in 1.7.3. -No frontend change, configuration change or manual database migration is required. +## Floating Watch Player + +- Keep the current video visible while scrolling through the page. +- Add a draggable floating player. +- Persist the floating player position and state across navigation. +- Keep the compact player usable on mobile. +- Disable the floating player in landscape layouts where it would obstruct content. +- Keep the player stable when related videos are displayed. + +## Sharing + +- Add a compact share menu anchored to the share button. +- Show the destination name next to each share icon. +- Add direct links to the original provider. +- Normalize YouTube Shorts share links. +- Improve the share menu layout on desktop and mobile. + +## Playback Progress + +- Show playback progress directly on video cards. +- Add batch progress lookup for faster history and recommendation loading. +- Keep progress updates non-blocking during playback. + +## Volume Controls + +- Support mouse-wheel volume changes on every player layout. +- Prevent the page from scrolling when the wheel is used over the volume slider. +- Keep volume controls usable in the compact and floating players. + +## Localization + +- Add the German interface locale. +- Add the German translation catalog. +- Improve layout behavior for longer translated labels. +- Make video settings responsive to the active locale. +- Continue rejecting untranslated frontend messages during validation. + +## Account Portability + +- Support large YouTube Takeout archives. +- Add ZIP64 archive reading for large imports. +- Return a typed error when an upload is too large. +- Preserve bounded import processing and progress reporting. + +## YouTube Login + +- Fix remote YouTube login completion after passkey or 2FA. +- Stabilize remote YouTube input handling. +- Improve diagnostics for failed remote-login sessions. + +## Server Reliability + +- Isolate the Server SABR contract behind explicit adapter boundaries. +- Expand SABR contract and playback recovery tests. +- Preserve bounded retries, playback generations and session isolation. + +No configuration change or manual database migration is required for this release. ## Thx -Thx to everyone who reported BiliBili playback failures and shared detailed diagnostics. +Thx to @whiskeredtux and @tigershark482 for the detailed buffering, +seek and playback reports that helped improve SABR recovery. [#248](https://github.com/TypeType-Video/TypeType/issues/248) -A special thx to sponsors [@Toastienergy](https://github.com/Toastienergy) and [@filippobaroni](https://github.com/filippobaroni) for supporting TypeType. +Thx to @kinouzero for reporting remote YouTube login failures around +passkey and 2FA, and for testing the login fixes. [#250](https://github.com/TypeType-Video/TypeType/issues/250) + +Thx to @Toastienergy for contributing the German translation and helping +test the localized interface, compact player and playback experience. + +Thx to @surasuku235 for reporting the BiliBili extraction regression +addressed in the previous release. [#262](https://github.com/TypeType-Video/TypeType/issues/262) + +A special thx to sponsors [@Toastienergy](https://github.com/Toastienergy) +and [@filippobaroni](https://github.com/filippobaroni) for supporting +TypeType. + +Thx as well to everyone testing the beta, sharing playback logs, testing +mobile layouts, reviewing translations and helping other self-hosters. ## Updating Follow the [update guide](https://typetype-video.github.io/Docs-TypeType/self-hosting/maintenance). If necessary, follow the [rollback guide](https://typetype-video.github.io/Docs-TypeType/self-hosting/rollback). - -If u want to support TypeType, please share it with others. If u want to support it financially, u can do so through [GitHub Sponsors](https://github.com/sponsors/Priveetee). diff --git a/TypeType-Downloader b/TypeType-Downloader index 05a038d..a79d46a 160000 --- a/TypeType-Downloader +++ b/TypeType-Downloader @@ -1 +1 @@ -Subproject commit 05a038dfe1d7c58624da7a5abb525ed030b15b34 +Subproject commit a79d46a5d7371d6a7cc6fdef618158e6afeca504 diff --git a/TypeType-Frontend b/TypeType-Frontend index e02340a..75014fd 160000 --- a/TypeType-Frontend +++ b/TypeType-Frontend @@ -1 +1 @@ -Subproject commit e02340a86762100049f1745142fc0db5de426f6d +Subproject commit 75014fd767eafacb2cacca59d4a7181c585adbde diff --git a/TypeType-Player b/TypeType-Player index 0c123ee..6d6c983 160000 --- a/TypeType-Player +++ b/TypeType-Player @@ -1 +1 @@ -Subproject commit 0c123ee0702d01a011574836a9777f53070a8c95 +Subproject commit 6d6c983afed1b08fc03196ac13546a30272fcd52 diff --git a/TypeType-Server b/TypeType-Server index 3bbda24..e28953d 160000 --- a/TypeType-Server +++ b/TypeType-Server @@ -1 +1 @@ -Subproject commit 3bbda2452eec7640342556e7630c5b086103f3f8 +Subproject commit e28953da4550b8c35582df704ce6d87ca0fc89d8 diff --git a/TypeType-Token b/TypeType-Token index 888e91d..bbe01b9 160000 --- a/TypeType-Token +++ b/TypeType-Token @@ -1 +1 @@ -Subproject commit 888e91d1c26bd7bdeebb6eef01909358ae437e34 +Subproject commit bbe01b95030f3c22dce035cffcebf9dff83387b8 diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 8bed84d..5b0fe25 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -26,7 +26,7 @@ services: DATABASE_PASSWORD: ${DATABASE_PASSWORD:-${POSTGRES_PASSWORD:-typetype}} DRAGONFLY_URL: ${DRAGONFLY_URL:-redis://dragonfly:6379} DOWNLOADER_SERVICE_URL: http://typetype-downloader:18093 - YOUTUBE_OUTBOUND_PROXY_URL: ${YOUTUBE_OUTBOUND_PROXY_URL:?YOUTUBE_OUTBOUND_PROXY_URL is required} + YOUTUBE_OUTBOUND_PROXY_URL: ${YOUTUBE_OUTBOUND_PROXY_URL:-} 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 @@ -95,7 +95,7 @@ services: ipc: host environment: NODE_ENV: production - YOUTUBE_OUTBOUND_PROXY_URL: ${YOUTUBE_OUTBOUND_PROXY_URL:?YOUTUBE_OUTBOUND_PROXY_URL is required} + YOUTUBE_OUTBOUND_PROXY_URL: ${YOUTUBE_OUTBOUND_PROXY_URL:-} YOUTUBE_REMOTE_LOGIN_ENABLED: ${YOUTUBE_REMOTE_LOGIN_ENABLED:-false} YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN: ${YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN:-} YOUTUBE_REMOTE_LOGIN_CALLBACK_ORIGIN: ${YOUTUBE_REMOTE_LOGIN_CALLBACK_ORIGIN:-http://typetype-server:8080} diff --git a/scripts/check-youtube-egress.sh b/scripts/check-youtube-egress.sh index 86569e3..2963599 100755 --- a/scripts/check-youtube-egress.sh +++ b/scripts/check-youtube-egress.sh @@ -2,7 +2,7 @@ set -euo pipefail project="${1:?Compose project is required}" -proxy_url="${2:?YouTube outbound proxy URL is required}" +proxy_url="${2-}" anchor=$(docker ps -q \ --filter "label=com.docker.compose.project=${project}" | head -n 1) if [[ -z "$anchor" ]]; then diff --git a/scripts/deploy-beta.sh b/scripts/deploy-beta.sh index d0eb761..efabe5a 100755 --- a/scripts/deploy-beta.sh +++ b/scripts/deploy-beta.sh @@ -103,12 +103,11 @@ services=( garage ) -docker compose --project-directory "$root" --env-file "$root/.env" \ +proxy_url=$(awk -F= '$1 == "YOUTUBE_OUTBOUND_PROXY_URL" { value = substr($0, index($0, "=") + 1) } END { print value }' "$root/.env") +YOUTUBE_OUTBOUND_PROXY_URL="$proxy_url" docker compose \ + --project-directory "$root" --env-file "$root/.env" \ -f "$source_root/docker-compose.dev.yml" config -q if [[ "$component" == all ]]; then - proxy_url=$(docker compose --project-directory "$root" --env-file "$root/.env" \ - -f "$source_root/docker-compose.dev.yml" config --environment \ - | sed -n 's/^YOUTUBE_OUTBOUND_PROXY_URL=//p') "$source_root/scripts/check-youtube-egress.sh" "$project" "$proxy_url" fi rollback_root="$root/.deploy-rollbacks" @@ -177,6 +176,11 @@ finish() { } trap finish EXIT +set_env_value "YOUTUBE_OUTBOUND_PROXY_URL" "$proxy_url" +if [[ "$component" == token || "$component" == server || "$component" == all ]]; then + set_env_value "YOUTUBE_REMOTE_LOGIN_ENABLED" "true" +fi + prune_unused_typetype_images install -m 644 "$source_root/.env.example" "$root/.env.example" diff --git a/scripts/deploy-beta.test.sh b/scripts/deploy-beta.test.sh index 21c7ae4..75eca5c 100755 --- a/scripts/deploy-beta.test.sh +++ b/scripts/deploy-beta.test.sh @@ -103,6 +103,8 @@ if ! grep -Fq "TYPETYPE_SERVER_BETA_IMAGE=ghcr.io/typetype-video/typetype-server sed -n '/^TYPETYPE_.*_IMAGE=/p' "$stack/.env" >&2 exit 1 fi +grep -Fxq 'YOUTUBE_OUTBOUND_PROXY_URL=' "$stack/.env" +grep -Fxq 'YOUTUBE_REMOTE_LOGIN_ENABLED=true' "$stack/.env" if ! grep -Fq 'pull typetype-server' "$FAKE_DOCKER_LOG"; then echo "the server rollout did not pull only the server image" >&2 cat "$FAKE_DOCKER_LOG" >&2 diff --git a/scripts/validate-stack.sh b/scripts/validate-stack.sh index 58ca3db..85dd5be 100755 --- a/scripts/validate-stack.sh +++ b/scripts/validate-stack.sh @@ -24,10 +24,7 @@ done docker compose --env-file .env.example -f docker-compose.yml config -q docker compose --env-file .env.example -f docker-compose.yml -f docker-compose.arm64.yml config -q -if docker compose --env-file .env.example -f docker-compose.dev.yml config -q 2>/dev/null; then - echo "beta Compose must reject a missing outbound proxy" >&2 - exit 1 -fi +docker compose --env-file .env.example -f docker-compose.dev.yml config -q YOUTUBE_OUTBOUND_PROXY_URL=http://127.0.0.1:29083 \ docker compose --env-file .env.example -f docker-compose.dev.yml config -q @@ -50,8 +47,8 @@ if grep -q 'youtube-egress-relay' <<<"$dev_config"; then echo "beta Compose must use the externally validated egress proxy" >&2 exit 1 fi -if [[ $(grep -c 'YOUTUBE_OUTBOUND_PROXY_URL: http://127.0.0.1:29083' <<<"$dev_config") -ne 2 ]]; then - echo "beta Server and Token must share the configured outbound proxy" >&2 +if [[ $(grep -c 'YOUTUBE_OUTBOUND_PROXY_URL:' <<<"$dev_config") -ne 2 ]]; then + echo "beta Server and Token must expose the shared outbound proxy setting" >&2 exit 1 fi for config in "$stable_config" "$dev_config"; do