feat(channels): dedicated channel page + ephemeral explore UI
Frontend for the channel-explore feature: - ChannelPage: banner/avatar/stats header, Subscribe/unsubscribe, an "exploring" badge while browsing an un-subscribed channel, Videos/About tabs. Reuses Feed scoped to the channel (scope=all + source=all so the per-user ephemeral videos show). Auto-ingests recent uploads on first visit (background, with a loading note) + "Load more from YouTube" to page deeper; skipped for demo / already-subscribed channels. - App: openChannel/closeChannel as a Back-aware sub-view (history.state._chan, mirrors the YT-search _yt pattern); ChannelPage takes over the content column, nav rail stays. - ChannelLink/cards/player: the channel name now opens our channel page (onChannelFilter → onOpenChannel); the in-card "only this channel" filter button is dropped (the page subsumes it). PlayerModal channel-name wiring follows in the next commit. - api: channelDetail + exploreChannel; ChannelDetail/ExploreResult types. - i18n EN/HU/DE: channel namespace, explore_cleanup scheduler labels, explore config group, channels_explore quota label.
This commit is contained in:
parent
bc4c362423
commit
cc1e670202
18 changed files with 744 additions and 120 deletions
|
|
@ -9,29 +9,94 @@
|
|||
"quota": "Kvóta",
|
||||
"backfill": "Letöltés (backfill)",
|
||||
"shorts": "Shorts-vizsgálat",
|
||||
"batch": "Kötegméretek"
|
||||
"batch": "Kötegméretek",
|
||||
"explore": "Csatorna-felfedezés"
|
||||
},
|
||||
"fields": {
|
||||
"smtp_host": { "label": "SMTP-kiszolgáló", "hint": "pl. smtp.gmail.com" },
|
||||
"smtp_port": { "label": "SMTP-port", "hint": "Általában 587 (STARTTLS)." },
|
||||
"smtp_user": { "label": "SMTP-felhasználónév", "hint": "A küldő fiók / bejelentkezés." },
|
||||
"smtp_from": { "label": "Feladó cím", "hint": "pl. Siftlode <addr@gmail.com>. Alapból a felhasználónév." },
|
||||
"smtp_password": { "label": "SMTP-jelszó", "hint": "Alkalmazásjelszó. Titkosítva tárolva; csak írható — soha nem jelenik meg újra." },
|
||||
"quota_daily_budget": { "label": "Napi kvótakeret", "hint": "Naponta elkölthető YouTube Data API-egységek (az ingyenes keret 10 000). Az alap 9000 tartalékot hagy." },
|
||||
"backfill_quota_reserve": { "label": "Letöltési kvótatartalék", "hint": "Tartalékban tartott egységek, hogy az ütemezett letöltés ne éheztesse ki az interaktív szinkront / gazdagítást." },
|
||||
"search_daily_limit_per_user": { "label": "Élő keresés — napi limit / felhasználó", "hint": "Maximális élő YouTube-keresés felhasználónként naponta. Az API-forrásnál egy keresés 100 egységbe kerül (így a közös büdzséből összesen csak ~80-90 fér bele naponta); a scrape-forrásnál ez tiszta visszaélés-elleni limit. 0 = élő keresés kikapcsolva." },
|
||||
"search_source": { "label": "Élő keresés forrása", "hint": "Honnan jönnek az élő YouTube-keresés találatai. A „scrape” a YouTube belső végpontját használja és nem fogyaszt API-kvótát (ajánlott). Az „api” a hivatalos search.list-et (100 egység/oldal). Válts „api”-ra, ha a scrape valaha elromlik vagy letiltják." },
|
||||
"backfill_recent_max_videos": { "label": "Friss letöltés — max videó", "hint": "Csatornánként az első körben letöltött legújabb videók száma." },
|
||||
"backfill_recent_max_days": { "label": "Friss letöltés — max kor (nap)", "hint": "Az első kör csatornánként meddig nyúl vissza." },
|
||||
"shorts_probe_max_seconds": { "label": "Shorts-vizsgálat — max hossz (mp)", "hint": "Csak az ennél nem hosszabb videókat vizsgáljuk lehetséges Shortsként." },
|
||||
"shorts_probe_batch": { "label": "Shorts-vizsgálat — kötegméret", "hint": "Futásonként ennyi videót osztályozunk." },
|
||||
"enrich_batch_size": { "label": "Gazdagítási kötegméret", "hint": "videos.list azonosítók hívásonként (a YouTube 50-ben maximálja)." },
|
||||
"autotag_title_sample": { "label": "Auto-címke címmintavétel", "hint": "Csatornánként ennyi friss videócímet mintázunk a nyelvfelismeréshez." },
|
||||
"youtube_api_key": { "label": "YouTube API-kulcs", "hint": "Opcionális. Publikus olvasásokhoz (csatornák/videók), hogy a megosztott letöltés ne függjön egy felhasználó OAuth-jától. Titkosítva tárolva; csak írható." },
|
||||
"youtube_api_proxy": { "label": "YouTube API egress proxy", "hint": "Opcionális. HTTP(S) proxy URL a kimenő YouTube API-hívásokhoz — fix IP-jű hoston átengedve egy IP-korlátozott kulcs dinamikus IP-jű szerverről is működik. Üresen = közvetlen." },
|
||||
"google_client_id": { "label": "Google kliens-azonosító", "hint": "OAuth 2.0 kliens-azonosító a Google-bejelentkezéshez. Titkosítva tárolva; csak írható. Hagyd üresen mindkét Google-mezőt a Google-bejelentkezés kikapcsolásához (az e-mail+jelszó továbbra is működik)." },
|
||||
"google_client_secret": { "label": "Google kliens-titok", "hint": "OAuth 2.0 kliens-titok. Titkosítva tárolva; csak írható." },
|
||||
"allow_registration": { "label": "Regisztráció engedélyezése", "hint": "Bekapcsolva bárki beküldhet email+jelszó regisztrációt. Belépéshez továbbra is email-igazolás és admin-jóváhagyás szükséges." }
|
||||
"smtp_host": {
|
||||
"label": "SMTP-kiszolgáló",
|
||||
"hint": "pl. smtp.gmail.com"
|
||||
},
|
||||
"smtp_port": {
|
||||
"label": "SMTP-port",
|
||||
"hint": "Általában 587 (STARTTLS)."
|
||||
},
|
||||
"smtp_user": {
|
||||
"label": "SMTP-felhasználónév",
|
||||
"hint": "A küldő fiók / bejelentkezés."
|
||||
},
|
||||
"smtp_from": {
|
||||
"label": "Feladó cím",
|
||||
"hint": "pl. Siftlode <addr@gmail.com>. Alapból a felhasználónév."
|
||||
},
|
||||
"smtp_password": {
|
||||
"label": "SMTP-jelszó",
|
||||
"hint": "Alkalmazásjelszó. Titkosítva tárolva; csak írható — soha nem jelenik meg újra."
|
||||
},
|
||||
"quota_daily_budget": {
|
||||
"label": "Napi kvótakeret",
|
||||
"hint": "Naponta elkölthető YouTube Data API-egységek (az ingyenes keret 10 000). Az alap 9000 tartalékot hagy."
|
||||
},
|
||||
"backfill_quota_reserve": {
|
||||
"label": "Letöltési kvótatartalék",
|
||||
"hint": "Tartalékban tartott egységek, hogy az ütemezett letöltés ne éheztesse ki az interaktív szinkront / gazdagítást."
|
||||
},
|
||||
"search_daily_limit_per_user": {
|
||||
"label": "Élő keresés — napi limit / felhasználó",
|
||||
"hint": "Maximális élő YouTube-keresés felhasználónként naponta. Az API-forrásnál egy keresés 100 egységbe kerül (így a közös büdzséből összesen csak ~80-90 fér bele naponta); a scrape-forrásnál ez tiszta visszaélés-elleni limit. 0 = élő keresés kikapcsolva."
|
||||
},
|
||||
"search_source": {
|
||||
"label": "Élő keresés forrása",
|
||||
"hint": "Honnan jönnek az élő YouTube-keresés találatai. A „scrape” a YouTube belső végpontját használja és nem fogyaszt API-kvótát (ajánlott). Az „api” a hivatalos search.list-et (100 egység/oldal). Válts „api”-ra, ha a scrape valaha elromlik vagy letiltják."
|
||||
},
|
||||
"backfill_recent_max_videos": {
|
||||
"label": "Friss letöltés — max videó",
|
||||
"hint": "Csatornánként az első körben letöltött legújabb videók száma."
|
||||
},
|
||||
"backfill_recent_max_days": {
|
||||
"label": "Friss letöltés — max kor (nap)",
|
||||
"hint": "Az első kör csatornánként meddig nyúl vissza."
|
||||
},
|
||||
"shorts_probe_max_seconds": {
|
||||
"label": "Shorts-vizsgálat — max hossz (mp)",
|
||||
"hint": "Csak az ennél nem hosszabb videókat vizsgáljuk lehetséges Shortsként."
|
||||
},
|
||||
"shorts_probe_batch": {
|
||||
"label": "Shorts-vizsgálat — kötegméret",
|
||||
"hint": "Futásonként ennyi videót osztályozunk."
|
||||
},
|
||||
"enrich_batch_size": {
|
||||
"label": "Gazdagítási kötegméret",
|
||||
"hint": "videos.list azonosítók hívásonként (a YouTube 50-ben maximálja)."
|
||||
},
|
||||
"autotag_title_sample": {
|
||||
"label": "Auto-címke címmintavétel",
|
||||
"hint": "Csatornánként ennyi friss videócímet mintázunk a nyelvfelismeréshez."
|
||||
},
|
||||
"youtube_api_key": {
|
||||
"label": "YouTube API-kulcs",
|
||||
"hint": "Opcionális. Publikus olvasásokhoz (csatornák/videók), hogy a megosztott letöltés ne függjön egy felhasználó OAuth-jától. Titkosítva tárolva; csak írható."
|
||||
},
|
||||
"youtube_api_proxy": {
|
||||
"label": "YouTube API egress proxy",
|
||||
"hint": "Opcionális. HTTP(S) proxy URL a kimenő YouTube API-hívásokhoz — fix IP-jű hoston átengedve egy IP-korlátozott kulcs dinamikus IP-jű szerverről is működik. Üresen = közvetlen."
|
||||
},
|
||||
"google_client_id": {
|
||||
"label": "Google kliens-azonosító",
|
||||
"hint": "OAuth 2.0 kliens-azonosító a Google-bejelentkezéshez. Titkosítva tárolva; csak írható. Hagyd üresen mindkét Google-mezőt a Google-bejelentkezés kikapcsolásához (az e-mail+jelszó továbbra is működik)."
|
||||
},
|
||||
"google_client_secret": {
|
||||
"label": "Google kliens-titok",
|
||||
"hint": "OAuth 2.0 kliens-titok. Titkosítva tárolva; csak írható."
|
||||
},
|
||||
"allow_registration": {
|
||||
"label": "Regisztráció engedélyezése",
|
||||
"hint": "Bekapcsolva bárki beküldhet email+jelszó regisztrációt. Belépéshez továbbra is email-igazolás és admin-jóváhagyás szükséges."
|
||||
},
|
||||
"explore_grace_days": {
|
||||
"label": "Felfedezés — türelmi idő (nap)",
|
||||
"hint": "Meddig marad meg egy felfedezett, de nem feliratkozott csatorna (és efemer videói), mielőtt a takarító feladat törli. A feliratkozás véglegesen megtartja."
|
||||
}
|
||||
},
|
||||
"save": "Mentés",
|
||||
"saving": "Mentés…",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue