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
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,21 @@ The installer creates `~/typetype-stack`, generates installation-specific secret
- SponsorBlock, DeArrow, content blocking, imports, OIDC, and instance administration
- No TypeType telemetry; the instance operator controls the deployment and its data

## Thanks to sponsors

<p>
<a href="https://github.com/Toastienergy" title="@Toastienergy"><img src="https://github.com/Toastienergy.png?size=128" alt="@Toastienergy" width="64" height="64"></a>
<a href="https://github.com/filippobaroni" title="@filippobaroni"><img src="https://github.com/filippobaroni.png?size=128" alt="@filippobaroni" width="64" height="64"></a>
</p>

A big thx to [@Toastienergy](https://github.com/Toastienergy) and
[@filippobaroni](https://github.com/filippobaroni) for supporting TypeType through
GitHub Sponsors. Their support helps me cover the infrastructure and spend more
time improving the project.

If u want to support TypeType financially, u can do so through
[GitHub Sponsors](https://github.com/sponsors/Priveetee).

## For developers

Each component has its own repository, tests, release cycle, and license. Pull requests belong in the repository that owns the changed code. Bug reports and feature requests stay in the central issue tracker.
Expand Down
150 changes: 73 additions & 77 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,88 +1,84 @@
# TypeType 1.4.0

TypeType 1.4.0 adds richer search filters, consistent content blocking,
server-delivered YouTube subtitles, configurable account sessions, and several
playback, import and self-hosting fixes.

## Search And Content Controls

- Add grouped YouTube search filters for upload date, content type, duration
and sorting. [#187](https://github.com/TypeType-Video/TypeType/issues/187)
- Hide blocked channels and videos consistently across search, autoplay, watch
pages, embeds, playlists, history, subscriptions and recommendations.
[#193](https://github.com/TypeType-Video/TypeType/issues/193)
- Normalize channel and video identities so alternate YouTube URL formats
cannot bypass blocked-content rules.

## Subtitles And Playback

- Load YouTube subtitles through TypeType-Server instead of requiring the web
client to contact YouTube directly.
- Cache subtitle content and preserve manual, automatic and translated subtitle
tracks.
- Return typed rate-limit errors when YouTube rejects subtitle retrieval.
- Preload adaptive SABR initialization ranges to prevent startup failures when
an initialization segment is not returned immediately.
[#204](https://github.com/TypeType-Video/TypeType/issues/204)
- Restore saved playback positions only after the SABR session has completed
its initial bootstrap.
- Route chapter selection through SABR so selecting a chapter seeks correctly
again. [#202](https://github.com/TypeType-Video/TypeType/issues/202)
- Center captions correctly in the web player.
[#201](https://github.com/TypeType-Video/TypeType/issues/201)
- Update PipePipeExtractor and align TypeType with the current YouTube client
profiles.

## Accounts And Administration

- Add `AUTH_SESSION_TTL_DAYS` to configure account session lifetime from 1 to
365 days, with a default of 30 days.
[#203](https://github.com/TypeType-Video/TypeType/issues/203)
- Preserve active browser sessions during temporary refresh failures instead
of immediately redirecting to login.
- Keep generated password reset tokens visible and copyable when browser
clipboard access is unavailable.
[#198](https://github.com/TypeType-Video/TypeType/issues/198)
- Keep admin user avatars stable when an account identity is edited.
[#199](https://github.com/TypeType-Video/TypeType/issues/199)

## Imports And Performance

- Skip deleted and unavailable videos when importing YouTube Takeout playlists.
[#135](https://github.com/TypeType-Video/TypeType/issues/135)
- Bound concurrent SABR download parts to reduce memory and connection pressure
during large downloads.
- Keep Server and Token YouTube traffic on the configured proxy instead of
silently switching to a different egress.
# TypeType 1.5.0

TypeType 1.5.0 adds private RSS feeds, new-upload notifications and better
control over live content. It also closes a security issue in the public media
proxy and improves SABR playback during resumes and long-distance seeks.

## RSS And Notifications

- Add private RSS feeds for all subscriptions or a selected set of channels.
- Filter feeds by service and content type, with direct shortcuts from channel
pages.
- Regenerate, disable or delete feed links without affecting subscriptions.
- Show compact in-app notifications when subscribed channels publish new
videos. [#211](https://github.com/TypeType-Video/TypeType/issues/211)
- Give instance administrators control over RSS availability, public base URL,
account limits, polling intervals and request rate limits.

RSS access is private to each account. Feed tokens can be revoked at any time
and do not expose the account session itself.

## Subscriptions

- Add account settings to hide live streams, upcoming streams or both from the
subscription feed. [#213](https://github.com/TypeType-Video/TypeType/issues/213)
- Remove stale live entries after they stop being available from the provider.
- Normalize channel tab URLs before fetching and caching subscription pages.

## Playback

- Restore saved playback positions reliably in Safari after SABR preparation.
- Preserve the requested position while a SABR session is being prepared or
recovered.
- Seek directly to distant positions before decoder preroll instead of replaying
unnecessary media.
- Preserve play and pause intent through seeks and quality changes.
- Update the web player to `@typetype/mse` 0.1.44.

## Security

- Restrict the public media proxy to supported provider hosts and approved
media paths.
- Block private, loopback and local-network destinations, including redirect
and DNS resolution checks.
- Keep cross-provider redirects outside the proxy allowlist.
- Report YouTube remote-login readiness accurately instead of exposing an
unusable login flow.
- Update application and build dependencies across the released services.

## Self-Hosting

- Fix the installation script attempting to download the removed
`youtube-egress-relay.mjs` file.
[#197](https://github.com/TypeType-Video/TypeType/issues/197)
- Add account session lifetime configuration to the Compose stack and
environment template.
- Validate the new session configuration during stack checks.
No manual database migration is required.

RSS is disabled by default. Instance administrators can enable it and configure
the public feed base URL from the documented environment settings.

No database migration is required. `AUTH_SESSION_TTL_DAYS` is optional and
defaults to `30`.
The account session lifetime and insecure-cookie development settings are now
documented in English, French and Spanish.

When a YouTube proxy is configured, it must remain reachable because Server and
Token will no longer silently bypass it.
## Known Limitations

- YouTube may still throttle subtitle retrieval with HTTP 429 on some egress
addresses. [#210](https://github.com/TypeType-Video/TypeType/issues/210)
- Native SABR playback on ARM64 remains under investigation.
[#204](https://github.com/TypeType-Video/TypeType/issues/204)

## Thx

- A big thx to @LuckeeSoft for proposing the new search filters.
- Thx to @Toni-Vide for the detailed reports about blocked content, password
reset tokens and admin avatars.
- Thx to @Slashic for reporting the session, chapter selection and caption
alignment problems.
- Thx to @Role92 for the precise SABR initialization logs.
- Thx to @Willie169 for catching the broken self-hosted installation path.
- Thx to @lelam183 for repeatedly testing YouTube Takeout imports and helping
identify the remaining unavailable-video case.
- Thx as well to everyone testing subtitles and playback on beta, sharing logs,
and helping improve the self-hosting setup.
- A big thx to @LuckeeSoft for the RSS and notification ideas and for the
detailed feedback while the feature was taking shape.
- Thx to @CCGcastiel for proposing granular live-content controls for the
subscription feed.
- Thx to @Buage for privately and responsibly reporting the public proxy issue
before disclosure. [#212](https://github.com/TypeType-Video/TypeType/issues/212)
- Thx to @VitoItalianGamer for the detailed browser playback reports and the
time spent reproducing intermittent buffering behavior.
- A big thx to [@Toastienergy](https://github.com/Toastienergy) and
[@filippobaroni](https://github.com/filippobaroni) for supporting TypeType
through GitHub Sponsors. Their support helps me cover the infrastructure and
spend more time improving the project.
- Thx as well to everyone testing beta, sharing logs and helping other
self-hosters.

## Updating

Expand Down
2 changes: 1 addition & 1 deletion TypeType-Downloader
Submodule TypeType-Downloader updated 3 files
+1 −1 VERSION
+1 −1 go.mod
+2 −2 go.sum
2 changes: 1 addition & 1 deletion TypeType-Frontend
Submodule TypeType-Frontend updated 57 files
+2 −2 apps/web/package.json
+2 −0 apps/web/src/components/admin-console-header.tsx
+1 −1 apps/web/src/components/admin-console-nav.tsx
+157 −0 apps/web/src/components/admin-rss-inventory.tsx
+110 −0 apps/web/src/components/admin-rss-policy.tsx
+151 −0 apps/web/src/components/admin-rss-section.tsx
+4 −2 apps/web/src/components/channel-page-header.tsx
+6 −2 apps/web/src/components/media-progress-events.tsx
+14 −3 apps/web/src/components/navbar-notifications.tsx
+116 −0 apps/web/src/components/notification-toast-host.tsx
+96 −0 apps/web/src/components/notification-toast.tsx
+12 −5 apps/web/src/components/notifications-dropdown.tsx
+26 −0 apps/web/src/components/rss-shortcut.tsx
+1 −0 apps/web/src/components/sabr-mse-player.tsx
+3 −1 apps/web/src/components/subscriptions-header.tsx
+31 −0 apps/web/src/hooks/use-admin-rss.ts
+1 −0 apps/web/src/hooks/use-blocked-filter.ts
+3 −3 apps/web/src/hooks/use-notifications.ts
+32 −0 apps/web/src/hooks/use-rss-feeds.ts
+4 −0 apps/web/src/hooks/use-settings.ts
+3 −1 apps/web/src/hooks/use-subscription-feed.ts
+2 −1 apps/web/src/lib/admin-console-section.ts
+6 −0 apps/web/src/lib/api-admin.ts
+33 −3 apps/web/src/lib/api-instance.ts
+86 −0 apps/web/src/lib/api-rss.ts
+65 −0 apps/web/src/lib/notification-toast-cursor.ts
+15 −0 apps/web/src/lib/rss-feed-request.ts
+5 −0 apps/web/src/lib/sabr-vidstack-bridge.ts
+9 −0 apps/web/src/lib/sabr-vidstack-provider.ts
+2 −0 apps/web/src/lib/settings-section.ts
+5 −0 apps/web/src/lib/shorts-route.ts
+21 −0 apps/web/src/routeTree.gen.ts
+6 −1 apps/web/src/routes/admin-console.tsx
+48 −15 apps/web/src/routes/settings.tsx
+10 −0 apps/web/src/routes/shorts_.$videoId.tsx
+1 −0 apps/web/src/settings/hide-everything-toggle.tsx
+188 −0 apps/web/src/settings/rss-feed-editor-fields.tsx
+136 −0 apps/web/src/settings/rss-feed-editor-modal.tsx
+117 −0 apps/web/src/settings/rss-feed-row.tsx
+75 −0 apps/web/src/settings/rss-secret-modal.tsx
+8 −0 apps/web/src/settings/settings-content-toggles.tsx
+212 −0 apps/web/src/settings/settings-rss.tsx
+9 −0 apps/web/src/stores/ui-store.ts
+41 −0 apps/web/src/styles/notification-toast.css
+6 −0 apps/web/src/types/admin.ts
+49 −0 apps/web/src/types/rss.ts
+1 −0 apps/web/src/types/user.ts
+88 −0 apps/web/tests/notification-toast-cursor.test.ts
+53 −0 apps/web/tests/rss-capability.test.ts
+27 −0 apps/web/tests/rss-feed-request.test.ts
+19 −0 apps/web/tests/sabr-vidstack-bridge.test.ts
+68 −3 apps/web/tests/sabr-vidstack-provider.test.ts
+6 −0 apps/web/tests/shorts-route.test.ts
+1 −1 biome.json
+40 −40 bun.lock
+24 −0 nginx.conf
+4 −4 package.json
2 changes: 1 addition & 1 deletion TypeType-Server
Submodule TypeType-Server updated 78 files
+6 −0 CONTRIBUTING.md
+9 −4 build.gradle.kts
+1 −1 gradle.properties
+1 −1 gradle/wrapper/gradle-wrapper.properties
+14 −0 openapi.yaml
+7 −0 openapi/components/access-control.yaml
+13 −1 openapi/components/instance.yaml
+67 −0 openapi/components/rss.yaml
+4 −2 openapi/paths/proxy.yaml
+69 −0 openapi/paths/rss-admin.yaml
+121 −0 openapi/paths/rss.yaml
+8 −2 settings.gradle.kts
+4 −0 src/main/kotlin/dev/typetype/server/ApplicationRoutes.kt
+11 −0 src/main/kotlin/dev/typetype/server/ServiceRegistry.kt
+14 −0 src/main/kotlin/dev/typetype/server/db/DatabaseFactory.kt
+1 −0 src/main/kotlin/dev/typetype/server/db/SettingsSchemaMigrations.kt
+6 −0 src/main/kotlin/dev/typetype/server/db/tables/AdminSettingsTable.kt
+9 −0 src/main/kotlin/dev/typetype/server/db/tables/RssFeedChannelsTable.kt
+9 −0 src/main/kotlin/dev/typetype/server/db/tables/RssFeedServicesTable.kt
+26 −0 src/main/kotlin/dev/typetype/server/db/tables/RssFeedsTable.kt
+10 −0 src/main/kotlin/dev/typetype/server/db/tables/RssUserPoliciesTable.kt
+1 −0 src/main/kotlin/dev/typetype/server/db/tables/SettingsTable.kt
+6 −0 src/main/kotlin/dev/typetype/server/models/AdminSettingsItem.kt
+10 −0 src/main/kotlin/dev/typetype/server/models/InstanceResponse.kt
+59 −0 src/main/kotlin/dev/typetype/server/models/RssFeedModels.kt
+1 −0 src/main/kotlin/dev/typetype/server/models/SettingsItem.kt
+76 −0 src/main/kotlin/dev/typetype/server/routes/AdminRssRoutes.kt
+141 −0 src/main/kotlin/dev/typetype/server/routes/RssFeedRoutes.kt
+8 −2 src/main/kotlin/dev/typetype/server/routes/SubscriptionFeedRoutes.kt
+2 −1 src/main/kotlin/dev/typetype/server/routes/UserDataRoutes.kt
+54 −8 src/main/kotlin/dev/typetype/server/services/AdminSettingsService.kt
+21 −0 src/main/kotlin/dev/typetype/server/services/AllowedChannelsService.kt
+5 −3 src/main/kotlin/dev/typetype/server/services/BilibiliRangeProxy.kt
+3 −2 src/main/kotlin/dev/typetype/server/services/HlsManifestService.kt
+3 −1 src/main/kotlin/dev/typetype/server/services/HomeRecommendationPoolBuilder.kt
+1 −1 src/main/kotlin/dev/typetype/server/services/HomeRecommendationPoolCache.kt
+8 −0 src/main/kotlin/dev/typetype/server/services/InstanceService.kt
+7 −5 src/main/kotlin/dev/typetype/server/services/NicoVideoProxyService.kt
+6 −3 src/main/kotlin/dev/typetype/server/services/OkHttpProxyService.kt
+89 −0 src/main/kotlin/dev/typetype/server/services/ProxyHttpExecutor.kt
+67 −0 src/main/kotlin/dev/typetype/server/services/RssDocumentRenderer.kt
+46 −0 src/main/kotlin/dev/typetype/server/services/RssFeedAdminRepository.kt
+135 −0 src/main/kotlin/dev/typetype/server/services/RssFeedManagementService.kt
+60 −0 src/main/kotlin/dev/typetype/server/services/RssFeedReaderService.kt
+178 −0 src/main/kotlin/dev/typetype/server/services/RssFeedRepository.kt
+31 −0 src/main/kotlin/dev/typetype/server/services/RssFeedRowMapper.kt
+23 −0 src/main/kotlin/dev/typetype/server/services/RssFeedSecret.kt
+23 −0 src/main/kotlin/dev/typetype/server/services/RssFeedSelections.kt
+29 −0 src/main/kotlin/dev/typetype/server/services/RssFeedThrottle.kt
+20 −0 src/main/kotlin/dev/typetype/server/services/RssVideoMetadata.kt
+13 −0 src/main/kotlin/dev/typetype/server/services/RssVideoTypeFilter.kt
+2 −0 src/main/kotlin/dev/typetype/server/services/SettingsPersistenceMappers.kt
+5 −0 src/main/kotlin/dev/typetype/server/services/SettingsService.kt
+9 −2 src/main/kotlin/dev/typetype/server/services/SubscriptionFeedBuilder.kt
+10 −1 src/main/kotlin/dev/typetype/server/services/SubscriptionFeedService.kt
+16 −8 src/main/kotlin/dev/typetype/server/services/SubscriptionFeedSnapshot.kt
+101 −31 src/main/kotlin/dev/typetype/server/services/UrlValidator.kt
+8 −0 src/main/kotlin/dev/typetype/server/services/VideoItemSchedule.kt
+18 −2 src/main/kotlin/dev/typetype/server/services/YoutubeRemoteLoginReadinessService.kt
+150 −0 src/test/kotlin/dev/typetype/server/AdminRssRoutesTest.kt
+23 −0 src/test/kotlin/dev/typetype/server/AdminSettingsDefaultsTest.kt
+6 −2 src/test/kotlin/dev/typetype/server/BilibiliRangeProxyTest.kt
+19 −12 src/test/kotlin/dev/typetype/server/HlsManifestServiceCacheTest.kt
+16 −0 src/test/kotlin/dev/typetype/server/HomeRecommendationPoolBuilderTest.kt
+15 −0 src/test/kotlin/dev/typetype/server/InstanceRoutesTest.kt
+66 −0 src/test/kotlin/dev/typetype/server/OkHttpProxyServiceSecurityTest.kt
+167 −0 src/test/kotlin/dev/typetype/server/ProxyHttpExecutorTest.kt
+155 −0 src/test/kotlin/dev/typetype/server/RssFeedManagementServiceTest.kt
+221 −0 src/test/kotlin/dev/typetype/server/RssFeedReaderRoutesTest.kt
+23 −0 src/test/kotlin/dev/typetype/server/RssFeedSecretTest.kt
+118 −0 src/test/kotlin/dev/typetype/server/RssVideoTypeFilterTest.kt
+3 −1 src/test/kotlin/dev/typetype/server/SettingsPrivacyControlsRoutesTest.kt
+131 −0 src/test/kotlin/dev/typetype/server/SubscriptionFeedLiveVisibilityRoutesTest.kt
+16 −0 src/test/kotlin/dev/typetype/server/SubscriptionFeedRoutesTest.kt
+8 −0 src/test/kotlin/dev/typetype/server/TestDatabase.kt
+69 −12 src/test/kotlin/dev/typetype/server/UrlValidatorTest.kt
+30 −5 src/test/kotlin/dev/typetype/server/YoutubeRemoteLoginReadinessServiceTest.kt
+1 −0 src/test/kotlin/dev/typetype/server/services/BlockedContentProfileTest.kt