Introducere pe scurt: vreau să vorbesc despre playerul online YouTube pentru Android cu liste de redare locale, canale și recomandări.

Introducere detaliată:
Cu ceva timp în urmă, m-am confruntat exact cu aceeași problemă ca autorul acestei aplicații minunate , și am ajuns să am exact aceeași părere: vreau să pot oferi din când în când copilului meu o tabletă sau un smartphone cu desene animate, dar nu îmi convine deloc unde ajunge copilul după 2-3 clicuri în lista de recomandări din aplicațiile standard — clienții YouTube.
Din păcate, după instalarea aplicației Channel Whitelist, am descoperit deja o altă deficiență, mai prozaică dar totuși fatală — NIH mi s-a părut (și, cel mai important, fiului meu) destul de incomod, mai ales după obișnuința de a folosi playerul YouTube Kids.
În general, după un timp, am decis să fac propria mea implementare. După un alt timp, a devenit posibil să pun eticheta pe prima versiune.
Funcționalități principale:
- Adăugați canalele și listele de redare preferate — acestea vor fi salvate și indexate în baza de date locală
- În interiorul listelor de redare adăugate, dezactivați videoclipurile nedorite, dacă nu vă sunt necesare
- Lista de recomandări este generată aleatoriu doar din canalele și listele de redare adăugate în aplicație
Codul sursă este deschis, licența GPLv3:
Mai departe, o prezentare detaliată a funcționalităților principale, plus câteva detalii tehnice despre cum să redați videoclipuri de pe YouTube în aplicația dumneavoastră pe Android fără a folosi API-ul Google și web wrappers.
Pe ecranul principal și pe ecranul playerului: recomandări aleatorii din canale non-aleatorii
Căutare instantanee în baza de date locală
=>
Adăugați un nou canal sau listă de redare
Căutați după nume online sau inserați adresa bine cunoscută. Lista videoclipurilor canalului sau listei de redare este salvată în baza de date locală, icoanele nu sunt stocate în cache.
Listă de redare dinamică — redați rezultatele căutării
=>
În recomandările de sub videoclip vor apărea doar videoclipuri care satisfac cerința de căutare.
În mod similar, dacă deschideți un videoclip din setările listei de redare, în lista de recomandări vor apărea doar videoclipuri din aceeași listă de redare.
Listelor de redare și canalelor li se poate dezactiva temporar vizibilitatea și pot fi activate din nou
Atenție: videoclipurile dintr-un playlist dezactivat vor dispărea și din rezultatele căutării, istoria vizionărilor și din lista favoritilor. Dar nu trebuie să-ți faci griji, vor apărea din nou imediat ce playlistul va fi reactivat.
Adaugă videoclipul în lista neagră
Un videoclip blocat nu va apărea în recomandări, în rezultatele căutării, va dispărea din lista favoritelor și din istoria vizionărilor. Videoclipul va rămâne totuși vizibil în setările playlistului.
Vizualizează lista neagră și reactivează elementele blocate din greșeală:
Setări > meniul din antet > Lista neagră
Videoclipuri favorite și istoria vizionărilor
Videoclipurile favorite de pe ecranul playerului sunt marcate cu o stea în colțul din dreapta sus.
Meniuri contextuale în antetul ecranului și printr-un clic lung în galerii și liste
Copiază numele sau adresa videoclipului sau a playlistului din ecranul de vizualizare sau din orice listă.
Începe rapid — adaugă canale și playlisturi recomandate
=>
Aplicația va arăta imediat ca în screenshot-urile de mai sus.
Canalele și playlisturile inutile pot fi dezactivate sau șterse în setări.
Instalare
Pagina proiectului:
în limba engleză:
versiuni:
- Pe Google Play nu există și nu va fi disponibil în curând (Google blochează aplicațiile care accesează site-ul lor prin intermediul API-ului, inclusiv menționatul Channel Whitelist sau playerul NewPipe)
- Adună din surse:
- Descarcă apk din secțiunea cu versiunile:
- Sper că va apărea în catalog în curând (, dar nu a avansat de aproape o lună), dar încă nu este
Reține că nu se poate comuta între diferitele versiuni din surse diferite pe același dispozitiv din cauza semnăturilor diferite ale fișierului apk; înainte de a instala o versiune dintr-o sursă nouă, trebuie să dezinstalezi versiunea instalată, inclusiv datele — memoria cache a playlisturilor și istoria vizionărilor (sau să găsești o modalitate de a transfera aceste date).
Detalii tehnice
Nu necesită un cont Google/YouTube, are nevoie doar de internet, folosește biblioteci:
- pentru obținerea datelor de la serviciul YouTube și
- pentru redarea videoclipurilor.
Cod sursă deschis, licență liberă GPLv3.
întrebare: Este legal să parsezi site-uri fără permisiunea (sau cu interdicția explicită) autorilor? , care nu folosesc API-ul lor, ci parsează site-urile acestora, deoarece încalcă termenii și condițiile lor de utilizare.
răspuns: desigur, este legal, este alegerea dumneavoastră ce instrument să folosiți pentru a citi informațiile publice. Mai mult: , dar Google ar putea avea o părere diferită, personal, încă nu am intenția de a merge în instanță în SUA să îi conving.
Puțin cod
Biblioteca — un proiect auxiliar al player-ului , permite descărcarea listei de videoclipuri pentru canalul sau lista de redare specificată, descărcarea informațiilor detaliate despre un videoclip cunoscut (ceea ce este vizibil pe pagina web a videoclipului), obținerea adresei pictogramei videoclipului, precum și obținerea adresei fluxului video.
Codul pentru descărcarea listei de redare este puțin voluminos, așa că nu îl voi include aici, cei interesați — să se uite în surse, în principal este vorba despre clasa .
Să vedem cum obținem adresa fluxului video de la adresa paginii publice a videoclipului și să îl redăm în player.
Conectați biblioteca în
dependencies {
...
// NewPipe: parser youtube
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Curios este că, după aceasta, tot nu va funcționa, deoarece exemplele vor da eroare din cauza lipsei clasei Downloader. Aceasta poate fi copiată în proiect din catalogul testelor automate — funcționează pentru versiunea 0.17.4 (se pare că în versiunea mai nouă a bibliotecii această parte a fost refăcută, dar trebuie să verific încă).
Obțineți adresa fluxului video de la adresa paginii videoclipului pe site-ul YouTube:
public String extractYtStreamUrl(final String ytVidUrl) throws ExtractionException, IOException {
// https://github.com/TeamNewPipe/NewPipeExtractor/blob/dev/extractor/src/test/java/org/schabi/newpipe/extractor/services/youtube/YoutubeStreamExtractorDefaultTest.java
NewPipe.init(Downloader.getInstance(), new Localization("GB", "en"));
final YoutubeStreamExtractor extractor = (YoutubeStreamExtractor) YouTube
.getStreamExtractor(ytVidUrl);
extractor.fetchPage();
final String streamUrl = extractor.getVideoStreams().size() > 0 ? extractor.getVideoStreams().get(0).getUrl() : null;
// for (final VideoStream stream : extractor.getVideoStreams()) {
// stream.getUrl();
// }
return streamUrl;
}Ca adresă a videoclipului ytVidUrl poate fi o adresă publică a paginii oricărui videoclip de pe YouTube, de exemplu
Player-ul va fi de la Google. Aceasta nu este o pachet web pentru YouTube, ci un player integrat autentic pentru redarea oricăror videoclipuri, suficient de flexibil și configurabil. De asemenea, poate reda fluxuri video de pe YouTube, dacă îi dai adresa corectă. Am obținut adresa fluxului abia acum, așa că să vedem cum o trimitem la player.
Conectează biblioteca în proiect :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Nu vom aborda toate detaliile plasării componentului player-ului pe ecranul aplicației (puteți consulta exemplele de pe site-ul proiectului sau în cod), ci ne vom concentra doar asupra modului de a lansa redarea videoclipului de pe YouTube în player folosind adresa obținută mai sus:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// oprește redarea videoclipului curent, dacă a fost încărcat
videoPlayerView.getPlayer().stop(true);
} else {
// https://exoplayer.dev/
// https://github.com/google/ExoPlayer
final Uri mp4VideoUri = Uri.parse(streamUrl);
final MediaSource videoSource = new ProgressiveMediaSource.Factory(videoDataSourceFactory)
.createMediaSource(mp4VideoUri);
// Vom pune pe pauză vechiul videoclip, în timp ce pregătim unul nou
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Dacă punem pe pauză aici după ce playerul a fost deja pe pauză, terminând
// redarea videoclipului, vom obține aici o a doua stare STATE_ENDED, așa că avem nevoie de
// o verificare specială.
// În același timp, valoarea getPlayWhenReady() va rămâne true, de aceea verificăm exact starea.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Pregătim playerul cu sursa.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Vom specifica poziția curentă imediat la încărcarea videoclipului
// (în comentarii se menționează ceva despre sursele de date care susțin sau nu susțin
// trecerile seek la încărcare, se pare că este o prostie - pur și simplu facem seek imediat după încărcare)
// Exoplayer redă noua Playlist de la început în loc de poziția furnizată
// https://github.com/google/ExoPlayer/issues/4375
// Cum să încărcăm stream-ul din poziția dorită? #2197
// https://github.com/google/ExoPlayer/issues/2197
// în acest loc durata normală încă nu este disponibilă, așa că nu o verificăm
//if(seekTo > 0 && seekTo 0) {
// cu 5 secunde mai devreme
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}Probleme cunoscute
- Nu va reda videoclipuri cu restricții de vârstă care necesită autentificare în contul Google/YouTube
de exemplu: ,
sfat: adăugați astfel de videoclipuri în lista neagră sau rugați autorul videoclipului să elimine restricția aplicată din greșeală.
- Nu va reda unele videoclipuri live pentru care serviciul returnează o lungime nulă (pentru astfel de videoclipuri, durata în liste și galerie este marcată ca „[dur undef]”)
de exemplu: ,
sfat: adăugați astfel de videoclipuri în lista neagră.
- Videoclipurile disponibile doar prin linkuri directe pot să nu apară în lista locală de Redare, chiar dacă descărcați toate videoclipurile utilizatorului.
de exemplu:
Dacă întâlniți un videoclip public care nu necesită autentificare, se redă în browser, dar nu în player, trimiteți un raport de eroare (este posibil ca problema să fi fost deja rezolvată în noua versiune, NewPipeExtractor iar pentru aceasta va trebui doar să actualizați construcția cu această versiune, ).
Interfața poate genera întârziere pe internetul lent (dar nu oprit)
În concluzie
Fiul a făcut trecerea de pe tabletă la un televizor inteligent Samsung, care nu poate rula aplicații Android. Prin urmare, cel mai bun control parental este totuși cel personal.
Dar aplicația s-a dovedit a fi suficient de confortabilă pentru a începe să o folosesc eu însumi. Prima impresie din versiunile incipiente funcționale — am pătruns într-o altă lume. Tot conținutul se încarcă de pe YouTube, dar nu este deja YouTube, ci altceva, sigur și controlat, ca și cum ai fi scos o scorpie din ochi și ai pus-o într-un borcan de sticlă. Și este vorba exact despre recomandări.
Sursa: habr.com
