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

Uvod je kratak: želim da pričam o YouTube online plejeru za Android sa lokalnim plejlistama, kanalima i preporukama.

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

Prošireni uvod:
Prije nekog vremena suočio sam se sa potpuno istim problemom kao i autor jedne divne aplikacije Bijela lista kanala, i za sebe sam odredio potpuno isti odnos prema njoj: Želim da mogu s vremena na vrijeme djetetu pokloniti tablet ili pametni telefon sa crtanim filmovima, ali nisam nimalo zadovoljan gdje se nakon 2-3 klika Lista preporuka vodi dijete u standardne aplikacije - YouTube klijenti.

Nažalost, nakon instaliranja aplikacije Channel Whitelist, već je imala još jednu prozaičniju, ali ipak fatalnu manu - NIH mi se činio (i, što je najvažnije, mom sinu) njegovo sučelje nije baš zgodno, posebno nakon navike korištenja YouTube Kidsa igrač.

Generalno, nakon nekog vremena sazreo sam da napravim sopstvenu implementaciju. Nakon nekog vremena, postalo je moguće staviti oznaku na prvo izdanje.

Osnovne mogućnosti:

  • Dodajte svoje omiljene kanale i liste za reprodukciju - oni će biti sačuvani i indeksirani u lokalnoj bazi podataka
  • Isključite dodatne videozapise unutar dodatih plejlista ako vam ne trebaju
  • Lista preporuka je nasumično generisana samo od kanala i plejlista dodatih aplikaciji

Izvori su otvoreni, GPLv3 licenca: https://github.com/sadr0b0t/yashlang/

Ono što slijedi je detaljniji pregled glavnih funkcija, plus neke tehničke pojedinosti o tome kako reproducirati YouTube videozapise u vašoj Android aplikaciji bez korištenja Google API-ja i web omotača.

Na glavnom ekranu i na ekranu plejera: nasumične preporuke sa nenasumičnih kanala

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

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

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

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

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

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

Trenutna pretraga u lokalnoj bazi podataka

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

Dodajte novi kanal ili listu za reprodukciju

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

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

Pretražujte po imenu na mreži ili unesite poznatu adresu. Lista video zapisa kanala ili liste za reprodukciju se čuva u lokalnoj bazi podataka, ikone se ne keširaju.

Dinamička lista za reprodukciju - reprodukujte rezultate pretrage

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

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

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

U preporukama ispod videa bit će samo videozapisi koji zadovoljavaju upit za pretraživanje.

Slično tome, ako otvorite videozapis iz postavki liste za reprodukciju, na listi preporuka će se pojaviti samo videozapisi s iste liste za reprodukciju.

Plejliste i kanali se mogu privremeno isključiti i ponovo uključiti

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

Imajte na umu: videozapisi sa onemogućene plejliste također će nestati iz rezultata pretraživanja, historije pregledavanja i liste favorita. Ali ne brinite, oni će se tamo ponovo pojaviti odmah nakon što se lista za reprodukciju ponovo uključi.

Videozapis na crnoj listi

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

Blokirani video se neće pojaviti u preporukama, u rezultatima pretrage, nestat će sa liste favorita i iz historije gledanja. Videozapis će i dalje biti vidljiv u postavkama plejliste.

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

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

Omiljeni video zapisi i historija gledanja

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

Omiljeni video zapisi na ekranu plejera označeni su zvjezdicom u gornjem desnom uglu.

Kontekstni meniji u naslovu ekrana i dugim klikom u galerijama i listama

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

Kopirajte naziv ili adresu videa ili plejliste na ekranu za gledanje ili bilo kojoj listi.

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

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

Aplikacija će odmah izgledati kao na slici iznad.

Nepotrebni kanali i liste za reprodukciju mogu se isključiti ili izbrisati u postavkama.

postavljanje

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 funkcionirati zbog različitih potpisa apk datoteke, prije nego što instalirate verziju iz novog izvora, prvo ćete morati izbrisati instaliranu verziju zajedno s podacima - keširanje liste za reprodukciju i historiju pretraživanja (ili otkrijte kako se ti podaci prenose).

Tehnički detalji

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

Otvoreni kod, besplatna licenca GPLv3.

Pitanje: Da li je scraping sajtova bez dozvole (ili uz izričitu zabranu) autora generalno legalno? Google uklanja aplikacije sa Google Playa, koji ne koriste svoj API, već analiziraju svoje stranice, jer. krše svoj korisnički ugovor.
Odgovor: Naravno, legalno, na vama je koji alat ćete koristiti za čitanje javnih informacija. Nadalje: Američki sud je u potpunosti legalizovao struganje web stranice i zabranio tehničko ometanje, ali Gul možda ima drugačije mišljenje, lično nemam želju ići na američki sud da ih uvjeravam.

Neki kod

biblioteka NewPipeExtractor - projekt pomoćnika igrača Newpipe, omogućava vam da preuzmete listu video zapisa za određeni kanal ili plejlistu, preuzmete detaljne informacije o poznatom videu (ono što je vidljivo na web stranici videa), dobijete adresu ikone videa, a takođe i adresu video stream.

Kod za učitavanje plejliste je malo glomazan, pa ga neću donositi ovde, za one koji su zainteresovani - pogledajte izvor, to je u suštini klasa ContentLoader.

Hajde da vidimo kako da dobijemo adresu video streama sa adrese javne video stranice i pustimo ga u plejeru.

Povežite biblioteku na
app/build.gradle

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

Zanimljivo je da se nakon toga još uvijek ne može koristiti, jer. primjeri će se žaliti na klasu Downloader koja nedostaje. Može se kopirati u projekat iz direktorija automatskih testova NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java - radi za verziju 0.17.4 (izgleda da je ovaj dio preuređen u novijoj verziji biblioteke, ali još uvijek treba provjeriti).

Dobijte adresu video prijenosa sa adrese 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;
    }

ytVidUrl video adresa može biti javna adresa stranice bilo kojeg videozapisa na YouTube stranici, na primjer https://www.youtube.com/watch?v=pd2RlatmNRk

Igrač će exoplayer od samog Google-a. Ovo nije web omotač preko YouTube-a, već pravi plejer koji se može ugraditi za reprodukciju bilo kojeg videa, prilično fleksibilan i prilagodljiv. Uključujući zna kako reproducirati video prijenose s YouTubea, ako navedete ispravnu adresu za to. Upravo smo primili stream adresu, pa da vidimo kako da je pošaljemo igraču.

Povežite biblioteku sa 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 plejera na ekran aplikacije (možete to vidjeti u primjerima na web stranici projekta ili u kodu), samo ćemo pogledati kako započeti reprodukciju videozapisa s YouTubea u playeru na gore dobijena 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 za koje je potrebna prijava na Google/YouTube račun

na primer: Ilya Muromets, Mosfilm Cinema Concern, Ruslan i Ljudmila 1. serija / Ruslan i Ljudmila film 1, Mosfilm Cinema Concern

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

  • Neki emitovani videozapisi za koje usluga vraća nultu dužinu neće se reproducirati (za takve videozapise trajanje na listama i galeriji je označeno kao "[dur undef]")

na primer: Čekati za to! Sva izdanja Soyuzmultfilm HD (Crtani filmovi za djecu), Crtani studija Soyuzmultfilm, Najbolji crtani filmovi Soyuzmultfilm, Crtani studio Soyuzmultfilm

savjet: takve videozapise dodajte na crnu listu.

  • Videozapisi koji su dostupni samo putem direktnih veza možda neće biti uključeni u lokalnu listu za reprodukciju, čak i ako preuzmete sve videozapise korisnika

na primer: Taming the Fire Epizoda 1, Mosfilm Cinema Concern

  • Ako naiđete na javni video koji ne zahtijeva prijavu, reproducira se u pretraživaču, ali se ne reproducira u playeru, pošaljite izvještaj o grešci (sasvim je moguće, problem je već riješen u novoj verziji NewPipeExtractor i trebat ćete samo ažurirati sklop sa ovom verzijom, na primjer).

  • Interfejs može usporiti sa sporim (ali ne isključenim) internetom

Kao rezultat toga,

Sin je sa tableta prešao na Samsung smart TV, koji ne može da pokreće Android aplikacije. Stoga je najbolja roditeljska kontrola i dalje lična.

Ali aplikacija se pokazala dovoljno zgodnom da je i sam počnem koristiti. Prvi utisak iz ranih radnih verzija bio je da sam ušao u drugi svijet. Sav sadržaj se preuzima sa YouTube-a, ali ovo više nije YouTube, već nešto drugo, sigurno i kontrolisano, kao da ste stonogu izvadili iz oka i stavili je u staklenu teglu. I sve je u preporukama.

izvor: www.habr.com

Dodajte komentar