Jak chránit své dítě před odpadky na YouTube a vytvořit si vlastní přehrávač s bílou listinou kanálů

Dlouho se diskutuje o tom, zda dávat malým dětem přístup k tabletům a chytrým telefonům. Někteří říkají, že to škodí jejich zraku nebo psychice, zatímco jiní tvrdí, že by si rodiče měli s dětmi sami hrát a číst, a ne se je snažit chránit pomocí elektronických zařízení. Je příznačné, že tyto komentáře často pronášejí lidé, kteří vlastní děti nemají. A neznají tu blaženost, když dítě alespoň na půl hodiny zmlkne, přestane ničit všechno kolem sebe a klidně si lehne na gauč a dívá se na kreslené filmy. Dalším argumentem je, že děti jsou velmi citlivé na jednání svých rodičů, a pokud jsou rodiče neustále přilepení ke svým telefonům, je velmi těžké jim vysvětlit, proč jejich rodiče mohou dělat věci a oni ne.

Jak chránit své dítě před odpadky na YouTube a vytvořit si vlastní přehrávač s bílou listinou kanálů

Obecně po mně můžete házet shnilá rajčata, ale můj syn, kterému teď pár dní chybí tři roky, si čas od času lehne na gauč s tabletem a dívá se na kreslené filmy na YouTube.

Bohužel jsem si rychle uvědomil, že dětský YouTube je prostě PEKELNÝ ODPAD. Už o tom psal i Habr. byl tam překlad článkuDětské kanály jsou bezedné žumpy plné lahodných videí typu „rozbalování stovky vajíček Kinder Surprise“, „hloupé říkanky s mizernou 3D grafikou doprovázené hlasitou hudbou“ a „závodění s autíčky v Beam NG a poslech hloupých komentářů“. Z nějakého důvodu je to všechno neuvěřitelně lákavé pro malé děti, které se vrhají na taková videa, jakmile je uvidí jako doporučená. A YouTube vám neumožňuje spravovat doporučení. I když dám synovi tablet s přehrávanými „normálními“ kreslenými filmy, během pár minut sleduji, jak po pouhých dvou kliknutích na doporučení znovu najde ta zatracená čokoládová vajíčka a začne se na ně znovu upoutat.

Už toho bylo dost, rozhodl jsem se. Tak jsem začal vytvářet vlastní aplikaci pro YouTube, která vám umožní vybrat si seznam kanálů a zobrazuje videa pouze z těchto kanálů. Jak jsem to udělal, je uvedeno níže.

Zde je jeden příklad brakových videí, proti kterým budeme bojovat. Špatně natočená, bezvýznamná 3D animace s hloupou hudbou – a 142 milionů zhlédnutí. Z nějakého důvodu videa jako tato děti prostě zombifikují; jsou připravené se na ně dívat znovu a znovu.

Přehrát video

Pro porovnání stupnic - nejvíc cool video kde Chris Hadfield zpívá s kytarou na ISS, má pouze 40 milionů zhlédnutí a Skvělý klip OK GO se skutečnou beztíží (žádné kabely ani chroma klíč, jen poctivá beztíže na palubě speciálního letadla) - pouze 12 milionů, desetkrát méně.

Mimochodem, inzerenti na YouTube a sami nejsou spokojeni s popularitou dětských kanálů, protože zobrazování reklam na nich je plýtvání rozpočtem. Děti se dívají na reklamy, někdy na ně i klikají, ale nic si nekoupí, a miliony zhlédnutí rychle vyčerpávají rozpočet.

Formulace problému

Hned musím říct, že jsem si nekladl za cíl vytvořit neproniknutelnou aplikaci pro děti. Takové pokusy už byly učiněny, včetně zde na Habru – všechno se odřízlo, aby se zabránilo dětem opustit aplikaci, cokoli si koupit, otevřít prohlížeč atd. Existují také možnosti s hardwarovými zámky, deaktivovanými porty, vlastními skiny Androidu a dalšími komplikacemi (například zde je článek (Pro rok 2012 se zdá, že projekt stále žije). To vše ale dává smysl pro starší děti, které již zkoumají možnosti svých vychytávek. Pro děti ve věku 2-3 let není potřeba žádná zvláštní ochrana; naprosto bez problémů si pustí videa a občas kliknou na miniatury jiných videí. Hlavní je, aby tato videa byla ta správná, ne to, co jim navrhuje YouTube (který nabídne nekonečné množství čokoládových vajíček a dětských prstů).

Z toho se zrodil seznam požadavků:

  • Přizpůsobitelný seznam kanálů
  • Ochrana před změnami (většinou před náhodnými, protože mazané dospělé děti už mají spoustu způsobů, jak zjistit hesla svých rodičů)
  • Samotná aplikace je podobná YouTube, vlevo se přehrává video a vpravo sloupec náhledů, na které můžete kliknout.
  • Hlavním případem použití je náhodné klikání na video; dítěti je vlastně jedno, na co přesně se bude dívat.

Funkce aplikace se skládá ze dvou hlavních částí: vyhledávání a nastavení kanálů pomocí API dat YouTube a poté přehrávání videa. V současné době jsem našel dvě možnosti pro přehrávání videí v nativní aplikaci:

Youtube Android API přehrávače

https://developers.google.com/youtube/android/player/

Toto je oficiální způsob přehrávání videí v aplikaci pro Android. Aby to fungovalo, musí být v zařízení uživatele již nainstalována oficiální aplikace YouTube, která obsahuje službu, kterou mohou používat i jiné aplikace. Rozhraní Player API je tedy malá knihovna, která interaguje se samostatně nainstalovanou aplikací.

Nejdřív jsem to zkusil, ale po chvíli používání jsem si uvědomil, že má kritický problém. Není možné správně přizpůsobit vzhled přehrávače, včetně ovládání tlačítek (jediná možnost je úplně vše skrýt, ale pak přijdete o tlačítko pro zobrazení na celou obrazovku). A ovládací panel přehrávače má ošklivé tlačítko „Přepnout na YouTube“, které otevírá oficiální aplikaci (která je na zařízení nutností), jež už nemá žádné filtry. Děti na něj snadno (omylem nebo ne) kliknou, přepnou na nefiltrovanou aplikaci a během pár minut zase slyším „prstečku, prstečku, kde jsi?“ a vidím na obrazovce úchvatné animace odpadků.

Více odpadků, které děti najdou jen pár kliknutími. Přes 900 milionů zhlédnutí!

Přehrát video

Proto jsem opustil oficiální přehrávač a našel náhradu v podobě následující knihovny.

Android-Přehrávač YouTube

https://github.com/PierfrancescoSoffritti/android-youtube-player

Knihovna se jeví jako obal kolem WebView a ovládá webový přehrávač prostřednictvím svého JavaScript API. Mezi její výhody patří možnost plně si přizpůsobit rozhraní.

Inicializace přehrávače je trochu matoucí, zejména po přechodu z oficiální knihovny:

  1. Získáme pohled na třídu com.pierfrancescosoffritti.androidyoutubeplayer.player.YouTubePlayerView
  2. Voláme to initialize() a předáme posluchači.
  3. Posluchač volá metodu onInitSuccess(@Nonnull final YouTubePlayer youTubePlayer), která přijímá instanci objektu přehrávače. Toto je jediný způsob, jak ji získat. Až do tohoto bodu byl proces inicializace identický s procesem oficiálního klienta.
  4. Voláme metodu addListener() hráče a předáme jí další posluchač (více posluchačů pro boha posluchačů!).
  5. Metoda onReady() tohoto posluchače je volána – teprve poté můžete načítat a zobrazovat videa a používat přehrávač. Pokud se omylem pokusíte něco načíst v onInitSuccess, knihovna začne hlásit podivné chyby.

Životní cyklus přehrávače můžete spravovat ručně (zastavení přehrávání v onPause() a podobně) nebo můžete svůj pohled zaregistrovat jako pozorovatel životního cyklu (pro kterého musí vaše aktivita rozšiřovat AppCompatActivity). V tomto případě knihovna postará o veškerou rutinní práci za vás.

Dalším zvláštním aspektem knihovny je absence podpory celoobrazovkového režimu ihned po instalaci. Tlačítko pro jeho aktivaci je v přehrávači standardně přítomno, ale k ničemu nevede. V podstatě musíte režim celé obrazovky povolit ručně – skrýt grafické rozhraní, maximalizovat okno přehrávače a poté ho obnovit. To může být docela složité, pokud máte kolem přehrávače složité rozhraní. Ten můj obsahoval pouze seznam videí, který lze snadno skrýt ručně.

Ukázky knihoven obsahují třídu FullScreenHelper, ze které můžete extrahovat potřebný kód. Její použití vypadá přibližně takto:

youTubePlayerView.addFullScreenListener(new YouTubePlayerFullScreenListener() {

            private final View rootLayout = findViewById(R.id.rootLayout);

            @Override
            public void onYouTubePlayerEnterFullScreen() {
                fullScreenHelper.enterFullScreen();
                rootLayout.setPadding(0, 0, 0, 0);
            }

            @Override
            public void onYouTubePlayerExitFullScreen() {
                fullScreenHelper.exitFullScreen();
                rootLayout.setPadding(8, 8, 8, 8);
                youTubePlayerView.getLayoutParams().height = LinearLayout.LayoutParams.MATCH_PARENT;
                  }
        });

FullScreenHelper skryje nepotřebné prvky rozhraní a nastaví příznaky zobrazení. Také jsem musel upravit nastavení okrajů (vím, že konstanty v kódu jsou zlo) a z nějakého důvodu se výška při ukončení režimu celé obrazovky resetovala, pokud jsem ji ručně neupravil.

Celkově má ​​tato knihovna spoustu nevýhod, ale všechny jsou vyváženy její hlavní výhodou – možností přizpůsobit si rozhraní přehrávače. Mně stačilo skrýt tlačítko „Zobrazit na YouTube“ a zároveň zachovat režim celé obrazovky:

youTubePlayerView.getPlayerUIController().showFullscreenButton(true);
youTubePlayerView.getPlayerUIController().showYouTubeButton(false);

Obecně lze ovládat všechna tlačítka, zobrazovat aktuální čas, přidávat vlastní zobrazení atd. - v důsledku toho tato knihovna z hlediska možností přizpůsobení nechává svého oficiálního konkurenta daleko za sebou.

Po nastavení přehrávače se nové video načte jednoduše takto: youTubePlayer.loadVideo(url, startTime);

Získávání seznamů videí, práce s YouTube Data API

Stále musíte někde získat URL adresu videa. Naštěstí má YouTube bohaté API, které vám umožňuje provádět nejrůznější vyhledávací dotazy a získávat informace o kanálu. Abyste ho mohli začít používat, potřebujete připojte to ve vaší Vývojářské konzoli a získejte klíč.

Aby aplikace fungovala, potřebujeme dvě funkce: vyhledávání kanálů a získání seznamu videí pro daný kanál. Vyhledávání vypadá přibližně takto: chceme prohledávat kanály a playlisty pro dotaz „Peppa Pig“. Zajímá nás ID (abychom si později mohli stáhnout seznam videí pro daný kanál podle jeho ID) a úryvek kódu, který obsahuje základní informace o entitě: název, náhledový obrázek a popis.

 YouTube.Search.List searchListByKeywordRequest = youTube.search().list("snippet,id");
 searchListByKeywordRequest.setMaxResults(10L);
 searchListByKeywordRequest.setQ("Peppa Pig");
 searchListByKeywordRequest.setType("channel,playlist");
 searchListByKeywordRequest.setKey("<api key>");
 SearchListResponse response = searchListByKeywordRequest.execute();

Je důležité správně specifikovat seznam částí objektu (v tomto případě úryvek a ID), které chceme načíst. Rozhraní YouTube API používá poměrně složitý systém omezování požadavků: ve výchozím nastavení je denní kvóta jeden milion jednotek, ale jeden požadavek může spotřebovat mnoho jednotek. Požadavky na zápis (nahrávání videí nebo změna playlistů) spotřebují nejvíce, ale požadavky na čtení mohou také spotřebovat značné množství. Požadavky na čtení spotřebují jednu jednotku kvóty na jednotku plus dvě jednotky pro každý fragment dat. Například výše uvedený požadavek spotřebuje 5 jednotek (jednu pro samotný požadavek a dvě pro fragment úryvku a ID). Úplný požadavek na všechna data kanálu, který má šest fragmentů, by spotřeboval 13 jednotek. Pro videa je k dispozici 10 fragmentů, takže plný požadavek by spotřeboval 21 jednotek kvóty. Proto má smysl požadovat pouze to, co potřebujete.

Požadavek na získání seznamu videí z kanálu vypadá takto:

YouTube.Search.List request = youTube.search().list("snippet,id");
request.setChannelId("<channel id>");
request.setType("video");
request.setMaxResults(50L);
request.setKey("<api key>");
SearchListResponse response = request.execute();

Způsob, jakým je odpověď rozdělena na stránky, je trochu nejasný. Místo explicitního zadání čísla stránky a počtu výsledků může odpověď obsahovat parametr nextPageToken. Pokud je přítomen, znamená to, že se ještě objeví další stránky. Tento parametr je třeba umístit do objektu požadavku a požadavek spustit znovu.

if (response.getNextPageToken() != null) {
    request.setPageToken(response.getNextPageToken());
    response = request.execute();
}

Celkově je API dobře zdokumentované, s hotovými ukázkami kódu v mnoha jazycích, vzorovými dotazy pro spuštění v prohlížeči atd.

Uživatelská zkušenost

Poté, co byla první verze hotová, začalo testování. Nejprve na mé rodině, pak jsem ji vydal na Google Play a začal sbírat zpětnou vazbu od uživatelů. Okamžitě se objasnily některé nuance:

  1. Kromě kanálů jsme potřebovali i playlisty. Protože jeden kanál často kombinoval slušná videa s naprostým brakem. Například Teremok TV má slušné kreslené filmy o princeznách a všechny možné ohromující kraviny (jako „Beep“ nebo „Dr. Mašinková“), takže přidání celého kanálu bylo nežádoucí.
  2. A pak jsou tu jednotlivá videa. Například existují kanály, které nabízejí kolekce jako „všechny epizody kresleného seriálu v jednom videu“ a opět chcete vybrat jednotlivá videa, nikoli celý kanál.
  3. Potřeboval jsem se vrátit k předchozímu videu. Protože hysterie dítěte, které omylem kliklo na další video a nemůže se vrátit k tomu, které právě sledovalo, není žádná legrace.
  4. Teď si uvědomuji, že potřebuji i funkci vyhledávání. Protože „chci kreslený film o autech a duchovi“ a v aplikaci zatím žádná funkce vyhledávání není, takže bych mohl strávit dlouhou dobu pátráním v naději, že ten náhodný vyhledávač konečně najde ten zatracený kreslený film.
  5. O deaktivaci tlačítka pro zobrazení na YouTube jsem již psal výše.
  6. Také bych rád přidal režim připnutí – počínaje Androidem 5 můžete nastavit tak, aby pro minimalizaci aplikace bylo nutné stisknout a podržet několik tlačítek najednou.

Pokud se někomu nápad líbil, https://play.google.com/store/apps/details?id=ru.sundogs.youtubekiosk Bezplatná verze umožňuje přidat pouze tři kanály. Napište mi soukromou zprávu a já vám dám klíč k odemčení. Každý, kdo chce podpořit vývoj, si může zakoupit odemykací kód přímo v aplikaci. Mezitím pomalu vylepšuji nové funkce na základě požadavků a jsem rád, že si teď můžu být jistý kvalitou toho, co můj syn sleduje.

A ne, netráví celý den před tabletem; spíše dává přednost procházkám a aktivním hrám, hraní na schovávanou a honění, kreslení na všechno (od tapet po hračky) a večer miluje poslouchání příběhů. Tablet a kreslené filmy jsou jen jedním z mnoha způsobů, jak se dítě může zabavit, ale patří také k těm nejobtížnějším na ovládání. Právě s tím se moje aplikace částečně snaží bojovat.

UPDMnoho lidí si žádalo o klíče, takže jsem si je mohl omylem smíchat a poslat stejný klíč více lidem. Pokud se vám tedy zobrazuje zpráva, že platnost klíče vypršela nebo jej nelze najít, dejte mi vědět a já vám pošlu nový. Klíč je třeba zadat v sekci „Promo kódy“ v Play Marketu.

UPD2Jak jsem byl varován v komentářích, Google ukončil mou aplikaci a můj vývojářský účet. Soudě dle toho, co se píše na Habru, je stěžování si nebo snaha zjistit, co je s Googlem špatně, naprosto zbytečné.

UPD3Odpojil jsem aplikaci od rozhraní API od Googlu. Nyní si můžete stáhnout soubor APK zde: https://channelwhitelist.tilda.wsUtře si obličej, Google!

Zdroj: www.habr.com

Kupte si spolehlivý hosting pro stránky s DDoS ochranou, VPS VDS servery 🔥 Kupte si spolehlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster