Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Die inleiding is kort: Ek wil praat oor die YouTube-aanlynspeler vir Android met plaaslike snitlyste, kanale en aanbevelings.

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Uitgebreide inleiding:
'n Tyd gelede het ek presies dieselfde probleem ondervind as die skrywer van 'n wonderlike toepassing Kanaalwitlys, en het vir myself presies dieselfde houding teenoor haar bepaal: ek wil van tyd tot tyd vir die kind 'n tablet of slimfoon met spotprente kan gee, maar ek is glad nie tevrede met waar, na 2-3 klikke, die lys van aanbevelings lei die kind in standaard toepassings - YouTube kliënte.

Ongelukkig, nadat die Channel Whitelist-toepassing geïnstalleer is, het dit reeds 'n ander meer prosaïese, maar steeds noodlottige fout gehad - NIH het vir my (en, bowenal, vir my seun) gelyk of sy koppelvlak nie baie gerieflik was nie, veral na die gewoonte om die YouTube Kids te gebruik speler.

Oor die algemeen het ek na 'n tyd volwasse geword om my eie implementering te maak. Na 'n ruk het dit moontlik geword om 'n merker op die eerste vrystelling te plaas.

Belangrikste kenmerke:

  • Voeg jou gunsteling kanale en snitlyste by - hulle sal in die plaaslike databasis gestoor en geïndekseer word
  • Skakel ekstra video's binne die bygevoegde snitlyste af as jy dit nie nodig het nie
  • Die lys aanbevelings word net lukraak gegenereer uit die kanale en snitlyste wat by die toepassing gevoeg is

Bronne is oop, GPLv3-lisensie: https://github.com/sadr0b0t/yashlang/

Wat volg is 'n oorsig van die hoofkenmerke in meer besonderhede, plus 'n paar tegniese besonderhede oor hoe om YouTube-video's in jou Android-toepassing te speel sonder om die Google API's en webomhulsels te gebruik.

Op die hoofskerm en op die spelerskerm: ewekansige aanbevelings van nie-ewekansige kanale

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Onmiddellike soektog in die plaaslike databasis

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) => Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Voeg 'n nuwe kanaal of snitlys by

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Soek op naam aanlyn of voeg 'n bekende adres in. Die lys video's van 'n kanaal of snitlys word op 'n plaaslike databasis gestoor, ikone word nie in die kas gekas nie.

Dinamiese snitlys - speel soekresultate

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) => Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

In die aanbevelings onder die video sal daar slegs video's wees wat aan die soektog voldoen.

Net so, as jy 'n video vanaf die snitlysinstellings oopmaak, sal slegs video's van dieselfde snitlys in die aanbevelingslys verskyn.

Snitlyste en kanale kan tydelik afgeskakel en weer aangeskakel word

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Let wel: video's van die gedeaktiveerde snitlys sal ook uit die soekresultate, blaaigeskiedenis en uit die gunstelinglys verdwyn. Maar moenie bekommerd wees nie, hulle sal weer daar verskyn onmiddellik nadat die snitlys weer aangeskakel is.

Swartlys video

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

'n Geblokkeerde video sal nie in aanbevelings verskyn nie, in soekresultate, sal uit die lys gunstelinge en uit die kykgeskiedenis verdwyn. Die video sal steeds in die snitlysinstellings sigbaar wees.

Bekyk die swartlys en heraktiveer items wat per ongeluk geblokkeer is:
Instellings > kopkieslys > Swartlys

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Gunsteling video's en kykgeskiedenis

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Gunstelingvideo's op die spelerskerm word met 'n asterisk in die regter boonste hoek gemerk.

Kontekskieslyste in die skermtitel en op lang klik in galerye en lyste

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Kopieer die naam of adres van 'n video of snitlys in die kykskerm of enige lys.

Vinnige begin - voeg aanbevole kanale en snitlyste by

Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?) => Dood van Koshchei in die lys van aanbevelings (is dit moontlik om YouTube knus en veilig te maak?)

Die toepassing sal onmiddellik soos die skermkiekies hierbo lyk.

Onnodige kanale en snitlyste kan in die instellings afgeskakel of uitgevee word.

installasie

Projek bladsy: https://github.com/sadr0b0t/yashlang/
in Engels: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
vrystellings: https://github.com/sadr0b0t/yashlang/releases

Hou in gedagte dat om te skakel tussen verskillende weergawes van verskillende bronne op dieselfde toestel nie sal werk nie as gevolg van verskillende handtekeninge van die apk-lêer, voordat u die weergawe vanaf 'n nuwe bron installeer, sal u eers die geïnstalleerde weergawe saam met die data moet uitvee - snitlyskas en blaaigeskiedenis (of vind uit hoe hierdie data oordra).

Tegniese besonderhede

Vereis nie 'n Google / YouTube-rekening nie, slegs die internet is nodig, gebruik biblioteke:

Oopbron, gratis lisensie GPLv3.

Vraag: Is skraapplekke sonder die toestemming (of met 'n uitdruklike verbod) van die skrywers oor die algemeen wettig? Google verwyder programme van Google Play af, wat nie hul API gebruik nie, maar hul werwe ontleed, want. hulle oortree hul gebruikersooreenkoms.
Antwoord: Sekerlik, wettig, dit is aan jou watter instrument om te gebruik om publieke inligting te lees. Verder: Die Amerikaanse hof het die skraap van webwerf heeltemal gewettig en verbied dat dit tegnies belemmer word, maar Gul mag dalk 'n ander mening hê, persoonlik het ek geen begeerte om na 'n Amerikaanse hof te gaan om hulle te oortuig nie.

Sommige kode

Biblioteek NewPipeExtractor - speler helper projek Nuwe pyp, laat jou toe om 'n lys video's vir die gespesifiseerde kanaal of snitlys af te laai, gedetailleerde inligting oor 'n bekende video af te laai (wat op die webbladsy van die video sigbaar is), die adres van die video-ikoon te kry, en ook die adres van die videostroom.

Die kode vir die laai van die snitlys is 'n bietjie omslagtig, so ek sal dit nie hierheen bring nie, vir diegene wat belangstel - kyk na die bron, dit is basies 'n klas ContentLoader.

Kom ons kyk hoe om die adres van die videostroom van die adres van die publieke videobladsy te kry en dit in die speler te speel.

Koppel die biblioteek aan
app/build.gradle

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

Dit is eienaardig dat dit daarna steeds nie gebruik kan word nie, want. die voorbeelde sal kla oor die vermiste Downloader-klas. Dit kan vanaf die outomatiese toetsgids na die projek gekopieer word NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java - werk vir weergawe 0.17.4 (dit blyk dat hierdie deel in 'n nuwer weergawe van die biblioteek oorgedoen is, maar nog nagegaan moet word).

Kry die adres van die videostroom vanaf die adres van die videobladsy op die YouTube-webwerf:

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

Die ytVidUrl-video-adres kan byvoorbeeld die publieke adres van die bladsy van enige video op die YouTube-werf wees https://www.youtube.com/watch?v=pd2RlatmNRk

Die speler sal eksospeler van Google self. Dit is nie 'n webomhulsel oor YouTube nie, maar 'n regte inbedbare speler om enige video's te speel, redelik buigsaam en aanpasbaar. Insluitend weet hoe om videostrome vanaf YouTube te speel, as jy die korrekte adres daarvoor spesifiseer. Ons het pas die stroomadres ontvang, so kom ons kyk hoe om dit na die speler te stuur.

Koppel die biblioteek aan die projek app/build.gradle:

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

Ons sal nie al die nuanses van die plasing van die spelerkomponent op die toepassingskerm oorweeg nie (jy kan dit in die voorbeelde op die projekwebwerf of in die kode sien), ons sal net kyk hoe om video's vanaf YouTube in die speler te begin speel by die adres hierbo verkry:

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 probleme

  • Sal nie video's speel met ouderdomsbeperkings wat 'n Google-/YouTube-rekeningaanmelding vereis nie

byvoorbeeld: Ilya Muromets, Mosfilm Cinema Concern, Ruslan and Lyudmila 1ste reeks / Ruslan and Lyudmila film 1, Mosfilm Cinema Concern

raad: voeg sulke video's by die swartlys of vra die skrywer van die video om die beperking wat per abuis gestel is, te verwyder.

  • Sommige uitsaaivideo's waarvoor die diens nul-lengte teruggee, sal nie speel nie (vir sulke video's is die tydsduur in die lyste en galery gemerk as "[dur undef]").

byvoorbeeld: Wag vir dit! Alle uitgawes Soyuzmultfilm HD (Strokiesprente vir kinders), Spotprente van Soyuzmultfilm-ateljee, Top spotprente Soyuzmultfilm, Spotprentateljee Soyuzmultfilm

wenk: voeg sulke video's by die swartlys.

  • Video's wat slegs deur direkte skakels beskikbaar is, sal dalk nie by die plaaslike snitlys ingesluit word nie, selfs al laai jy al die gebruiker se video's af

byvoorbeeld: Taming the Fire Episode 1, Mosfilm Cinema Concern

  • As jy 'n publieke video teëkom wat nie 'n aanmelding vereis nie, in die blaaier speel, maar nie in die speler speel nie, stuur 'n foutverslag (dit is heel moontlik, die probleem is reeds reggestel in die nuwe weergawe NewPipeExtractor en jy hoef net die samestelling met hierdie weergawe op te dateer, byvoorbeeld).

  • Die koppelvlak kan stadiger word met 'n stadige (maar nie afgeskakel nie) internet

Uiteindelik

Die seun het van 'n tablet na 'n Samsung-slim-TV beweeg, wat nie Android-toepassings kan laat loop nie. Daarom is die beste ouerlike beheer steeds persoonlik.

Maar die toepassing was gerieflik genoeg vir my om dit self te begin gebruik. Die eerste indruk van die vroeë werkweergawes was dat ek in 'n ander wêreld beland het. Alle inhoud word van YouTube afgelaai, maar dit is nie meer YouTube nie, maar iets anders, veilig en beheer, asof jy 'n duisendpoot uit jou oog haal en dit in 'n glasfles sit. En dit gaan alles oor die aanbevelings.

Bron: will.com

Voeg 'n opmerking