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
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ All notable changes to YT re:Watch will be documented in this file.
unavailable or malformed responses.
- Added the installed extension version beside the YT re:Watch identity in the
popup and full-page feed, using the extension icon consistently in both.
- Unified extension announcements into one branded re:Watch toast. The
first-use welcome and AI-label notices now share dismissal protection,
dark-mode styling, a single queue, and the re:Watch icon. The welcome action
opens the browser's normal extension popup.

### Changed

Expand All @@ -29,6 +33,9 @@ All notable changes to YT re:Watch will be documented in this file.
rescans for actual overlay-presentation changes.
- Routed background, storage, and AI-label informational traces through the
saved debug setting while keeping warnings and errors visible.
- The full-page sidebar now starts expanded. **Reload videos** scans followed
channels for new uploads, while the adjacent **Refresh** button only redraws
the current local view.

### Fixed

Expand All @@ -39,6 +46,9 @@ All notable changes to YT re:Watch will be documented in this file.
in the selected order before the view scrolls to the newly available records.
- Treat removed, private, or otherwise incomplete YouTube AI-label responses as
indeterminate instead of caching them as valid unlabeled results.
- Fixed **System default** appearance in Firefox so the extension popup follows
the full-page re:Watch theme instead of resolving a different browser surface
independently.

### Privacy and reliability

Expand Down
Binary file modified docs/assets/guide/feed-analytics.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/feed-channels.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/feed-history.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/feed-home.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/feed-playlists.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/feed-settings.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/feed-shorts.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/feed-subscriptions.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/feed-watch-later.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/guide/popup-continue-watching.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,18 @@
content pulse or render repeatedly after a YouTube tab had been open longer.
- Added the installed extension version and consistent re:Watch icon branding
to both the popup and full-page feed.
- Unified the first-use welcome and AI-label notices into one branded re:Watch
toast with dark-mode styling, one-at-a-time protection, and a normal browser
action-popup handoff.
- Refined full-page headers to avoid duplicate nearby titles when the sidebar is
expanded, while keeping the current view title visible in collapsed mode.
- The full-page sidebar now starts expanded. **Reload videos** scans followed
channels, while the adjacent **Refresh** button redraws only the local view.
- Reduced redundant overlay and thumbnail work by targeting changed video IDs,
coalescing startup scans, and limiting focus rescans to presentation changes.
- Made background, storage, and AI-label informational output respect debug mode.
- Fixed Firefox **System default** appearance so the compact popup and full-page
re:Watch view use the same theme.
- Treats removed or incomplete AI-label responses as indeterminate and uses
bounded live Chrome/Firefox canary fallbacks when an external fixture changes.

Expand Down
9 changes: 5 additions & 4 deletions docs/code-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ These files run directly on YouTube pages through the manifest `content_scripts`
rest of the extension.
- `local-subscription-actions.js`: centralizes canonical local Follow/Unfollow
behavior and bounded `@handle` resolution.
- `content-css.js`: injects shared content-script CSS for playlist history controls, the active-info popup, and thumbnail viewed/progress overlays.
- `content-css.js`: injects shared content-script CSS for playlist history controls and thumbnail viewed/progress overlays.
- `content-url.js`: extracts YouTube video IDs and handles clean/timestamped YouTube URLs.
- `content-import.js`: shows the in-page import overlay when YouTube opens with `#ytlh_import`.
- `content-playlists.js`: reads playlist metadata from YouTube pages, saves playlist records, and adds the per-playlist History active/paused control. On playlist pages it creates a separate row below native actions and ignores hidden legacy headers; on playlist-backed watch pages it uses the playlist panel.
- `content-info.js`: shows the one-time YT re:Watch active info popup.
- `content-announcement.js`: renders the shared branded first-use and feature-announcement toast on YouTube pages. It acknowledges notices in YouTube local storage while the background worker keeps one notice active across tabs.
- `content-thumbnails.js`: adds viewed/progress overlays to extension-feed thumbnails and best-effort viewed labels on supported YouTube thumbnail layouts. YouTube page markup changes often, so native YouTube overlays are intentionally conservative.
- `content-messages.js`: handles popup/import messages sent to the YouTube tab.
- `content.js`: remaining bootstrap and video tracking logic. It wires the helpers together, tracks video elements, saves/restores timestamps, detects SPA navigation, and registers listeners.
Expand Down Expand Up @@ -60,8 +60,9 @@ Files named `popup*.js` power the browser action popup:
Files named `feed*.js` power the extension feed page:

- `feed.js`: top-level page wiring and page-active scheduler coordination.
- `feed-refresh.js`: reloads canonical projections and owns manual Check/Reload
status and notice behavior.
- `feed-refresh.js`: reloads canonical projections and owns manual **Reload
videos** (network scan) and **Refresh** (local redraw) status and notice
behavior.
- `feed-contracts.js`, `rss-parser.js`, `rss-client.js`, and
`feed-ingestion.js`: normalize public channel RSS and idempotently upsert the
canonical feed inventory and per-channel sync state.
Expand Down
8 changes: 4 additions & 4 deletions docs/detailed_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ YT re:Watch records YouTube history and progress in the current browser profile.
2. Select **Add to Firefox**, then confirm the requested permissions.
3. Pin the re:Watch button if desired.

Visit YouTube and play a video normally. re:Watch begins saving after meaningful playback, then updates the position as you continue. The record is separate from YouTube's account history.
Visit YouTube and play a video normally. re:Watch begins saving after meaningful playback, then updates the position as you continue. The record is separate from YouTube's account history. On first use, a re:Watch welcome notice can open the same compact popup as the toolbar button.

## Interface overview

Expand Down Expand Up @@ -64,10 +64,10 @@ Subscriptions is the complete inventory of regular cached uploads. Choose
upload-date or detection-date ordering; the selection remains active through
**Reload** and **Show**. The view also uses stable 50-card pages.

### Check, Reload, and Show
### Reload videos, Refresh, and Show

- **Check** scans eligible followed channels and updates cached feed records. The status beside it reports progress, scheduling, and outcomes.
- **Reload** renders current local storage again without starting a feed request.
- **Reload videos** scans eligible followed channels and updates cached feed records. The status beside it reports progress, scheduling, and outcomes.
- **Refresh** renders current local storage again without starting a feed request.
- **Show** reloads the complete Subscriptions inventory after a scan or subscription-import handoff and retains its selected ordering.

The interface renders cached data before initialization work completes, so an existing feed remains usable during a scan.
Expand Down
9 changes: 6 additions & 3 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,17 @@ non-AI. [Learn how it works and what it sends to YouTube](ai-labeled-videos.md).
2. Watch a video. re:Watch records meaningful playback and updates the local resume point.
3. Follow channels from supported YouTube surfaces, add them in **Channels**, or import a subscriptions file in **Settings**.

Click the extension button for quick actions. Open the full re:Watch page for Home, Subscriptions, Shorts, Watch Later, playlists, History, Channels, Analytics, and Settings.
Click the extension button for quick actions. On first use, the welcome notice
can open that same browser popup for you. Open the full re:Watch page for Home,
Subscriptions, Shorts, Watch Later, playlists, History, Channels, Analytics,
and Settings.

## Feed refresh controls

The feed renders cached local records first.

- **Check** scans eligible followed channels and updates cached feed records.
- **Reload** rebuilds the visible view from local storage without starting a network scan.
- **Reload videos** scans eligible followed channels and updates cached feed records.
- **Refresh** rebuilds the visible view from local storage without starting a network scan.
- **Show** reloads the complete subscription inventory after a scan or import handoff while preserving the selected upload-date or detection-date order.

Public YouTube RSS feeds provide new uploads. re:Watch does not use OAuth, mutate the user's YouTube subscriptions, or perform remote search.
Expand Down
3 changes: 2 additions & 1 deletion src/_locales/bg/feed.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"feed_menu": { "message": "Меню" },
"feed_back_to_feed": { "message": "Назад към емисията" },
"feed_search_local": { "message": "Търсене в историята и абонаментите" },
"feed_refresh": { "message": "Проверка за нови видеоклипове" },
"feed_refresh": { "message": "Презареждане на видеоклипове" },
"feed_create": { "message": "Създаване" },
"feed_save": { "message": "Запазване" },
"feed_clear_all": { "message": "Изчистване на всички" },
Expand Down Expand Up @@ -125,6 +125,7 @@
"feed_subscription_sort_detected": { "message": "Добавени в re:Watch" },
"feed_reload_view": { "message": "Презареждане на изгледа" },
"feed_reloading_view": { "message": "Презарежда се…" },
"feed_refresh_view": { "message": "Обновяване" },
"feed_view_reloaded": { "message": "Изгледът е презареден." },
"feed_reload_view_failed": { "message": "Изгледът не можа да се презареди: $1." },
"feed_pending_inventory_incomplete": { "message": "В локалния списък все още липсват $1 открити видеоклипа." },
Expand Down
5 changes: 4 additions & 1 deletion src/_locales/bg/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,5 +141,8 @@
"ai_label_announcement_title": { "message": "Нови контроли за AI етикети", "description": "Заглавие на еднократното съобщение за функцията за AI етикети" },
"ai_label_announcement_body": { "message": "Изберете дали видеата с AI етикет да се показват, затъмняват или скриват в re:Watch.", "description": "Текст на еднократното съобщение за функцията за AI етикети" },
"announcement_dismiss": { "message": "Отказ", "description": "Скриване на съобщение за функция на разширението" },
"ai_label_announcement_settings": { "message": "Виж в настройките", "description": "Отваряне на настройките за Feed от съобщението" }
"ai_label_announcement_settings": { "message": "Виж в настройките", "description": "Отваряне на настройките за Feed от съобщението" },
"welcome_announcement_title": { "message": "YT re:Watch е готов", "description": "Заглавие на еднократното съобщение за започване" },
"welcome_announcement_body": { "message": "Напредъкът ви при гледане остава личен в този браузър. Отворете re:Watch, за да продължите да гледате и да разгледате локалния си Feed.", "description": "Текст на еднократното съобщение за започване" },
"welcome_announcement_open": { "message": "Отвори YT re:Watch", "description": "Отваряне на прозореца на разширението от съобщението за започване" }
}
5 changes: 3 additions & 2 deletions src/_locales/de/feed.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
"description": "Search field placeholder"
},
"feed_refresh": {
"message": "Nach neuen Videos suchen",
"description": "Check for new subscription videos button label"
"message": "Videos neu laden",
"description": "Neue Videos von lokalen Abonnements abrufen"
},
"feed_create": {
"message": "Erstellen",
Expand Down Expand Up @@ -467,6 +467,7 @@
"feed_subscription_sort_detected": { "message": "Zu re:Watch hinzugefügt" },
"feed_reload_view": { "message": "Ansicht neu laden" },
"feed_reloading_view": { "message": "Wird neu geladen…" },
"feed_refresh_view": { "message": "Aktualisieren" },
"feed_view_reloaded": { "message": "Ansicht neu geladen." },
"feed_reload_view_failed": { "message": "Die Ansicht konnte nicht neu geladen werden: $1." },
"feed_pending_inventory_incomplete": { "message": "Im lokalen Bestand fehlen noch $1 gefundene Videos." },
Expand Down
5 changes: 4 additions & 1 deletion src/_locales/de/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,5 +141,8 @@
"ai_label_announcement_title": { "message": "Neue Steuerelemente für KI-Kennzeichnungen", "description": "Titel der einmaligen Ankündigung der KI-Kennzeichnungsfunktion" },
"ai_label_announcement_body": { "message": "Lege fest, ob KI-gekennzeichnete Videos in re:Watch angezeigt, abgeblendet oder ausgeblendet werden.", "description": "Text der einmaligen Ankündigung der KI-Kennzeichnungsfunktion" },
"announcement_dismiss": { "message": "Schließen", "description": "Eine Funktionsankündigung schließen" },
"ai_label_announcement_settings": { "message": "In Einstellungen ansehen", "description": "Feed-Einstellungen über die Ankündigung öffnen" }
"ai_label_announcement_settings": { "message": "In Einstellungen ansehen", "description": "Feed-Einstellungen über die Ankündigung öffnen" },
"welcome_announcement_title": { "message": "YT re:Watch ist bereit", "description": "Titel der einmaligen Einführungsankündigung" },
"welcome_announcement_body": { "message": "Dein Wiedergabefortschritt bleibt in diesem Browser privat. Öffne re:Watch, um weiterzusehen und deinen lokalen Feed zu erkunden.", "description": "Text der einmaligen Einführungsankündigung" },
"welcome_announcement_open": { "message": "YT re:Watch öffnen", "description": "Erweiterungsfenster aus der Einführungsankündigung öffnen" }
}
8 changes: 6 additions & 2 deletions src/_locales/en/feed.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
"description": "Search field placeholder"
},
"feed_refresh": {
"message": "Check for new videos",
"description": "Check for new subscription videos button label"
"message": "Reload videos",
"description": "Fetch new videos from local subscriptions"
},
"feed_create": {
"message": "Create",
Expand Down Expand Up @@ -491,6 +491,10 @@
"message": "Reloading…",
"description": "Local view reload in progress"
},
"feed_refresh_view": {
"message": "Refresh",
"description": "Refresh the current view from local storage"
},
"feed_view_reloaded": {
"message": "View reloaded.",
"description": "Local view reload success"
Expand Down
5 changes: 4 additions & 1 deletion src/_locales/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -150,5 +150,8 @@
"ai_label_announcement_title": { "message": "New AI-label controls", "description": "Title of the one-time AI-label feature announcement" },
"ai_label_announcement_body": { "message": "Choose whether AI-labeled videos are shown, dimmed, or hidden in re:Watch.", "description": "Body of the one-time AI-label feature announcement" },
"announcement_dismiss": { "message": "Dismiss", "description": "Dismiss an extension feature announcement" },
"ai_label_announcement_settings": { "message": "See it in Settings", "description": "Open Feed settings from the AI-label feature announcement" }
"ai_label_announcement_settings": { "message": "See it in Settings", "description": "Open Feed settings from the AI-label feature announcement" },
"welcome_announcement_title": { "message": "YT re:Watch is ready", "description": "Title of the one-time onboarding announcement" },
"welcome_announcement_body": { "message": "Your watch progress stays private in this browser. Open re:Watch to continue watching and explore your local feed.", "description": "Body of the one-time onboarding announcement" },
"welcome_announcement_open": { "message": "Open YT re:Watch", "description": "Open the extension popup from the onboarding announcement" }
}
6 changes: 2 additions & 4 deletions src/_locales/es/feed.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@
"message": "Buscar en tu historial y suscripciones",
"description": "Search field placeholder"
},
"feed_refresh": {
"message": "Buscar vídeos nuevos",
"description": "Check for new subscription videos button label"
},
"feed_refresh": { "message": "Recargar vídeos" },
"feed_create": {
"message": "Crear",
"description": "Create button label"
Expand Down Expand Up @@ -467,6 +464,7 @@
"feed_subscription_sort_detected": { "message": "Añadidos a re:Watch" },
"feed_reload_view": { "message": "Recargar vista" },
"feed_reloading_view": { "message": "Recargando…" },
"feed_refresh_view": { "message": "Actualizar" },
"feed_view_reloaded": { "message": "Vista recargada." },
"feed_reload_view_failed": { "message": "No se pudo recargar la vista: $1." },
"feed_pending_inventory_incomplete": { "message": "Aún faltan $1 vídeos detectados en el inventario local." },
Expand Down
5 changes: 4 additions & 1 deletion src/_locales/es/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -141,5 +141,8 @@
"ai_label_announcement_title": { "message": "Nuevos controles para etiquetas de IA", "description": "Título del anuncio único de la función de etiquetas de IA" },
"ai_label_announcement_body": { "message": "Elige si los vídeos con etiqueta de IA se muestran, atenúan u ocultan en re:Watch.", "description": "Texto del anuncio único de la función de etiquetas de IA" },
"announcement_dismiss": { "message": "Descartar", "description": "Descartar un anuncio de función de la extensión" },
"ai_label_announcement_settings": { "message": "Ver en Configuración", "description": "Abrir la configuración del Feed desde el anuncio" }
"ai_label_announcement_settings": { "message": "Ver en Configuración", "description": "Abrir la configuración del Feed desde el anuncio" },
"welcome_announcement_title": { "message": "YT re:Watch está listo", "description": "Título del anuncio de bienvenida único" },
"welcome_announcement_body": { "message": "Tu progreso de reproducción permanece privado en este navegador. Abre re:Watch para seguir viendo y explorar tu feed local.", "description": "Texto del anuncio de bienvenida único" },
"welcome_announcement_open": { "message": "Abrir YT re:Watch", "description": "Abrir la ventana de la extensión desde el anuncio de bienvenida" }
}
6 changes: 2 additions & 4 deletions src/_locales/fr/feed.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@
"message": "Rechercher dans votre historique et vos abonnements",
"description": "Search field placeholder"
},
"feed_refresh": {
"message": "Rechercher de nouvelles vidéos",
"description": "Check for new subscription videos button label"
},
"feed_refresh": { "message": "Recharger les vidéos" },
"feed_create": {
"message": "Créer",
"description": "Create button label"
Expand Down Expand Up @@ -467,6 +464,7 @@
"feed_subscription_sort_detected": { "message": "Ajoutées à re:Watch" },
"feed_reload_view": { "message": "Recharger la vue" },
"feed_reloading_view": { "message": "Rechargement…" },
"feed_refresh_view": { "message": "Actualiser" },
"feed_view_reloaded": { "message": "Vue rechargée." },
"feed_reload_view_failed": { "message": "Impossible de recharger la vue : $1." },
"feed_pending_inventory_incomplete": { "message": "$1 vidéos détectées manquent encore dans l’inventaire local." },
Expand Down
Loading