diff --git a/messages/en.json b/messages/en.json index af8a640..0b29c8f 100644 --- a/messages/en.json +++ b/messages/en.json @@ -54,7 +54,7 @@ "platforms": { "heading": "Supported platforms", "subheading": "Works with your favorite sites", - "more": "+ 1000 more sites supported via yt-dlp", + "more": "+ 1000 more sites supported. See the full list.", "disclaimer": "Ombrora is not affiliated with YouTube, TikTok, Instagram, Facebook, X, Vimeo, Twitch, SoundCloud or Dailymotion. Please respect copyright and only download content you have the right to use." }, "faq": { @@ -64,7 +64,7 @@ "q2": "Is it legal to download videos?", "a2": "Downloading is legal for content you own the rights to, that is in the public domain, or that you have permission to save for personal, offline use. You are responsible for respecting the copyright and terms of service of the source platform.", "q3": "Which sites are supported?", - "a3": "YouTube, TikTok, Instagram, Facebook, X (Twitter), Vimeo, Twitch, SoundCloud, Dailymotion and over 1000 other sites, powered by yt-dlp.", + "a3": "YouTube, TikTok, Instagram, Facebook, X (Twitter), Vimeo, Twitch, SoundCloud, Dailymotion and over 1000 other sites. See the full list.", "q4": "What formats and quality can I get?", "a4": "Video in MP4, WebM or MKV, or audio-only in MP3, up to 1080p depending on the source video.", "q5": "Do you keep a copy of my videos?", @@ -76,6 +76,17 @@ "q8": "Why did my download fail?", "a8": "Some videos are private, age-restricted, geo-blocked or region-locked by the source platform and cannot be downloaded. Live streams in progress and unreleased premieres are not supported either." }, + "supportedSitesPage": { + "title": "Supported sites -- Ombrora", + "description": "Full list of sites supported for video and audio downloads on Ombrora.", + "back": "← Back to home", + "heading": "Supported sites", + "subheading": "Browse or search the full list of sites Ombrora can download from.", + "searchPlaceholder": "Search a site...", + "resultCount": "{count} of {total} sites", + "noResults": "No site matches your search.", + "note": "This list is indicative and evolves over time: some entries may stop working if a source platform changes its restrictions, and new sites are added regularly. Don't see your site? Try pasting the link anyway, it may still work." + }, "footer": { "copyright": "© 2026 Ombrora" } diff --git a/messages/es.json b/messages/es.json index ee43b9a..55ba7ad 100644 --- a/messages/es.json +++ b/messages/es.json @@ -54,7 +54,7 @@ "platforms": { "heading": "Plataformas compatibles", "subheading": "Funciona con tus sitios favoritos", - "more": "+ 1000 sitios adicionales compatibles gracias a yt-dlp", + "more": "+ 1000 sitios adicionales compatibles. Ver la lista completa.", "disclaimer": "Ombrora no está afiliado a YouTube, TikTok, Instagram, Facebook, X, Vimeo, Twitch, SoundCloud ni Dailymotion. Por favor, respeta los derechos de autor y descarga únicamente contenido que tengas derecho a usar." }, "faq": { @@ -64,7 +64,7 @@ "q2": "¿Es legal descargar vídeos?", "a2": "Descargar es legal para contenido del que posees los derechos, que es de dominio público, o que tienes permiso para guardar para uso personal sin conexión. Eres responsable de respetar los derechos de autor y las condiciones de uso de la plataforma de origen.", "q3": "¿Qué sitios son compatibles?", - "a3": "YouTube, TikTok, Instagram, Facebook, X (Twitter), Vimeo, Twitch, SoundCloud, Dailymotion y más de 1000 sitios adicionales, gracias a yt-dlp.", + "a3": "YouTube, TikTok, Instagram, Facebook, X (Twitter), Vimeo, Twitch, SoundCloud, Dailymotion y más de 1000 sitios adicionales. Ver la lista completa.", "q4": "¿Qué formatos y calidad puedo obtener?", "a4": "Vídeo en MP4, WebM o MKV, o solo audio en MP3, hasta 1080p según el vídeo de origen.", "q5": "¿Guardáis una copia de mis vídeos?", @@ -76,6 +76,17 @@ "q8": "¿Por qué falló mi descarga?", "a8": "Algunos vídeos son privados, tienen restricción de edad, están bloqueados geográficamente o limitados por la plataforma de origen y no se pueden descargar. Las transmisiones en directo en curso y los estrenos no publicados tampoco son compatibles." }, + "supportedSitesPage": { + "title": "Sitios compatibles -- Ombrora", + "description": "Lista completa de sitios compatibles para descargar vídeos y audio en Ombrora.", + "back": "← Volver al inicio", + "heading": "Sitios compatibles", + "subheading": "Consulta o busca en la lista completa de sitios desde los que Ombrora puede descargar.", + "searchPlaceholder": "Buscar un sitio...", + "resultCount": "{count} de {total} sitios", + "noResults": "Ningún sitio coincide con tu búsqueda.", + "note": "Esta lista es orientativa y evoluciona con el tiempo: algunos sitios pueden dejar de funcionar si la plataforma de origen cambia sus restricciones, y se añaden nuevos sitios con frecuencia. ¿No encuentras tu sitio? Prueba a pegar el enlace de todos modos, puede que funcione." + }, "footer": { "copyright": "© 2026 Ombrora" } diff --git a/messages/fr.json b/messages/fr.json index da96249..752c599 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -54,7 +54,7 @@ "platforms": { "heading": "Plateformes prises en charge", "subheading": "Fonctionne avec vos sites préférés", - "more": "+ 1000 autres sites pris en charge via yt-dlp", + "more": "+ 1000 autres sites pris en charge. Voir la liste complète.", "disclaimer": "Ombrora n'est affilié à aucune des plateformes YouTube, TikTok, Instagram, Facebook, X, Vimeo, Twitch, SoundCloud ou Dailymotion. Merci de respecter le droit d'auteur et de ne télécharger que du contenu que vous avez le droit d'utiliser." }, "faq": { @@ -64,7 +64,7 @@ "q2": "Est-il légal de télécharger des vidéos ?", "a2": "Le téléchargement est légal pour un contenu dont vous détenez les droits, qui appartient au domaine public, ou que vous êtes autorisé à conserver pour un usage personnel hors ligne. Vous êtes responsable du respect du droit d'auteur et des conditions d'utilisation de la plateforme source.", "q3": "Quels sites sont pris en charge ?", - "a3": "YouTube, TikTok, Instagram, Facebook, X (Twitter), Vimeo, Twitch, SoundCloud, Dailymotion et plus de 1000 autres sites, grâce à yt-dlp.", + "a3": "YouTube, TikTok, Instagram, Facebook, X (Twitter), Vimeo, Twitch, SoundCloud, Dailymotion et plus de 1000 autres sites. Voir la liste complète.", "q4": "Quels formats et quelle qualité puis-je obtenir ?", "a4": "Vidéo en MP4, WebM ou MKV, ou audio seul en MP3, jusqu'en 1080p selon la vidéo source.", "q5": "Conservez-vous une copie de mes vidéos ?", @@ -76,6 +76,17 @@ "q8": "Pourquoi mon téléchargement a-t-il échoué ?", "a8": "Certaines vidéos sont privées, soumises à une restriction d'âge, bloquées géographiquement ou limitées par la plateforme source et ne peuvent pas être téléchargées. Les lives en cours et les premières non sorties ne sont pas non plus pris en charge." }, + "supportedSitesPage": { + "title": "Sites pris en charge -- Ombrora", + "description": "Liste complète des sites pris en charge pour le téléchargement de vidéos et d'audio sur Ombrora.", + "back": "← Retour à l'accueil", + "heading": "Sites pris en charge", + "subheading": "Parcourez ou recherchez la liste complète des sites depuis lesquels Ombrora peut télécharger.", + "searchPlaceholder": "Rechercher un site...", + "resultCount": "{count} sur {total} sites", + "noResults": "Aucun site ne correspond à votre recherche.", + "note": "Cette liste est indicative et évolue régulièrement : certains sites peuvent cesser de fonctionner si la plateforme source change ses restrictions, et de nouveaux sites sont ajoutés fréquemment. Vous ne trouvez pas votre site ? Essayez tout de même de coller le lien, il fonctionnera peut-être." + }, "footer": { "copyright": "© 2026 Ombrora" } diff --git a/messages/it.json b/messages/it.json index f45e8c5..cd4ca3b 100644 --- a/messages/it.json +++ b/messages/it.json @@ -54,7 +54,7 @@ "platforms": { "heading": "Piattaforme supportate", "subheading": "Funziona con i tuoi siti preferiti", - "more": "+ 1000 altri siti supportati tramite yt-dlp", + "more": "+ 1000 altri siti supportati. Vedi l'elenco completo.", "disclaimer": "Ombrora non è affiliato a YouTube, TikTok, Instagram, Facebook, X, Vimeo, Twitch, SoundCloud o Dailymotion. Rispetta il copyright e scarica solo contenuti che hai il diritto di utilizzare." }, "faq": { @@ -64,7 +64,7 @@ "q2": "È legale scaricare video?", "a2": "Scaricare è legale per contenuti di cui possiedi i diritti, che sono di dominio pubblico, o che sei autorizzato a conservare per uso personale offline. Sei responsabile del rispetto del copyright e dei termini di servizio della piattaforma di origine.", "q3": "Quali siti sono supportati?", - "a3": "YouTube, TikTok, Instagram, Facebook, X (Twitter), Vimeo, Twitch, SoundCloud, Dailymotion e oltre 1000 altri siti, grazie a yt-dlp.", + "a3": "YouTube, TikTok, Instagram, Facebook, X (Twitter), Vimeo, Twitch, SoundCloud, Dailymotion e oltre 1000 altri siti. Vedi l'elenco completo.", "q4": "Quali formati e qualità posso ottenere?", "a4": "Video in MP4, WebM o MKV, oppure solo audio in MP3, fino a 1080p a seconda del video originale.", "q5": "Conservate una copia dei miei video?", @@ -76,6 +76,17 @@ "q8": "Perché il mio download è fallito?", "a8": "Alcuni video sono privati, soggetti a restrizioni di età, bloccati geograficamente o limitati dalla piattaforma di origine e non possono essere scaricati. Anche le dirette in corso e le anteprime non ancora pubblicate non sono supportate." }, + "supportedSitesPage": { + "title": "Siti supportati -- Ombrora", + "description": "Elenco completo dei siti supportati per scaricare video e audio su Ombrora.", + "back": "← Torna alla home", + "heading": "Siti supportati", + "subheading": "Sfoglia o cerca nell'elenco completo dei siti da cui Ombrora può scaricare.", + "searchPlaceholder": "Cerca un sito...", + "resultCount": "{count} di {total} siti", + "noResults": "Nessun sito corrisponde alla tua ricerca.", + "note": "Questo elenco è indicativo ed evolve nel tempo: alcuni siti potrebbero smettere di funzionare se la piattaforma di origine modifica le proprie restrizioni, e nuovi siti vengono aggiunti regolarmente. Non trovi il tuo sito? Prova comunque a incollare il link: potrebbe funzionare lo stesso." + }, "footer": { "copyright": "© 2026 Ombrora" } diff --git a/src/app/[locale]/supported-sites/page.tsx b/src/app/[locale]/supported-sites/page.tsx new file mode 100644 index 0000000..77d4a92 --- /dev/null +++ b/src/app/[locale]/supported-sites/page.tsx @@ -0,0 +1,61 @@ +import type { Metadata } from 'next' +import { getTranslations } from 'next-intl/server' +import { Link } from '@/navigation' +import { SUPPORTED_SITES } from '@/lib/supported-sites' +import { SupportedSitesBrowser } from '@/components/SupportedSitesBrowser' + +export async function generateMetadata({ + params, +}: { + params: Promise<{ locale: string }> +}): Promise { + const { locale } = await params + const t = await getTranslations({ locale, namespace: 'supportedSitesPage' }) + + return { + title: t('title'), + description: t('description'), + } +} + +export default async function SupportedSitesPage({ + params, +}: { + params: Promise<{ locale: string }> +}) { + const { locale } = await params + const t = await getTranslations({ locale, namespace: 'supportedSitesPage' }) + + return ( +
+
+ + {t('back')} + + +

+ {t('heading')} +

+

+ {t('subheading')} +

+ +
+ +
+ +

+ {t('note')} +

+
+
+ ) +} diff --git a/src/components/FaqSection.tsx b/src/components/FaqSection.tsx index c4fe57c..5df7e40 100644 --- a/src/components/FaqSection.tsx +++ b/src/components/FaqSection.tsx @@ -1,7 +1,12 @@ import { getTranslations } from 'next-intl/server' +import { Link } from '@/navigation' const QUESTION_COUNT = 8 +function stripRichTags(text: string) { + return text.replace(/(.*?)<\/link>/g, '$1') +} + function ChevronIcon() { return ( ({ - q: t(`q${i + 1}`), - a: t(`a${i + 1}`), - })) + const items = Array.from({ length: QUESTION_COUNT }, (_, i) => { + const key = `a${i + 1}` as const + return { + q: t(`q${i + 1}`), + aText: stripRichTags(t.raw(key) as string), + aNode: t.rich(key, { + link: (chunks) => ( + + {chunks} + + ), + }), + } + }) const jsonLd = { '@context': 'https://schema.org', '@type': 'FAQPage', - mainEntity: items.map(({ q, a }) => ({ + mainEntity: items.map(({ q, aText }) => ({ '@type': 'Question', name: q, - acceptedAnswer: { '@type': 'Answer', text: a }, + acceptedAnswer: { '@type': 'Answer', text: aText }, })), } @@ -50,7 +65,7 @@ export async function FaqSection({ locale }: { locale: string }) { {t('heading')}
- {items.map(({ q, a }) => ( + {items.map(({ q, aNode }) => (
-

{a}

+

{aNode}

))}
diff --git a/src/components/SupportedPlatformsSection.tsx b/src/components/SupportedPlatformsSection.tsx index 3eff3d7..784356d 100644 --- a/src/components/SupportedPlatformsSection.tsx +++ b/src/components/SupportedPlatformsSection.tsx @@ -1,4 +1,5 @@ import { getTranslations } from 'next-intl/server' +import { Link } from '@/navigation' const PLATFORMS = [ 'YouTube', @@ -33,7 +34,15 @@ export async function SupportedPlatformsSection({ locale }: { locale: string }) ))} -

{t('more')}

+

+ {t.rich('more', { + link: (chunks) => ( + + {chunks} + + ), + })} +

{t('disclaimer')}

diff --git a/src/components/SupportedSitesBrowser.tsx b/src/components/SupportedSitesBrowser.tsx new file mode 100644 index 0000000..0c4dc0c --- /dev/null +++ b/src/components/SupportedSitesBrowser.tsx @@ -0,0 +1,88 @@ +'use client' + +import { useMemo, useState } from 'react' + +function SearchIcon() { + return ( + + + + + ) +} + +export function SupportedSitesBrowser({ + sites, + searchPlaceholder, + resultCountTemplate, + noResultsLabel, +}: { + sites: string[] + searchPlaceholder: string + resultCountTemplate: string + noResultsLabel: string +}) { + const [query, setQuery] = useState('') + + const filtered = useMemo(() => { + const q = query.trim().toLowerCase() + if (!q) return sites + return sites.filter((site) => site.toLowerCase().includes(q)) + }, [sites, query]) + + const grouped = useMemo(() => { + const map = new Map() + for (const site of filtered) { + const first = site[0]?.toUpperCase() ?? '#' + const letter = /[A-Z]/.test(first) ? first : '#' + if (!map.has(letter)) map.set(letter, []) + map.get(letter)!.push(site) + } + return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b)) + }, [filtered]) + + return ( +
+
+ + + + setQuery(e.target.value)} + placeholder={searchPlaceholder} + className="w-full rounded-lg border border-gray-200 dark:border-slate-700 bg-white dark:bg-slate-900 pl-9 pr-4 py-2.5 text-sm text-gray-900 dark:text-gray-50 outline-none focus:ring-2 focus:ring-violet-500" + /> +
+ +

+ {resultCountTemplate + .replace('{count}', String(filtered.length)) + .replace('{total}', String(sites.length))} +

+ + {filtered.length === 0 ? ( +

{noResultsLabel}

+ ) : ( +
+ {grouped.map(([letter, names]) => ( +
+

{letter}

+
+ {names.map((name) => ( + + {name} + + ))} +
+
+ ))} +
+ )} +
+ ) +} diff --git a/src/lib/supported-sites.ts b/src/lib/supported-sites.ts new file mode 100644 index 0000000..65ac6d1 --- /dev/null +++ b/src/lib/supported-sites.ts @@ -0,0 +1,1383 @@ +// Generated from yt-dlp's extractor list. Regenerate if the site list needs updating. +export const SUPPORTED_SITES: string[] = [ + "10play", + "17live", + "1News", + "1tv", + "20min", + "23video", + "247sports", + "24tv.ua", + "3qsdn", + "3sat", + "4tube", + "56.com", + "7plus", + "9c9media", + "9gag", + "9News", + "9now.com.au", + "abc.net.au", + "abcnews", + "abcotvs", + "AbemaTV", + "AbemaTVTitle", + "AcademicEarth", + "acast", + "AcFunBangumi", + "AcFunVideo", + "ADN", + "ADNSeason", + "AdobeConnect", + "adobetv", + "AdultSwim", + "aenetworks", + "AeonCo", + "agalega", + "AitubeKZVideo", + "Alibaba", + "AliExpressLive", + "AlJazeera", + "Allocine", + "Allstar", + "AllstarProfile", + "AlphaPorno", + "altcensored", + "Alura", + "AluraCourse", + "AmadeusTV", + "Amara", + "AmazonMiniTV", + "amazonminitv", + "AmazonReviews", + "AmazonStore", + "AMCNetworks", + "AmericasTestKitchen", + "AmericasTestKitchenSeason", + "AmHistoryChannel", + "anderetijden", + "Angel", + "AnimalPlanet", + "ant1newsgr", + "antenna", + "Anvato", + "aol.com", + "APA", + "Aparat", + "apple", + "ApplePodcasts", + "archive.org", + "ArcPublishing", + "ARD", + "ARDAudiothek", + "ARDAudiothekPlaylist", + "ARDMediathek", + "ARDMediathekCollection", + "Art19", + "Art19Show", + "arte.sky.it", + "ArteTV", + "ArteTVCategory", + "ArteTVEmbed", + "ArteTVPlaylist", + "asobichannel", + "AsobiStage", + "AtresPlayer", + "AtScaleConfEvent", + "AudiMedia", + "AudioBoom", + "Audiodraft", + "audiomack", + "Audius", + "audius", + "AZMedien", + "BaiduVideo", + "BanBye", + "BanByeChannel", + "Bandcamp", + "Bandlab", + "BandlabPlaylist", + "BannedVideo", + "bbc", + "bbc.co.uk", + "BBVTV", + "BBVTVLive", + "BBVTVRecordings", + "BeaconTv", + "Beatport", + "Beeg", + "BehindKink", + "BerufeTV", + "Bet", + "bfi", + "bfmtv", + "bibeltv", + "Bigo", + "Bild", + "BiliBili", + "Bilibili category extractor", + "BilibiliAudio", + "BilibiliAudioAlbum", + "BiliBiliBangumi", + "BiliBiliBangumiMedia", + "BiliBiliBangumiSeason", + "BilibiliCheese", + "BilibiliCheeseSeason", + "BilibiliCollectionList", + "BiliBiliDynamic", + "BilibiliFavoritesList", + "BiliBiliPlayer", + "BilibiliPlaylist", + "BiliBiliSearch", + "BilibiliSeriesList", + "BilibiliSpaceAudio", + "BilibiliSpaceVideo", + "BilibiliWatchlater", + "BiliIntl", + "biliIntl", + "BiliLive", + "BioBioChileTV", + "Biography", + "BitChute", + "BitChuteChannel", + "Bitmovin", + "BlackboardCollaborate", + "BlackboardCollaborateLaunch", + "BleacherReport", + "BleacherReportCMS", + "blerp", + "blogger.com", + "Bloomberg", + "Bluesky", + "BongaCams", + "Boosty", + "BostonGlobe", + "Box", + "BoxCastVideo", + "Bpb", + "BR", + "BrainPOP", + "BrainPOPELL", + "BrainPOPEsp", + "BrainPOPFr", + "BrainPOPIl", + "BrainPOPJr", + "BravoTV", + "BreitBart", + "brightcove", + "Brilliantpala", + "bt", + "BTVPlus", + "Bundesliga", + "Bundestag", + "BunnyCdn", + "BusinessInsider", + "BuzzFeed", + "BYUtv", + "Caltrans", + "CAM4", + "CamFMEpisode", + "CamFMShow", + "CamModels", + "Camsoda", + "CamtasiaEmbed", + "Canal1", + "CanalAlpha", + "canalc2.tv", + "Canalplus", + "Canalsurmas", + "CaracolTvPlay", + "cbc.ca", + "CBS", + "CBSLocal", + "CBSLocalArticle", + "CBSLocalLive", + "cbsnews", + "cbssports", + "CCMA", + "CCTV", + "CDA", + "CDAFolder", + "Cellebrite", + "CeskaTelevize", + "CGTN", + "CharlieRose", + "Chaturbate", + "Chilloutzone", + "chzzk", + "cielotv.it", + "Cinemax", + "CinetecaMilano", + "Cineverse", + "CineverseDetails", + "CiscoLiveSearch", + "CiscoLiveSession", + "ciscowebex", + "CJSW", + "Clipchamp", + "ClipRs", + "CloserToTruth", + "CloudflareStream", + "CloudyCDN", + "Clubic", + "Clyp", + "CNBCVideo", + "CNN", + "CNNIndonesia", + "ComedyCentral", + "ConanClassic", + "CondeNast", + "CookingChannel", + "Corus", + "Coub", + "CozyTV", + "cp24", + "cpac", + "Cracked", + "Craftsy", + "croatian.film", + "CrooksAndLiars", + "CrowdBunker", + "CrowdBunkerChannel", + "Crtvg", + "CSpan", + "CSpanCongress", + "CtsNews", + "CTVNews", + "cu.ntv.co.jp", + "CultureUnplugged", + "curiositystream", + "Cybrary", + "CybraryCourse", + "DacastPlaylist", + "DacastVOD", + "DagelijkseKost", + "DailyMail", + "dailymotion", + "DailyWire", + "DailyWirePodcast", + "damtomo", + "dangalplay", + "daum.net", + "daystar", + "DBTV", + "DctpTv", + "democracynow", + "DestinationAmerica", + "DetikEmbed", + "DeuxM", + "DeuxMNews", + "DHM", + "DigitalConcertHall", + "DigitallySpeaking", + "Digiteka", + "Digiview", + "DiscogsReleasePlaylist", + "DiscoveryLife", + "DiscoveryNetworksDe", + "DiscoveryPlus", + "DiscoveryPlusIndia", + "DiscoveryPlusIndiaShow", + "DiscoveryPlusItaly", + "DiscoveryPlusItalyShow", + "Disney", + "dlf", + "dlive", + "Douyin", + "DouyuShow", + "DouyuTV", + "DPlay", + "DRBonanza", + "Dropbox", + "Dropout", + "DropoutSeason", + "DrTalks", + "DrTuber", + "drtv", + "DTube", + "Dumpert", + "Duoplay", + "dvtv", + "dw", + "dzen.ru", + "EbaumsWorld", + "Ebay", + "egghead", + "eggs", + "EinsUndEinsTV", + "EinsUndEinsTVLive", + "EinsUndEinsTVRecordings", + "ElementorEmbed", + "Elonet", + "ElPais", + "ElTreceTV", + "Embedly", + "EMPFlix", + "Epicon", + "EpiconSeries", + "EpidemicSound", + "eplus", + "Epoch", + "Eporner", + "Erocast", + "EroProfile", + "ERRArhiiv", + "ERRJupiter", + "ertflix", + "ertwebtv", + "ESPN", + "ESPNArticle", + "ESPNCricInfo", + "EttuTv", + "Europa", + "EuroParlWebstream", + "EuropeanTour", + "Eurosport", + "EUScreen", + "EWETV", + "EWETVLive", + "EWETVRecordings", + "Expressen", + "facebook", + "FacebookPluginsVideo", + "fancode", + "Fathom", + "Faulio", + "FaulioLive", + "faz.net", + "fc2", + "Fczenit", + "Fifa", + "FilmArchiv", + "filmon", + "Filmweb", + "FiveThirtyEight", + "FiveTV", + "Flickr", + "Floatplane", + "FloatplaneChannel", + "Folketinget", + "FoodNetwork", + "FootyRoom", + "Formula1", + "FOX", + "FOX9", + "FOX9News", + "foxnews", + "FoxNewsVideo", + "FoxSports", + "fptplay", + "FrancaisFacile", + "FranceCulture", + "franceinfo", + "francetv", + "Freesound", + "freespeech.org", + "freetv", + "FreeTvMovies", + "FrontendMasters", + "FrontendMastersCourse", + "FrontendMastersLesson", + "Funk", + "Funker530", + "Fux", + "FuyinTV", + "Gab", + "Gaia", + "GameDevTVDashboard", + "GameJolt", + "GameJoltCommunity", + "GameJoltGame", + "GameJoltGameSoundtrack", + "GameJoltSearch", + "GameJoltUser", + "GameSpot", + "GameStar", + "Gaskrank", + "Gazeta", + "GBNews", + "GDCVault", + "GediDigital", + "gem.cbc.ca", + "Genius", + "GeniusLyrics", + "Germanupa", + "GetCourseRu", + "GetCourseRuPlayer", + "Gettr", + "GettrStreaming", + "GiantBomb", + "GlattvisionTV", + "GlattvisionTVLive", + "GlattvisionTVRecordings", + "Glide", + "GlobalPlayerAudio", + "GlobalPlayerAudioEpisode", + "GlobalPlayerLive", + "GlobalPlayerLivePlaylist", + "GlobalPlayerVideo", + "Globo", + "GloboArticle", + "glomex", + "GMANetworkVideo", + "Go", + "GoDiscovery", + "GodResource", + "GodTube", + "Golem", + "goodgame", + "GoogleDrive", + "GoPro", + "GoToStage", + "Graspop", + "Gronkh", + "gronkh", + "Groupon", + "Harpodeon", + "hbo", + "HearThisAt", + "Heise", + "HellPorno", + "hetklokhuis", + "hgtv.com", + "HGTVDe", + "HGTVUsa", + "HiDive", + "HistoricFilms", + "history", + "HitRecord", + "HollywoodReporter", + "HollywoodReporterPlaylist", + "Holodex", + "HotNewHipHop", + "hotstar", + "hrfernsehen", + "HRTi", + "HRTiPlaylist", + "HSEProduct", + "HSEShow", + "html5", + "Huajiao", + "HuffPost", + "Hungama", + "HungamaAlbumPlaylist", + "HungamaSong", + "huya", + "Hypem", + "Hytale", + "Icareus", + "IdagioAlbum", + "IdagioPersonalPlaylist", + "IdagioPlaylist", + "IdagioRecording", + "IdagioTrack", + "iflix", + "IflixSeries", + "ign.com", + "IGNArticle", + "IGNVideo", + "iheartradio", + "IlPost", + "Iltalehti", + "imdb", + "Imgur", + "imgur", + "Ina", + "Inc", + "IndavideoEmbed", + "InfoQ", + "Instagram", + "instagram", + "InstagramIOS", + "Internazionale", + "InvestigationDiscovery", + "IPrima", + "IPrimaCNN", + "iq.com", + "iqiyi", + "IslamChannel", + "IslamChannelSeries", + "IsraelNationalNews", + "ITProTV", + "ITProTVCourse", + "ITV", + "ITVBTCC", + "ivi", + "ivideon", + "Ivoox", + "iwara", + "Ixigua", + "Jamendo", + "JamendoAlbum", + "JeuxVideo", + "jiosaavn", + "Joj", + "Jove", + "JStream", + "JTBC", + "JWPlatform", + "Kakao", + "Kaltura", + "KankaNews", + "Karaoketv", + "Katsomo", + "KelbyOne", + "Kenh14Playlist", + "Kenh14Video", + "khanacademy", + "kick", + "Kicker", + "KickStarter", + "Kika", + "KikaPlaylist", + "KinoPoisk", + "Kommunetv", + "KompasVideo", + "KrasView", + "KTH", + "Ku6", + "KukuluLive", + "kuwo", + "la7.it", + "laracasts", + "LastFM", + "LastFMPlaylist", + "LastFMUser", + "LaXarxaMes", + "lbry", + "LCI", + "Lcp", + "LcpPlay", + "Le", + "LearningOnScreen", + "Lecture2Go", + "Lecturio", + "LecturioCourse", + "LecturioDeCourse", + "LeFigaroVideoEmbed", + "LeFigaroVideoSection", + "LEGO", + "Lemonde", + "Lenta", + "LePlaylist", + "Libsyn", + "life", + "likee", + "LinkedIn", + "linkedin", + "Liputan6", + "ListenNotes", + "LiTV", + "LiveJournal", + "Livestreamfails", + "Lnk", + "loc", + "Locipo", + "LocipoPlaylist", + "Loco", + "loom", + "LoveHomePorn", + "LRTRadio", + "LRTStream", + "LRTVOD", + "LSMLREmbed", + "LSMLTVEmbed", + "LSMReplay", + "Lumni", + "maariv.co.il", + "MagellanTV", + "MagentaMusik", + "mailru", + "MainStreaming", + "mangomolo", + "MangoTV", + "ManyVids", + "MaoriTV", + "Markiza", + "MarkizaPage", + "massengeschmack.tv", + "Masters", + "MatchiTV", + "MatchTV", + "mave", + "MBN", + "MDR", + "MedalTV", + "media.ccc.de", + "Mediaite", + "MediaKlikk", + "Medialaan", + "Mediaset", + "MediasetShow", + "Mediasite", + "MediasiteCatalog", + "MediasiteNamedCatalog", + "MediaStream", + "MediaWorksNZVOD", + "Medici", + "megaphone.fm", + "megatvcom", + "Meipai", + "mellowfan", + "MelonVOD", + "Metacritic", + "mewatch", + "MicrosoftBuild", + "MicrosoftEmbed", + "MicrosoftLearnEpisode", + "MicrosoftLearnPlaylist", + "MicrosoftLearnSession", + "MicrosoftMedius", + "minds", + "mir24.tv", + "mirrativ", + "MirrorCoUK", + "mixch", + "mixcloud", + "Mixlr", + "MixlrRecoring", + "MLB", + "MLBArticle", + "MLBTV", + "MLBVideo", + "MLSSoccer", + "MNetTV", + "MNetTVLive", + "MNetTVRecordings", + "MochaVideo", + "Mojevideo", + "Monstercat", + "monstersiren", + "Motorsport", + "MovieFap", + "moviepilot", + "MovingImage", + "MSN", + "mtg", + "mtv", + "MTVUutisetArticle", + "MuenchenTV", + "MujRozhlas", + "Murrtube", + "MurrtubeUser", + "MuseAI", + "MuseScore", + "Mux", + "Mx3", + "Mx3Neo", + "Mx3Volksmusik", + "mxplayer", + "MySpace", + "MySpass", + "MyVideoGe", + "MyVidster", + "Mzaalo", + "n-tv.de", + "N1Info", + "N1InfoAsset", + "NascarClassics", + "Nate", + "NateProgram", + "NationalGeographicTV", + "Naver", + "nba", + "NBC", + "NBCNews", + "nbcolympics", + "NBCSports", + "NBCSportsStream", + "NBCSportsVPlayer", + "NBCStations", + "ndr", + "NDTV", + "nebula", + "NekoHacker", + "Nest", + "NestClip", + "NetAppCollection", + "NetAppVideo", + "netease", + "NetPlusTV", + "NetPlusTVLive", + "NetPlusTVRecordings", + "Netzkino", + "Newgrounds", + "NewsPicks", + "Newsy", + "Nexx", + "NexxEmbed", + "nfb", + "NFHSNetwork", + "nfl.com", + "NhkForSchoolBangumi", + "NhkForSchoolProgramList", + "NhkForSchoolSubject", + "NhkRadioNewsPage", + "NhkRadiru", + "NhkRadiruLive", + "NhkVod", + "NhkVodProgram", + "nhl.com", + "nick.com", + "niconico", + "NiconicoChannelPlus", + "NiconicoUser", + "nicovideo", + "NinaProtocol", + "Nintendo", + "Nitter", + "njoy", + "NobelPrize", + "NoicePodcast", + "NonkTube", + "NoodleMagazine", + "NOSNLArticle", + "Nova", + "NovaEmbed", + "NovaPlay", + "NowCanal", + "nowness", + "Noz", + "npo", + "npo.nl", + "Npr", + "NRK", + "NRKPlaylist", + "NRKRadioPodkast", + "NRKSkole", + "NRKTV", + "NRKTVDirekte", + "NRKTVEpisode", + "NRKTVEpisodes", + "NRKTVSeason", + "NRKTVSeries", + "NRLTV", + "nts.live", + "ntv.ru", + "NubilesPorn", + "Nuvid", + "NYTimes", + "NYTimesArticle", + "NYTimesCookingGuide", + "NYTimesCookingRecipe", + "nzherald", + "NZOnScreen", + "NZZ", + "ocw.mit.edu", + "Odnoklassniki", + "OfTV", + "OfTVPlaylist", + "OktoberfestTV", + "OlympicsReplay", + "Omnyfm", + "OmnyfmPlaylist", + "OmnyfmShow", + "on24", + "OnDemandChinaEpisode", + "OnDemandKorea", + "OnDemandKoreaProgram", + "OneFootball", + "OnePlacePodcast", + "onet.pl", + "onet.tv", + "OnetMVP", + "onsen", + "Opencast", + "OpencastPlaylist", + "orf", + "OsnatelTV", + "OsnatelTVLive", + "OsnatelTVRecordings", + "OutsideTV", + "OwnCloud", + "PacktPub", + "PacktPubCourse", + "PalcoMP3", + "PandaTv", + "Panopto", + "PanoptoList", + "PanoptoPlaylist", + "ParamountPressExpress", + "Parler", + "parliamentlive.tv", + "Parlview", + "parti", + "patreon", + "pbs", + "PBSKids", + "PearVideo", + "PeekVids", + "peer.tv", + "PeerTube", + "peloton", + "PerformGroup", + "periscope", + "PGATour", + "PhilharmonieDeParis", + "phoenix.de", + "Photobucket", + "PiaLive", + "Piapro", + "picarto", + "Piksel", + "Pinkbike", + "Pinterest", + "PinterestCollection", + "Platzi", + "PlatziCourse", + "play.tv", + "player.sky.it", + "PlayerFm", + "PlaySuisse", + "Playtvak", + "PlayVids", + "pluralsight", + "PlutoTV", + "PlyrEmbed", + "PodbayFM", + "PodbayFMChannel", + "Podchaser", + "podomatic", + "PokerGo", + "PokerGoCollection", + "PolsatGo", + "PolskieRadio", + "polskieradio", + "Popcorntimes", + "PopcornTV", + "Pornbox", + "PornerBros", + "PornFlip", + "PornHub", + "PornHubPagedVideoList", + "PornHubPlaylist", + "PornHubUser", + "PornHubUserVideosUpload", + "Pornotube", + "PornoVoisines", + "PornoXO", + "PornTop", + "PornTube", + "Pr0gramm", + "PrankCast", + "PrankCastPost", + "PremiershipRugby", + "PressTV", + "ProjectVeritas", + "PRXAccount", + "PRXSeries", + "prxseries", + "prxstories", + "PRXStory", + "puhutv", + "Pyvideo", + "QDance", + "QingTing", + "qqmusic", + "QuantumTV", + "QuantumTVLive", + "QuantumTVRecordings", + "R7", + "R7Article", + "Radiko", + "RadikoRadio", + "radio.de", + "Radio1Be", + "radiocanada", + "radiofrance", + "RadioFranceLive", + "RadioFrancePodcast", + "RadioFranceProfile", + "RadioFranceProgramSchedule", + "RadioJavan", + "radiokapital", + "RadioRadicale", + "RadioZetPodcast", + "radlive", + "Rai", + "RaiCultura", + "RaiNews", + "RaiPlay", + "RaiPlayLive", + "RaiPlayPlaylist", + "RaiPlaySound", + "RaiPlaySoundLive", + "RaiPlaySoundPlaylist", + "RaiSudtirol", + "RayWenderlich", + "RayWenderlichCourse", + "RbgTum", + "RbgTumCourse", + "RbgTumNewCourse", + "RCS", + "RCSEmbeds", + "RCSVarious", + "RCTIPlus", + "RCTIPlusSeries", + "RCTIPlusTV", + "RDS", + "RedBull", + "RedBullEmbed", + "RedBullTV", + "RedBullTVRrnContent", + "Reddit", + "RedGifs", + "RedGifsSearch", + "RedGifsUser", + "RedTube", + "RENTV", + "RENTVArticle", + "Restudy", + "Reuters", + "ReverbNation", + "RideHome", + "RinseFM", + "RinseFMArtistPlaylist", + "RockstarGames", + "Rokfin", + "rokfin", + "RoosterTeeth", + "RoosterTeethSeries", + "RottenTomatoes", + "RoyaLive", + "Rozhlas", + "RozhlasVltava", + "RTBF", + "RTDocumentry", + "RTDocumentryPlaylist", + "rte", + "rtl.lu", + "rtl.nl", + "rtl2", + "RTLLuLive", + "RTLLuRadio", + "RTNews", + "RTP", + "RTRFM", + "RTS", + "RTVCKaltura", + "RTVCPlay", + "RTVCPlayEmbed", + "rtve.es", + "rtvslo.si", + "RudoVideo", + "Rule34Video", + "Rumble", + "RumbleChannel", + "RumbleEmbed", + "Ruptly", + "rutube", + "Ruutu", + "Ruv", + "ruv.is", + "S4C", + "S4CSeries", + "safari", + "Saitosan", + "SAKTV", + "SAKTVLive", + "SAKTVRecordings", + "SaltTV", + "SaltTVLive", + "SaltTVRecordings", + "SampleFocus", + "Sangiin", + "Sapo", + "SaucePlus", + "SaucePlusChannel", + "SBS", + "sbs.co.kr", + "schooltv", + "ScienceChannel", + "Screen9", + "Screencast", + "Screencastify", + "ScreencastOMatic", + "ScreenRec", + "ScrippsNetworks", + "scrippsnetworks", + "Scrolller", + "sejm", + "Sen", + "SenalColombiaLive", + "senate.gov", + "Servus", + "Sexu", + "SeznamZpravy", + "SeznamZpravyArticle", + "Shahid", + "ShahidShow", + "SharePoint", + "ShemarooMe", + "Shiey", + "ShowRoomLive", + "ShugiinItvLive", + "ShugiinItvLiveRoom", + "ShugiinItvVod", + "SibnetEmbed", + "simplecast", + "Sina", + "Skeb", + "sky", + "sky.it", + "SkylineWebcams", + "skynewsarabia", + "SkyNewsAU", + "Slideshare", + "SlidesLive", + "Slutload", + "smotrim", + "SnapchatSpotlight", + "SoftWhiteUnderbelly", + "Sohu", + "SohuV", + "SonyLIV", + "SonyLIVSeries", + "soop", + "soundcloud", + "SoundcloudEmbed", + "soundgasm", + "southpark.cc.com", + "southpark.de", + "southpark.lat", + "southparkstudios.co.uk", + "southparkstudios.com.br", + "southparkstudios.nu", + "SovietsCloset", + "SovietsClosetPlaylist", + "SpankBang", + "SpankBangPlaylist", + "Spiegel", + "Sport5", + "SportBox", + "sporteurope", + "Spreaker", + "SpreakerShow", + "SproutVideo", + "sr", + "SRGSSR", + "SRGSSRPlay", + "StacommuLive", + "StacommuVOD", + "StagePlusVODConcert", + "startrek", + "startv", + "Steam", + "SteamCommunity", + "SteamCommunityBroadcast", + "StoryFire", + "StoryFireSeries", + "StoryFireUser", + "Streaks", + "Streamable", + "StreamCZ", + "StreetVoice", + "Stripchat", + "stv", + "stvr", + "Subsplash", + "subsplash", + "Substack", + "SunPorno", + "sverigesradio", + "svt", + "Syfy", + "SztvHu", + "t-online.de", + "Tagesschau", + "TapTapApp", + "TapTapAppIntl", + "TapTapMoment", + "TapTapPostIntl", + "tarangplus", + "Tass", + "TBS", + "TBSJPEpisode", + "TBSJPPlaylist", + "TBSJPProgram", + "Teachable", + "TeachableCourse", + "teachertube", + "TeachingChannel", + "Teamcoco", + "TeamTreeHouse", + "techtv.mit.edu", + "TedEmbed", + "TedPlaylist", + "TedSeries", + "TedTalk", + "Tele13", + "Tele5", + "TeleBruxelles", + "TelecaribePlay", + "Telecinco", + "Telegraaf", + "telegram", + "TeleMB", + "Telemundo", + "TeleQuebec", + "TeleQuebecEmission", + "TeleQuebecLive", + "TeleQuebecSquat", + "TeleQuebecVideo", + "TeleTask", + "Telewebion", + "TennisTV", + "TF1", + "TFO", + "theatercomplextown", + "TheChosen", + "TheChosenGroup", + "TheGuardianPodcast", + "TheGuardianPodcastPlaylist", + "TheHighWire", + "TheIntercept", + "ThePlatform", + "ThePlatformFeed", + "TheStar", + "TheSun", + "TheWeatherChannel", + "ThisAmericanLife", + "ThisOldHouse", + "ThisVid", + "ThisVidMember", + "ThisVidPlaylist", + "ThreeSpeak", + "ThreeSpeakUser", + "TikTok", + "tiktok", + "TLC", + "TMZ", + "TNAFlix", + "TNAFlixNetworkEmbed", + "toggle", + "toggo", + "tokfm", + "ToonGoggles", + "tou.tv", + "toutiao", + "Toypics", + "ToypicsUser", + "TravelChannel", + "TrtCocukVideo", + "TrtWorld", + "TrueID", + "TruNews", + "Truth", + "ttinglive", + "Tube8", + "TubeTuGraz", + "TubeTuGrazSeries", + "tubitv", + "Tumblr", + "tunein", + "tv.dfb.de", + "TV2", + "TV2Article", + "TV2DK", + "TV2DKBornholmPlay", + "tv2play.hu", + "tv2playseries.hu", + "TV4", + "TV5MONDE", + "tv5unis", + "tv8.it", + "TVANouvelles", + "TVANouvellesArticle", + "tvaplus", + "TVC", + "TVCArticle", + "TVer", + "tver", + "tvigle", + "TVIPlayer", + "TVN24", + "tvnoe", + "TVO", + "tvopengr", + "tvp", + "TVPlayHome", + "tvw", + "Tweakers", + "TwitCasting", + "TwitCastingLive", + "TwitCastingUser", + "twitch", + "twitter", + "Txxx", + "udemy", + "UDNEmbed", + "UFCTV", + "ukcolumn", + "UlizaPlayer", + "UlizaPortal", + "umg", + "Unistra", + "UnitedNationsWebTv", + "Unity", + "uol.com.br", + "uplynk", + "Urort", + "URPlay", + "USANetwork", + "USAToday", + "ustream", + "ustudio", + "Varzesh3", + "Vbox7", + "Veo", + "Vevo", + "VevoPlaylist", + "VGTV", + "vh1.com", + "vhx", + "vice", + "Viddler", + "Videa", + "video.arnes.si", + "video.google", + "video.sky.it", + "VideoKenPlayer", + "VideoPress", + "Vidflex", + "Vidio", + "VidioLive", + "VidioPremier", + "VidLii", + "Vidly", + "vids.io", + "Vidyard", + "viewlift", + "Viidea", + "vimeo", + "ViMP", + "Viously", + "Viqeo", + "Visir", + "Viu", + "viu", + "ViuOTTIndonesia", + "vk", + "VKPlay", + "VKPlayLive", + "vm.tiktok", + "Vocaroo", + "VODPlatform", + "voicy", + "volejtv", + "VoxMedia", + "VoxMediaVolume", + "vpro", + "vqq", + "vrsquare", + "VRT", + "vrtmax", + "VTM", + "VTV", + "VTVGo", + "VTXTV", + "VTXTVLive", + "VTXTVRecordings", + "Walla", + "WalyTV", + "WalyTVLive", + "WalyTVRecordings", + "washingtonpost", + "wat.tv", + "WatchESPN", + "WDR", + "WDRElefant", + "WDRPage", + "web.archive", + "Webcamerapl", + "Webcaster", + "WebcasterFeed", + "WebOfStories", + "WebOfStoriesPlaylist", + "Weibo", + "WeiboUser", + "WeiboVideo", + "WeiqiTV", + "wetv", + "WeTvSeries", + "Weverse", + "WeverseLive", + "WeverseLiveTab", + "WeverseMedia", + "WeverseMediaTab", + "WeverseMoment", + "WeVidi", + "whowatch", + "Whyp", + "wikimedia.org", + "Wimbledon", + "WimTV", + "WinSportsVideo", + "Wistia", + "WistiaChannel", + "WistiaPlaylist", + "wnl", + "wordpress", + "WorldStarHipHop", + "wppilot", + "wrestleuniverse", + "WSJ", + "WSJArticle", + "WWE", + "wyborcza", + "WyborczaPodcast", + "wykop", + "XboxClips", + "XHamster", + "XHamsterEmbed", + "XHamsterUser", + "XiaoHongShu", + "ximalaya", + "Xinpianchang", + "XMinus", + "XNXX", + "XVideos", + "xvideos", + "XXXYMovies", + "yahoo", + "YandexDisk", + "yandexmusic", + "YandexVideo", + "YandexVideoPreview", + "YapFiles", + "Yappy", + "YappyProfile", + "yfanefa", + "YleAreena", + "YouJizz", + "youku", + "YouNowChannel", + "YouNowLive", + "YouNowMoment", + "YouPorn", + "YouPornCategory", + "YouPornChannel", + "YouPornCollection", + "YouPornStar", + "YouPornTag", + "YouPornVideos", + "youtube", + "YoutubeLivestreamEmbed", + "YoutubeYtBe", + "Zaiko", + "ZaikoETicket", + "zan", + "Zapiks", + "Zattoo", + "ZattooLive", + "ZattooMovies", + "ZattooRecordings", + "zdf", + "ZeeNews", + "ZenPorn", + "ZetlandDKArticle", + "Zhihu", + "zingmp3", + "zoom", + "Zype" +]