Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ DOWNLOADER_S3_ACCESS_KEY=SET_ME_ACCESS_KEY
DOWNLOADER_S3_SECRET_KEY=SET_ME_SECRET_KEY
GARAGE_RPC_SECRET=SET_ME_GARAGE_RPC_SECRET
YOUTUBE_REMOTE_LOGIN_ENABLED=false
YOUTUBE_OUTBOUND_PROXY_URL=
YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN=SET_ME_YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN
YOUTUBE_SESSION_ENCRYPTION_KEY=SET_ME_YOUTUBE_SESSION_ENCRYPTION_KEY
YOUTUBE_REMOTE_LOGIN_CALLBACK_ORIGIN=http://typetype-server:8080
Expand Down
34 changes: 23 additions & 11 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,19 +1,31 @@
# TypeType 1.0.4
# TypeType 1.1.0

TypeType 1.0.4 is a hotfix for YouTube SABR playback. It restores playback for
on-demand videos whose initialization segments were not returned during session
startup.
TypeType 1.1.0 adds native YouTube livestream playback over SABR, an
embeddable player, and several library and availability improvements.

## What changed

- Restore the SABR cold-start request state used to fetch audio and video
initialization segments.
- Prevent affected playback sessions from repeatedly restarting before the
browser can initialize its MediaSource buffers.
- Preserve the existing playback API, stream selection and self-hosting
configuration.
- Play YouTube livestreams through stateful SABR with live-edge following,
DVR seeking, and playback recovery.
- Add an embed route with start-time parameters, guest access control, and a
manual retry action.
- Add Watch Later directly to video menus.
- Improve imported playlist loading, ordering, duplicate handling, and deleted
video filtering.
- Show scheduled, members-only, and unavailable states on video cards, and
keep active livestreams visible in the subscription feed.
- Recover automatically when YouTube expires the player context used for SABR
admission.
- Allow the Server and Token services to share the optional
`YOUTUBE_OUTBOUND_PROXY_URL` setting.

No database migration or environment change is required.
No database migration is required. The new proxy setting is optional and
existing configurations remain valid.

## Thanks

Thanks to @tam1m for contributing the embed player, and to everyone who
reported and tested the changes in this release.

## Updating

Expand Down
2 changes: 1 addition & 1 deletion TypeType-Downloader
2 changes: 1 addition & 1 deletion TypeType-Frontend
Submodule TypeType-Frontend updated 66 files
+0 −150 Architecture.md
+74 −0 CONTRIBUTING.md
+53 −31 README.md
+2 −2 apps/web/package.json
+90 −0 apps/web/src/components/embed-error.tsx
+27 −0 apps/web/src/components/embed-guest-required.tsx
+5 −0 apps/web/src/components/embed-loading.tsx
+137 −0 apps/web/src/components/embed-player-shell.tsx
+30 −0 apps/web/src/components/embed-player.tsx
+3 −4 apps/web/src/components/player-seeker.tsx
+22 −1 apps/web/src/components/playlist-add-dropdown.tsx
+4 −2 apps/web/src/components/playlist-row.tsx
+4 −25 apps/web/src/components/playlist-video-row.tsx
+3 −2 apps/web/src/components/related-card.tsx
+2 −0 apps/web/src/components/sabr-mse-player.tsx
+2 −2 apps/web/src/components/sabr-time-slider.tsx
+7 −20 apps/web/src/components/shorts-actions.tsx
+41 −21 apps/web/src/components/stream-error.tsx
+26 −0 apps/web/src/components/video-availability-icon.tsx
+34 −0 apps/web/src/components/video-availability-poster.tsx
+21 −0 apps/web/src/components/video-block-actions-dropdown.tsx
+19 −1 apps/web/src/components/video-card-feedback-menu.tsx
+18 −8 apps/web/src/components/video-card-feedback-panel.tsx
+3 −2 apps/web/src/components/video-card.tsx
+18 −0 apps/web/src/components/video-membership-badge.tsx
+3 −1 apps/web/src/components/video-player-layout.tsx
+1 −0 apps/web/src/components/video-player-types.ts
+5 −2 apps/web/src/components/video-player.tsx
+17 −0 apps/web/src/components/watch-more-actions.tsx
+53 −0 apps/web/src/components/watch-stream-error.tsx
+9 −3 apps/web/src/hooks/use-player-error.ts
+2 −2 apps/web/src/hooks/use-session-activity-reporting.ts
+12 −4 apps/web/src/hooks/use-settings.ts
+0 −2 apps/web/src/hooks/use-stream.ts
+18 −9 apps/web/src/hooks/use-watch-later-playlist.ts
+30 −0 apps/web/src/lib/embed-access.ts
+16 −0 apps/web/src/lib/embed-playback.ts
+1 −0 apps/web/src/lib/mappers.ts
+6 −3 apps/web/src/lib/member-only.ts
+17 −0 apps/web/src/lib/parse-start-time.ts
+16 −0 apps/web/src/lib/sabr-player-seek.ts
+8 −1 apps/web/src/lib/sabr-source.ts
+2 −0 apps/web/src/lib/sabr-vidstack-bridge.ts
+62 −0 apps/web/src/lib/video-availability.ts
+7 −0 apps/web/src/lib/watch-later-labels.ts
+16 −0 apps/web/src/lib/watch-later-mappers.ts
+5 −0 apps/web/src/lib/watch-url.ts
+21 −0 apps/web/src/routeTree.gen.ts
+17 −5 apps/web/src/routes/__root.tsx
+180 −0 apps/web/src/routes/embed_.$videoId.tsx
+11 −15 apps/web/src/routes/favorites.tsx
+7 −9 apps/web/src/routes/watch-later.tsx
+25 −47 apps/web/src/routes/watch.tsx
+1 −0 apps/web/src/types/api.ts
+87 −0 apps/web/tests/embed-access.test.ts
+22 −0 apps/web/tests/embed-playback.test.ts
+94 −0 apps/web/tests/parse-start-time.test.ts
+54 −0 apps/web/tests/playlist-sort.test.ts
+8 −0 apps/web/tests/sabr-audio-selection.test.ts
+33 −1 apps/web/tests/sabr-player-seek.test.ts
+36 −0 apps/web/tests/sabr-vidstack-bridge.test.ts
+43 −0 apps/web/tests/video-availability.test.ts
+51 −0 apps/web/tests/watch-later-actions.test.ts
+9 −1 apps/web/tests/watch-url.test.ts
+3 −3 bun.lock
+1 −1 package.json
2 changes: 1 addition & 1 deletion TypeType-Server
Submodule TypeType-Server updated 123 files
2 changes: 2 additions & 0 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,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_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
Expand Down Expand Up @@ -89,6 +90,7 @@ services:
ipc: host
environment:
NODE_ENV: production
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}
Expand Down
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ services:
GITHUB_REPO: ${GITHUB_REPO:-TypeType-Video/TypeType}
GITHUB_ISSUE_TEMPLATE: ${GITHUB_ISSUE_TEMPLATE:-bug_report_backend.md}
DOWNLOADER_SERVICE_URL: http://typetype-downloader:18093
YOUTUBE_OUTBOUND_PROXY_URL: ${YOUTUBE_OUTBOUND_PROXY_URL:-}
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
Expand Down Expand Up @@ -123,6 +124,7 @@ services:
ipc: host
environment:
NODE_ENV: production
YOUTUBE_OUTBOUND_PROXY_URL: ${YOUTUBE_OUTBOUND_PROXY_URL:-}
YOUTUBE_REMOTE_LOGIN_ENABLED: ${YOUTUBE_REMOTE_LOGIN_ENABLED:-true}
YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN: ${YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN:-}
YOUTUBE_REMOTE_LOGIN_INTERNAL_TOKEN_FILE: /run/typetype-secrets/youtube_remote_login_internal_token
Expand Down