Lühike sissejuhatus: tahan rääkida Androidi YouTube'i veebimängijast, mis toetab kohalikke esitusloendeid, kanaleid ja soovitusi.

Pikem sissejuhatus:
Mõni aeg tagasi seisin silmitsi sama probleemiga, millega oli kokku puutunud ka selle toreda rakenduse autor , ja mul oli sellele sama hoiak: tahan aeg-ajalt anda lapsele tahvelarvuti või nutitelefoni, et ta saaks vaadata jooniseid, kuid mind ei rahulda üldse, kuhu standardrakendustes — YouTube'i klientides — 2-3 klõpsuga last juhatatakse.
Kahjuks, pärast Channel Whitelist rakenduse installimist avastasin, et seal on veel üks igapäevasem, kuid siiski hävitav puudus — NIH tundus mulle (ja, mis peamine, pojale) mitte väga mugav oma kasutajaliides, eriti pärast YouTube Kids mängija kasutamise harjumust.
Kokkuvõttes olin mõne aja pärast valmis oma versiooni looma. Veel hiljem oli võimalik esialgse väljalaske jaoks sildiga tuleb.
Põhifunktsioonid:
- Lisage oma lemmikkanalid ja esitusloendid — need salvestatakse ja indekseeritakse kohalikku andmebaasi.
- Lisatud esitusloendites keelake tarbetud videod, kui need pole vajalikud.
- Soovituste nimekiri genereeritakse juhuslikult ainult rakendusse lisatud kanalitest ja esitusloenditest.
Allikad on avatud, litsents GPLv3:
Edasi on põhifunktsioonide ülevaade põhjalikumalt, pluss mõned tehnilised detailid selle kohta, kuidas mängida YouTube'i videosid teie Androidi rakenduses ilma Google'i API ja veebikatteta.
Peamesel ekraanil ja mängija ekraanil: juhuslikud soovitused mitte-juhuslikest kanalitest.
Kohene otsing kohalikus andmebaasis.
=>
Lisa uus kanal või esitusloend.
Otsi nime järgi veebis või kleepige tuntud aadress. Kanali või esitlusloendi videod salvestatakse kohalikku andmebaasi, ikoonid ei vahemälustata.
Dünaamiline esitlusloend — mängi otsingu tulemusi.
=>
Videote soovitustes kuvatakse ainult videod, mis vastavad otsingupäringule.
Sarnasel viisil, kui avada video esitlusloendi seadistustest, kuvatakse soovituste nimekirjas ainult selle sama esitlusloendi videod.
Esitusloendeid ja kanaleid saab ajutiselt keelata ja taas aktiveerida.
Pange tähele: välja lülitatud mänguplaadi videod kaovad samuti otsitulemustest, vaatamisloost ja lemmikute loendist. Kuid ärge muretsege, need ilmuvad kohe tagasi, kui mänguplaat taas sisse lülitatakse.
Lisa video musta nimekirja
Blokeeritud video ei näidata soovitustes, otsingutulemustes, see kaob lemmikute loendist ja vaatamisloost. Video jääb siiski nähtavaks mänguplaani seadetes.
Vaata musta nimekirja ja lülita ekslikult blokeeritud elemendid uuesti sisse:
Seaded > menüü ülaosas > Musta nimekirja
Lemmikvideod ja vaatamisajalugu
Lemmikvideod mängija ekraanil on tähistatud tärniga paremas ülanurgas.
Kontekstimenüüd ekraani ülaosas ja pika vajutusega galeriides ja loendites
Kopeeri video või mänguplaadi nimi või aadress vaatamisekraanilt või igast loendist.
Kiire algus — lisa soovitatud kanaleid ja mänguplaate
=>
Rakendus näeb kohe välja nagu ülaltoodud ekraanipiltidel.
Ebavajalikke kanaleid ja mänguplaate saab seadetes välja lülitada või kustutada.
Installeerimine
Projekti leht:
inglise keeles:
väljaanded:
- Google Play's utilizes нет и ближайшее время не будет (Google банит приложения, которые в обход API парсят их сайт, в т.ч. упомянутый Channel Whitelist или плеер NewPipe)
- Koguda allikad:
- Lae alla apk versioonid jaotises releasidest:
- Loodan, et mõne aja pärast ilmub katalooge (, kuid edasi ei liigu peaaegu kuu aega), kuid praegu puudub
Pange tähele, et erinevate versioonide vahel vahetamine erinevatelt allikatelt ühel seadmel ei õnnestu, kuna apk-failidel on erinevad allkirjad; enne uue allika versiooni installimist peate eelnevalt olemasoleva versiooni koos andmete — mänguloo ja vaatamise ajalooga — kustutama (või välja mõtlema, kuidas need andmed üle kanda).
Tehnilised üksikasjad
Ei nõua Google/YouTube'i kontot, vajalik on ainult internet, kasutab teeke:
- YouTube'i teenuse andmete saamiseks ja
- videote esitamiseks.
Avaallikas, tasuta GPLv3 litsents.
küsimus: Kas on seaduslik saidid ilma autorite loata (või selge keeldumisega) skramada? , mis kasutavad nende API-d, vaid sirvivad nende veebisaite, kuna nad rikuvad nende kasutustingimusi.
vastus: muidugi, see on seaduslik, teie asi, millist tööriista kasutada avalike andmete lugemiseks. Veelgi enam: , kuid Google'il võib olla teine arvamus, isiklikult mul ei ole veel soovi minna Ameerika kohtusse neid ümber veenma.
Veidi koodi
Raamatukogu — mängija tugiprojekt , võimaldab laadida ülesannete loendi antud kanali või mängu loendi jaoks, alla laadida tuntud video üksikasjad (see, mis on nähtav video veebilehel), saada video ikooni aadress ja samuti saada video voo aadress.
Kood mängu loendi laadimiseks on veidi kohmakas, seega ei tohi ma seda siin tuua, kellel huvi — vaadake lähtekoodi, peamiselt on see klass .
Vaadakem, kuidas saada video voogude aadress avaliku video lehe aadressi kaudu ja mängida seda mängijas.
Ühendage teek failis
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Huvitav on see, et pärast seda ei saa seda ikkagi kasutada, kuna näited kurdavad puuduva klassi Downloader'i üle. Selle saab kopeerida projekti automaatsete testide kataloogist. — töötab versiooniga 0.17.4 (tundub, et uuema versiooni raamatukogus on see osa ümber tehtud, kuid seda tuleb veel kontrollida).
Saada video voogesituse aadress video lehe aadressi kaudu veebilehel 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;
}Video aadressina võib ytVidUrl olla igasugune avalik aadress igasugusele videole veebilehel YouTube, näiteks
Mängija on Google'ilt endalt. See ei ole veebikatted YouTube'ist, vaid tõeline manustatav mängija, mis suudab mängida igasuguseid videoid, olles piisavalt paindlik ja kohandatav. See suudab ka mängida YouTube'i videoid, kui anda talle õige aadress. Aadressi saime just nüüd, seega vaatame, kuidas see mängijasse saata.
Lisa projektile teek :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Keskendume ainult sellele, kuidas käivitada video esitamine YouTube'is mängijas saadud aadressi järgi, mitte ei käsitle kõiki mängijakomponendi ekraanile paigutamise nüansse (saate vaadata projekti saidi näidiseid või koodi).
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// peatama praeguse video esituse, kui see on laaditud
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);
// Paneme vana video pausile, kuni valmistame uut
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Kui paned siin pausile pärast seda, kui mängija ise pausile on jäänud, lõpetades
// video esitamise, saame siin teise sündmuse STATE_ENDED, seega on meil siin
// eriline kontroll vajalik.
// Sel juhul jääb getPlayWhenReady() väärtus true, seega kontrollime just seisundit.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Valmistame mängija allika jaoks ette.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Määrame hetke positsiooni kohe video laadimise ajal
// (kommentaarides öeldakse midagi allika toetamise kohta või mitte toetamise kohta
// et laagmised, tundub, et see on vale - lihtsalt teeme seek kohe pärast laadimist)
// Exoplayer mängib uut Playlist'i algusest peale, mitte antud positsioonist
// https://github.com/google/ExoPlayer/issues/4375
// Kuidas laadida voog soovitud positsioonil? #2197
// https://github.com/google/ExoPlayer/issues/2197
// sel hetkel normaalne kestus pole veel saadaval, seega ei kontrolli seda
//if(seekTo > 0 && seekTo 0) {
// 5 sekundit varem
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}Tuntud probleemid
- Ei mängi vanusepiiranguga videoid, mis nõuavad Google'i/YouTube'i kontole sisselogimist
näiteks: ,
soovitus: lisage sellised videod musta nimekirja või paluge video autori kanda piirang, mis on ekslikult seadistatud.
- Ei mängi mõningaid voogedastuse videoid, mille puhul teenus tagastab nullpikkuse (selliste videote kestus nimekirjades ja galeriis on märgitud kui «[dur undef]»)
näiteks: ,
soovitus: lisage sellised videod musta nimekirja.
- Videod, mis on saadaval ainult otse linkide kaudu, ei pruugi sattuda kohalikku mängunimekirja, isegi kui laadite üles kõik kasutaja videod
näiteks:
Kui leiate avaliku video, mis ei nõua sisselogimist, mängib brauseris, kuid ei mängi mängijas, saatke veateade (on täiesti võimalik, et probleem on juba uues versioonis parandatud) NewPipeExtractor ja peab lihtsalt värskendama ehitust selle versiooniga, ).
Liides võib aeglustuda nõrgas (kuid mitte välja lülitatud) internetis
In conclusion,
Poeg kolis tahvelarvuti juurest Samsungi nutiteleri, mis ei suuda Androidi rakendusi käivitada. Seetõttu on parim vanemlik kontroll endiselt isiklik.
Kuid rakendus osutus piisavalt mugavaks, et hakkasin seda isegi kasutama. Varajastest tööversioonidest saadud esmamulje — tundsin end nagu teises maailmas. Kõik sisu laaditakse YouTube'ist, kuid see ei ole enam YouTube, vaid midagi muud, ohutumat ja kontrollitavat, nagu oleksin eemaldanud silmast skolopendri ja pannud selle klaaspurki. Ja asi on tõepoolest soovitustes.
Allikas: habr.com
