De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

De ynlieding is koart: ik wol prate oer de YouTube online spiler foar Android mei lokale playlists, kanalen en oanbefellings.

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

Utwreide ynlieding:
In skoft lyn kaam ik krekt itselde probleem tsjin as de skriuwer fan in prachtige applikaasje Kanaal Whitelist, en foar mysels krekt deselde hâlding dêrfoar fêststeld: ik wol myn bern sa no en dan in tablet of smartphone mei tekenfilms jaan kinne, mar ik bin hielendal net bliid mei wêr't, nei 2-3 klikken, de list fan oanbefellings yn standert applikaasjes - YouTube kliïnten - nimt it bern.

Spitigernôch, nei it ynstallearjen fan 'e Channel Whitelist-applikaasje, waard in oare mear prozaïske, mar noch fatale flater ûntdutsen - NIH I (en, it wichtichste, myn soan) fûn syn ynterface net heul handich, foaral nei de gewoante om de YouTube Kids-spieler te brûken.

Yn 't algemien wie ik nei in skoft klear om myn eigen ymplemintaasje te meitsjen. Nei ferrin fan tiid waard it mooglik om in tag op de earste release te setten.

Key features:

  • Foegje jo favorite kanalen en playlists ta - se sille wurde bewarre en yndeksearre yn 'e lokale databank
  • Skeakelje ûnnedige fideo's út as jo se net nedich binne binnen tafoege playlists
  • De list mei oanbefellings wurdt allinich willekeurich generearre fan kanalen en playlists tafoege oan 'e applikaasje

Iepen boarne, GPLv3 lisinsje: https://github.com/sadr0b0t/yashlang/

Hjirûnder is in oersjoch fan 'e haadfunksjes yn mear detail, plus wat technyske details oer hoe't jo YouTube-fideo's kinne spielje yn jo Android-applikaasje sûnder de Google API en webwrappers te brûken.

Op it haadskerm en op it spilerskerm: willekeurige oanbefellings fan net-willekeurige kanalen

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

Direkt sykjen yn lokale databank

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) => De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

Foegje in nij kanaal of playlist ta

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

Sykje op namme online of foegje in bekend adres yn. De list mei fideo's fan in kanaal of playlist wurdt bewarre yn 'e lokale databank; ikoanen wurde net yn it cache bewarre.

Dynamyske playlist - spielje sykresultaten

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) => De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

Yn 'e fideo-oanbefellings sille d'r allinich fideo's wêze dy't de sykfraach befredigje.

Lykas, as jo in fideo iepenje fanút de playlistynstellingen, sille allinich fideo's fan deselde playlist ferskine yn 'e list mei oanbefellings.

Playlists en kanalen kinne tydlik út- en wer ynskeakele wurde

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

Tink derom: fideo's fan in útskeakele playlist sille ek ferdwine út sykresultaten, sjochskiednis en út 'e list mei favoriten. Mar meitsje jo gjin soargen, se sille der daliks wer ferskine nei't de playlist wer ynskeakele is.

Foegje in fideo ta oan 'e swarte list

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

In blokkearre fideo sil net werjûn wurde yn oanbefellings, yn sykresultaten, en sil ferdwine út 'e list mei favoriten en út' e besjenskiednis. De fideo sil noch sichtber wêze yn 'e playlist-ynstellingen.

Besjoch de swarte list en aktivearje items opnij ynskeakelje per flater blokkearre:
Ynstellings> kopmenu> Swarte list

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

Favoriete fideo's en besjenskiednis

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

Favorite fideo's op it spielerskerm binne markearre mei in asterisk yn 'e rjochter boppeste hoeke.

Kontekstmenu's yn 'e skermtitel en langklikke yn galeryen en listen

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

Kopiearje de namme of adres fan in fideo of playlist yn it werjaanskerm as yn elke list.

Fluch start - foegje oanrikkemandearre kanalen en playlists ta

De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?) => De dea fan Koshchei is op 'e list mei oanbefellings (is it mooglik om YouTube gesellich en feilich te meitsjen?)

De applikaasje sil daliks lykje op 'e skermôfbyldings hjirboppe.

Net-nedige kanalen en playlists kinne wurde útskeakele of wiske yn 'e ynstellings.

ynstelling

Projektside: https://github.com/sadr0b0t/yashlang/
yn it Ingelsk: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
releases: https://github.com/sadr0b0t/yashlang/releases

Hâld der rekken mei dat it wikseljen tusken ferskate ferzjes fan ferskate boarnen op itselde apparaat net sil wurkje fanwegen ferskillende hantekeningen fan it apk-bestân; foardat jo de ferzje fan in nije boarne ynstallearje, moatte jo earst de ynstalleare ferzje wiskje tegearre mei de gegevens - de playlist-cache en blêdzjeskiednis (of útfine hoe't jo gegevens oerdrage).

Technyske details

Hat gjin Google/YouTube-akkount nedich, jo hawwe allinich it ynternet nedich, brûkt de folgjende biblioteken:

Iepen boarne, fergese GPLv3-lisinsje.

fraach: Is it oer it algemien legaal te scrape websiden sûnder tastimming (of mei in eksplisite ferbod) út de skriuwers? Google ferwideret apps fan Google Play, dy't har API net brûke, mar har siden analysearje, om't se skeine harren brûkersoerienkomst.
antwurdzje: fansels, it is legaal, it is oan jo hokker ark te brûken foar in lêzen iepenbier beskikber ynformaasje. Fierder: In Amerikaanske rjochtbank hat it skrappen fan websiden folslein legalisearre en technyske ynterferinsje dêrmei ferbean., mar Gul kin in oare miening hawwe, persoanlik haw ik noch net de winsk om nei in Amerikaanske rjochtbank te gean om har te oertsjûgjen.

Guon koade

Bibleteek NewPipeExtractor - projekt foar spielerstipe Newpipe, kinne jo in list mei fideo's downloade foar in spesifisearre kanaal of playlist, detaillearre ynformaasje downloade oer in ferneamde fideo (wat is sichtber op 'e webside fan' e fideo), it adres fan it fideo-ikoan krije, en ek it adres fan 'e fideo krije stream.

De koade foar it laden fan de playlist is in bytsje omslachtich, dus ik sil it hjir net jaan, foar belangstellenden, besjoch de boarnekoade, it is yn prinsipe in klasse ContentLoader.

Litte wy sjen hoe't jo it adres fan in fideostream krije fan it adres fan 'e iepenbiere fideoside en it spielje yn' e spiler.

Ferbine de bibleteek oan
app/build.gradle

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

It is nijsgjirrich dat jo it dêrnei noch net brûke kinne, om't ... foarbylden sille kleie oer de ûntbrekkende Downloader klasse. It kin wurde kopieare nei it projekt út 'e automatyske testmap NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java - wurket foar ferzje 0.17.4 (it liket derop dat dit diel is opnij makke yn in nijere ferzje fan 'e bibleteek, mar wy moatte noch kontrolearje).

Krij it adres fan 'e fideostream troch it adres fan' e fideoside op 'e YouTube-webside:

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;
    }

It fideoadres ytVidUrl kin it iepenbiere adres wêze fan 'e side fan elke fideo op' e YouTube-webside, bygelyks https://www.youtube.com/watch?v=pd2RlatmNRk

De spiler sil wêze exoplayer fan Google sels. Dit is gjin webwrapper oer YouTube, mar in echte ynbêde spiler foar it spieljen fan alle fideo's, frij fleksibel en oanpasber. It kin ek fideostreams fan YouTube spielje as jo it it juste adres leverje. Wy hawwe krekt it streamadres krigen, dus litte wy sjen hoe't jo it nei de spiler kinne stjoere.

Ferbine de bibleteek mei it projekt app/build.gradle:

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

Wy sille net beskôgje alle nuânses fan it pleatsen fan de spiler komponint op it applikaasje skerm (jo kinne sjen nei de foarbylden op de projekt webside of yn de koade), wy sille allinne sjen nei hoe't te begjinnen mei it spieljen fan in fideo fan YouTube yn de spiler by it hjirboppe ûntfongen adres:

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);
    }
}

Bekende problemen

  • Sil gjin fideo's spielje mei leeftydsbeperkingen dy't oanmelde by jo Google/YouTube-akkount fereaskje

bygelyks: Ilya Muromets, Mosfilm Cinema Concern, Ruslan en Ljoedmila film 1, Mosfilm Film Concern

advys: foegje sokke fideo's ta oan 'e swarte list of freegje de skriuwer fan 'e fideo om de beheining te ferwiderjen dy't per fersin ynsteld is.

  • Guon útstjoerfideo's wêrfoar de tsjinst nul lingte jout, sille net spielje (foar sokke fideo's is de doer yn 'e listen en galery markearre as "[dur undef]").

bygelyks: Wachtsje derfoar! Alle útjeften fan Soyuzmultfilm HD (Cartoons foar bern), Cartoons út Soyuzmultfilm studio, Top cartoons Soyuzmultfilm, Cartoons út Soyuzmultfilm studio

advys: foegje sokke fideo's ta oan 'e swarte list.

  • Fideo's dy't allinich beskikber binne fia direkte keppelings meie net opnommen wurde yn 'e lokale playlist, sels as jo alle fideo's fan 'e brûker downloade

bygelyks: Taming of Fire Episode 1, Mosfilm Cinema Concern

  • As jo ​​​​in iepenbiere fideo tsjinkomme dy't gjin oanmelding fereasket, spielet yn 'e browser, mar net spielet yn' e spiler, stjoer dan in brekrapport (it is heul mooglik dat it probleem al is reparearre yn 'e nije ferzje NewPipeExtractor en jo sille allinich de gearkomste moatte bywurkje mei dizze ferzje, bygelyks).

  • De ynterface kin fertrage as it ynternet traach is (mar net útskeakele)

As gefolch,

Myn soan ferhuze fan in tablet nei in Samsung smart TV, dy't gjin Android-applikaasjes kin útfiere. Dêrom is de bêste âlderlike kontrôle noch persoanlik.

Mar de applikaasje die bliken handich genôch te wêzen foar my om it sels te begjinnen te brûken. De earste yndruk fan 'e iere wurkferzjes wie dat ik yn in oare wrâld wie. Alle ynhâld wurdt ynladen fan YouTube, mar dit is net mear YouTube, mar wat oars, feilich en kontrolearre, as soe jo nimme in centipede út dyn each en sette it yn in glêzen pot. En it is alles oer de oanbefellings.

Boarne: www.habr.com

Add a comment