Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Uvod je kratak: želim govoriti o YouTube online playeru za Android s lokalnim popisima za reprodukciju, kanalima i preporukama.

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Prošireni uvod:
Prije nekog vremena sam se susreo s potpuno istim problemom kao i autor jedne prekrasne aplikacije Popis dopuštenih kanala, i za sebe sam odredio potpuno isti stav prema tome: želim svom djetetu s vremena na vrijeme dati tablet ili pametni telefon s crtićima, ali nisam nimalo zadovoljan gdje se nakon 2-3 klika nalazi popis preporuka u standardnim aplikacijama - YouTube klijentima - uzima dijete.

Nažalost, nakon instaliranja aplikacije Channel Whitelist, otkrivena je još jedna prozaičnija, ali još uvijek kobna mana - NIH ja (i, što je najvažnije, moj sin) smatrao sam da njegovo sučelje nije baš zgodno, pogotovo nakon navike korištenja YouTube Kids playera.

Općenito, nakon nekog vremena bio sam spreman za vlastitu implementaciju. Nakon nekog vremena postalo je moguće staviti oznaku na prvo izdanje.

Glavne značajke:

  • Dodajte svoje omiljene kanale i popise za reprodukciju - oni će biti spremljeni i indeksirani u lokalnoj bazi podataka
  • Unutar dodanih popisa za reprodukciju isključite nepotrebne videozapise ako vam nisu potrebni
  • Popis preporuka generira se nasumično samo iz kanala i popisa za reprodukciju dodanih u aplikaciju

Otvoreni kod, GPLv3 licenca: https://github.com/sadr0b0t/yashlang/

U nastavku je detaljniji pregled glavnih značajki, plus neke tehničke pojedinosti o tome kako reproducirati YouTube videozapise u svojoj Android aplikaciji bez korištenja Google API-ja i web omotača.

Na glavnom zaslonu i na zaslonu playera: nasumične preporuke s kanala koji nisu slučajni

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Trenutno pretraživanje u lokalnoj bazi podataka

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) => Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Dodajte novi kanal ili popis za reprodukciju

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Pretražujte po imenu na mreži ili unesite poznatu adresu. Popis videozapisa kanala ili popisa za reprodukciju sprema se u lokalnu bazu podataka; ikone se ne pohranjuju u predmemoriju.

Dinamički popis za reprodukciju - reproducirajte rezultate pretraživanja

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) => Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

U preporukama videozapisa bit će samo videozapisi koji zadovoljavaju upit pretraživanja.

Slično, ako otvorite videozapis iz postavki popisa za reprodukciju, na popisu preporuka pojavit će se samo videozapisi s istog popisa za reprodukciju.

Popisi za reprodukciju i kanali mogu se privremeno isključiti i ponovno uključiti

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Imajte na umu: videozapisi s onemogućenog popisa za reprodukciju također će nestati iz rezultata pretraživanja, povijesti gledanja i s popisa favorita. Ali ne brinite, oni će se tamo ponovno pojaviti odmah nakon ponovnog uključivanja popisa za reprodukciju.

Dodajte videozapis na crnu listu

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Blokirani video neće biti prikazan u preporukama, u rezultatima pretraživanja te će nestati s popisa favorita i iz povijesti gledanja. Videozapis će i dalje biti vidljiv u postavkama popisa za reprodukciju.

Pogledajte crnu listu i ponovno omogućite stavke blokirane greškom:
Postavke > izbornik zaglavlja > Crna lista

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Omiljeni videozapisi i povijest gledanja

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Omiljeni videozapisi na zaslonu playera označeni su zvjezdicom u gornjem desnom kutu.

Kontekstni izbornici u naslovu zaslona i dugi klik u galerijama i popisima

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Kopirajte naziv ili adresu videozapisa ili popisa za reprodukciju na zaslonu za gledanje ili na bilo kojem popisu.

Brzi početak - dodajte preporučene kanale i popise za reprodukciju

Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?) => Smrt Koshcheija je na popisu preporuka (je li moguće YouTube učiniti ugodnim i sigurnim?)

Aplikacija će odmah izgledati kao na gornjim snimkama zaslona.

Nepotrebni kanali i playliste mogu se isključiti ili izbrisati u postavkama.

Instalacija

Stranica projekta: https://github.com/sadr0b0t/yashlang/
na engleskom: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
izdanja: https://github.com/sadr0b0t/yashlang/releases

Imajte na umu da prebacivanje između različitih verzija iz različitih izvora na istom uređaju neće raditi zbog različitih potpisa apk datoteke; prije instaliranja verzije iz novog izvora prvo ćete morati izbrisati instaliranu verziju zajedno s podacima - predmemoriju popisa za reprodukciju i povijest pregledavanja (ili smislite kako prenijeti podatke).

Tehnički detalji

Ne zahtijeva Google/YouTube račun, potreban vam je samo internet, koristi sljedeće biblioteke:

Otvorenog koda, besplatna GPLv3 licenca.

pitanje: Je li općenito legalno strugati web stranice bez dopuštenja (ili uz izričitu zabranu) autora? Google uklanja aplikacije s Google Playa, koji ne koriste njihov API, već analiziraju svoje stranice, jer krše svoj korisnički ugovor.
odgovor: naravno, legalno je, na vama je kojim ćete alatom čitati javno dostupne informacije. Nadalje: Američki sud u potpunosti je legalizirao scraping web stranice i zabranio tehničko ometanje iste., ali Gul možda ima drugačije mišljenje, osobno još nemam želju ići na američki sud da ih uvjeravam.

Neki kod

knjižnica NewPipeExtractor - projekt podrške igračima NewPipe, omogućuje vam preuzimanje popisa videozapisa za određeni kanal ili popis za reprodukciju, preuzimanje detaljnih informacija o poznatom videozapisu (što je vidljivo na web stranici videozapisa), dobivanje adrese ikone videozapisa i također dobivanje adrese videozapisa potok.

Kod za učitavanje playliste je malo glomazan, pa ga neću navoditi ovdje, za one koje zanima neka pogledaju izvorni kod, to je u biti klasa ContentLoader.

Pogledajmo kako dobiti adresu video streama s adrese javne video stranice i reproducirati je u playeru.

Povežite knjižnicu s
app/build.gradle

dependencies {
...
    // NewPipe: youtube parser
    // https://github.com/TeamNewPipe/NewPipeExtractor
    implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}

Zanimljivo je da ga nakon ovoga još uvijek nećete moći koristiti, jer... primjeri će se žaliti zbog nedostajuće klase Downloader. Može se kopirati u projekt iz direktorija automatiziranih testova NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java - radi za verziju 0.17.4 (čini se da je ovaj dio prerađen u novijoj verziji biblioteke, ali još trebamo provjeriti).

Dobijte adresu video streama prema adresi video stranice na web stranici YouTube:

app/src/main/java/su/sadrobot/yashlang/controller/ContentLoader.java

    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 adresa ytVidUrl može biti javna adresa stranice bilo kojeg videozapisa na YouTube web stranici, na primjer https://www.youtube.com/watch?v=pd2RlatmNRk

Igrač će biti egzoplayer od samog Googlea. Ovo nije web omot preko YouTubea, već pravi ugrađeni player za reprodukciju bilo kojeg videa, prilično fleksibilan i prilagodljiv. Također može reproducirati video streamove s YouTubea ako mu date točnu adresu. Upravo smo primili adresu streama, pa da vidimo kako je poslati playeru.

Povežite knjižnicu s projektom app/build.gradle:

dependencies {
...
    // google Exoplayer
    // https://github.com/google/ExoPlayer
    // https://exoplayer.dev/
    implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}

Nećemo razmatrati sve nijanse postavljanja komponente playera na zaslon aplikacije (možete pogledati primjere na web stranici projekta ili u kodu), samo ćemo pogledati kako pokrenuti reprodukciju videozapisa s YouTubea u playeru na gore primljena adresa:

app/src/main/java/su/sadrobot/yashlang/WatchVideoActivity.java

private void playVideoStream(final String streamUrl, final long seekTo) {
    if (streamUrl == null) {
        // остановить проигрывание текущего ролика, если был загружен
        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);

        // Поставим на паузу старое видео, пока готовим новое
        if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
            // Если ставить на паузу здесь после того, как плеер встал на паузу сам, закончив
            // играть видео, получим здесь второе событие STATE_ENDED, поэтому нам нужна здесь
            // специальная проверка.
            // При этом значение getPlayWhenReady() останется true, поэтому проверяем именно состояние.
            // https://github.com/google/ExoPlayer/issues/2272
            videoPlayerView.getPlayer().setPlayWhenReady(false);
        }

        // Prepare the player with the source.
        ((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);

        // Укажем текущую позицию сразу при загрузке видео
        // (в коментах что-то пишут что-то про датасорсы, которые поддерживают или не поддерживают
        // переходы seek при загрузке, похоже, что это фигня - просто делаем seek сразу после загрузки)
        // Exoplayer plays new Playlist from the beginning instead of provided position
        // https://github.com/google/ExoPlayer/issues/4375
        // How to load stream in the desired position? #2197
        // https://github.com/google/ExoPlayer/issues/2197
        // в этом месте нормлаьный duration еще не доступен, поэтому его не проверяем
        //if(seekTo > 0 && seekTo < videoPlayerView.getPlayer().getDuration()) {
        if (seekTo > 0) {
            // на 5 секунд раньше
            videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
        }
        videoPlayerView.getPlayer().setPlayWhenReady(true);
    }
}

poznati problemi

  • Neće reproducirati videozapise s dobnim ograničenjima koji zahtijevaju prijavu na vaš Google/YouTube račun

na primjer: Ilya Muromets, Mosfilm Cinema Concern, Ruslan i Ljudmila film 1, Mosfilm Film Concern

savjet: dodajte takve videozapise na crnu listu ili zamolite autora videozapisa da ukloni greškom postavljeno ograničenje.

  • Neki emitirani videozapisi za koje usluga vraća nultu duljinu neće se reproducirati (za takve videozapise trajanje na popisima i u galeriji označeno je kao "[dur undef]")

na primjer: Čekaj! Sva izdanja Soyuzmultfilm HD (Crtani za djecu), Crtani iz studija Soyuzmultfilm, Vrhunski crtani filmovi Soyuzmultfilm, Crtani iz studija Soyuzmultfilm

savjet: dodajte takve videozapise na crnu listu.

  • Videozapisi koji su dostupni samo putem izravnih veza možda neće biti uključeni u lokalni popis za reprodukciju, čak i ako preuzmete sve korisnikove videozapise

na primjer: Ukroćenje vatre epizoda 1, Mosfilm Cinema Concern

  • Ako naiđete na javni video koji ne zahtijeva prijavu, reproducira se u pregledniku, ali se ne reproducira u playeru, pošaljite izvješće o bugu (sasvim je moguće da je problem već riješen u novoj verziji NewPipeExtractor i samo ćete morati ažurirati sklop s ovom verzijom, na primjer).

  • Sučelje se može usporiti ako je internet spor (ali nije isključen)

Kao rezultat toga,

Moj sin je s tableta prešao na Samsung Smart TV, koji ne može pokrenuti Android aplikacije. Stoga je najbolja roditeljska kontrola i dalje osobna.

Ali aplikacija se pokazala dovoljno zgodnom da je i sam počnem koristiti. Prvi dojam iz ranih radnih verzija bio je da sam u drugom svijetu. Sav sadržaj se skida s YouTubea, ali ovo više nije YouTube, već nešto drugo, sigurno i kontrolirano, kao da ste izvadili stonogu iz oka i stavili je u staklenku. I sve je u preporukama.

Izvor: www.habr.com

Dodajte komentar