A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

L'intruduzioni hè corta: vogliu parlà di u lettore in linea di YouTube per Android cù playlists, canali è cunsiglii lucali.

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

Introduzione ampliata:
Qualchì tempu fà, aghju affruntatu esattamente u listessu prublema cum'è l'autore di una maravigliosa applicazione Lista bianca di u canali, è determinatu per mè stessu esattamente a listessa attitudine versu ella: vogliu pudè dà à u zitellu una tavuletta o un smartphone cù cartoni di u tempu à u tempu, ma ùn sò micca cuntentu di induve, dopu à 2-3 clics, u lista di ricumandazioni porta u zitellu in applicazioni standard - i clienti YouTube.

Sfortunatamente, dopu avè installatu l'applicazione Channel Whitelist, hà digià avutu un altru difettu più prosaicu, ma ancu fatale - NIH mi pareva (è, più impurtante, à u mo figliolu) a so interfaccia ùn hè micca assai còmuda, soprattuttu dopu l'abitudine di utilizà YouTube Kids. ghjucadore.

In generale, dopu qualchì tempu aghju maturatu per fà a mo propria implementazione. Dopu qualchì tempu, hè diventatu pussibule di mette una tag in a prima liberazione.

Funzioni chjave:

  • Aghjunghjite i vostri canali è playlists preferiti - seranu salvati è indexati in a basa di dati lucale
  • Disattiva i video extra in i playlists aghjuntu se ùn ne avete micca bisognu
  • A lista di cunsiglii hè generata aleatoriamente solu da i canali è i playlists aghjuntu à l'applicazione

I fonti sò aperti, licenza GPLv3: https://github.com/sadr0b0t/yashlang/

Ciò chì seguita hè una panoramica di e funzioni principali in più detail, più alcuni dettagli tecnichi nantu à cumu ghjucà i video di YouTube in a vostra app Android senza utilizà l'API di Google è i wrappers web.

Nantu à u screnu principale è in u screnu di u lettore: cunsiglii aleatorii da i canali non aleatorii

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

Ricerca immediata in a basa di dati lucale

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) => A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

Aghjunghjite un novu canale o playlist

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

Cerca per nome in linea o inserisci un indirizzu cunnisciutu. A lista di video di un canale o playlist hè salvatu in una basa di dati lucale, l'icone ùn sò micca cache.

Playlist dinamica - ghjucà i risultati di ricerca

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) => A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

In i cunsiglii sottu u video, ci saranu solu video chì satisfacenu a ricerca di ricerca.

In listessu modu, se apre un video da i paràmetri di a playlist, solu i video da a listessa playlist appariscenu in a lista di cunsiglii.

Playlists è canali ponu esse temporaneamente disattivati ​​è riattivati

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

Per piacè nutate: i video da a playlist disattivata spariranu ancu da i risultati di ricerca, a storia di navigazione è da a lista di preferiti. Ma ùn vi preoccupate micca, apparisceranu di novu immediatamente dopu chì a playlist hè stata riattivata.

Video di lista negra

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

Un video bluccatu ùn apparirà micca in i cunsiglii, in i risultati di ricerca, sparirà da a lista di preferiti è da a storia di visualizazione. U video serà sempre visibile in i paràmetri di a playlist.

Vede a lista negra è riattivate l'articuli bluccati per errore:
Settings> menù header> Blacklist

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

Video preferiti è storia di visualizazione

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

I video preferiti nantu à a pantalla di u lettore sò marcati cù un asteriscu in l'angulu superiore dirittu.

Menu di cuntestu in u titulu di a pantalla è cliccà longu in galerie è liste

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

Copia u nome o l'indirizzu di un video o playlist in a pantalla di vigilia o qualsiasi lista.

Inizio rapidu - aghjunghje canali è playlists cunsigliatu

A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?) => A morte di Koshchei in a lista di cunsiglii (hè pussibule di fà YouTube accogliente è sicuru?)

L'applicazione sarà immediatamente cum'è i screenshots sopra.

I canali è playlists inutili ponu esse disattivati ​​o sguassati in i paràmetri.

rimarchevuli

Pagina di prughjettu: https://github.com/sadr0b0t/yashlang/
in inglese: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
libera: https://github.com/sadr0b0t/yashlang/releases

Tenite in mente chì cambià trà e diverse versioni da diverse fonti nantu à u stessu dispositivu ùn funziona micca per via di e diverse firme di u schedariu apk, prima di stallà a versione da una nova fonte, prima vi tuccherà à sguassà a versione installata cù i dati - cache di playlist è storia di navigazione (o scopre cumu si trasferisce questi dati).

Dettagli tecnichi

Ùn richiede micca un contu Google / YouTube, solu Internet hè necessariu, usa biblioteche:

Open source, licenza libera GPLv3.

Quistione: I siti di scraping senza u permessu (o cù una prohibizione esplicita) di l'autori sò generalmente legale? Google elimina l'applicazioni da Google Play, chì ùn utilizanu micca a so API, ma analizà i so siti, perchè. violanu u so accordu d'utilizatore.
Risposta: Certu, legale, tocca à voi quale strumentu aduprà per leghje l'infurmazione publica. In più: U tribunale di i Stati Uniti hà legalizatu cumplettamente u scraping di u situ web è hà pruibitu di esse tecnicamente ostruitu, ma Gul pò avè una opinione diversa, personalmente ùn aghju micca u desideriu di andà in un tribunale americanu per cunvince.

Qualchì codice

affairs NewPipeExtractor - prughjettu di l'aiutu di u ghjucatore NewPipe, permette di scaricà una lista di video per u canali o playlist specificati, scaricate infurmazioni detallate nantu à un video famosu (ciò chì hè visibile nantu à a pagina web di u video), uttene l'indirizzu di l'icona di u video, è ancu uttene l'indirizzu di u video. u flussu di video.

U codice per a carica di a playlist hè un pocu ingombrante, per quessa ùn l'aghju micca purtatu quì, per quelli chì anu interessatu - fighjate à a fonte, hè basicamente una classa. ContentLoader.

Videmu cumu uttene l'indirizzu di u flussu di video da l'indirizzu di a pagina di video publicu è ghjucà in u lettore.

Cunnette a biblioteca à
app/build.gradle

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

Hè curiosu chì dopu ùn pò ancu esse usatu, perchè. l'esempii si lagnaranu di a classa di Downloader mancante. Pò esse copiatu à u prugettu da u repertoriu di teste automatiche NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java - travaglia per a versione 0.17.4 (pare chì sta parte hè stata rifatta in una versione più nova di a biblioteca, ma deve esse verificatu).

Ottene l'indirizzu di u flussu di video da l'indirizzu di a pagina di video nantu à u situ di 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;
    }

L'indirizzu video ytVidUrl pò esse l'indirizzu publicu di a pagina di qualsiasi video in u situ di YouTube, per esempiu https://www.youtube.com/watch?v=pd2RlatmNRk

U ghjucatore farà exoplayer da Google stessu. Questu ùn hè micca un wrapper web nantu à YouTube, ma un veru lettore incrustable per ghjucà qualsiasi video, abbastanza flessibile è persunalizabile. Includendu sapi cumu ghjucà i flussi video da YouTube, se specificate l'indirizzu currettu per questu. Avemu appena ricevutu l'indirizzu di u flussu, dunque vedemu cumu mandà à u lettore.

Cunnette a biblioteca à u prugettu app/build.gradle:

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

Ùn cunsideremu micca tutte e sfumature di mette u cumpunente di u lettore nantu à a pantalla di l'applicazione (pudete vede in l'esempii nantu à u situ web di u prugettu o in u codice), avemu da vede solu cumu cumincià à ghjucà video da YouTube in u lettore à l'indirizzu ottenutu sopra:

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

Issues Cunnisciute

  • Ùn riproduce micca video cù restrizioni d'età chì necessitanu un login di u contu Google/YouTube

per esempiu: Ilya Muromets, Mosfilm Cinema Concern, Ruslan è Lyudmila 1a serie / Ruslan è Lyudmila film 1, Mosfilm Cinema Concern

Cunsigliu: aghjunghje tali video à a lista negra o dumandate à l'autore di u video per sguassà a restrizione stabilita per sbagliu.

  • Certi video broadcast per i quali u serviziu torna a lunghezza zero ùn saranu micca ghjucati (per tali video, a durata in i listi è a galeria hè marcata cum'è "[dur undef]").

per esempiu: Aspetta! All Issues Soyuzmultfilm HD (Cartoni per i zitelli), Cartoni animati di Soyuzmultfilm studio, Top cartoons Soyuzmultfilm, Cartoons studio Soyuzmultfilm

punta: aghjunghje tali video à a lista negra.

  • I video chì sò dispunibuli solu attraversu ligami diretti ùn ponu micca esse inclusi in a playlist locale, ancu s'è scaricate tutti i video di l'utilizatori.

per esempiu: Taming the Fire Episode 1, Mosfilm Cinema Concern

  • Sè avete un video publicu chì ùn hà micca bisognu di login, ghjoca in u navigatore, ma ùn ghjoca micca in u lettore, mandate un rapportu di bug (hè abbastanza pussibule, u prublema hè digià risoltu in a nova versione). NewPipeExtractor è avete solu bisognu di aghjurnà l'assemblea cù sta versione, per esempiu).

  • L'interfaccia pò rallentà cù un Internet lento (ma micca disattivatu).

Par via di cunsiquenza,

U figliolu si trasfirìu da una tableta à una smart TV Samsung, chì ùn pò micca eseguisce l'applicazioni Android. Dunque, u megliu cuntrollu parentale hè sempre persunale.

Ma l'applicazione hè stata abbastanza cunvene per mè per cumincià à aduprà da mè stessu. A prima impressione da e prime versioni di travagliu era chì aghju in un altru mondu. Tuttu u cuntenutu hè telecaricatu da YouTube, ma questu ùn hè più YouTube, ma qualcosa d'altru, sicuru è cuntrullatu, cum'è s'ellu avete pigliatu un centipede da u vostru ochju è u mette in un vasu di vetru. È tuttu hè nantu à i cunsiglii.

Source: www.habr.com

Add a comment