Introduzione breve: voglio parlare del lettore online di YouTube per Android con playlist locali, canali e raccomandazioni.

Introduzione dettagliata:
Qualche tempo fa ho affrontato proprio il problema descritto dall'autore della meravigliosa applicazione , e ho stabilito per me stesso lo stesso atteggiamento nei suoi confronti: voglio avere la possibilità di dare occasionalmente a mio figlio un tablet o uno smartphone con cartoni animati, ma non mi soddisfa affatto dove le raccomandazioni degli applicativi standard di YouTube portano il bambino dopo 2-3 clic.
Sfortunatamente, dopo l'installazione dell'applicazione Whitelisting Canali, ho trovato un'altra mancanza più prosaica, ma comunque fatale — l'interfaccia non mi è sembrata molto comoda, soprattutto dopo essermi abitato all'uso del lettore YouTube Kids.
In generale, dopo qualche tempo, ho deciso di realizzare la mia implementazione. Dopo un po' di tempo è stato possibile impostare un tag per il primo rilascio.
Caratteristiche principali:
- Aggiungi i tuoi canali e playlist preferiti: saranno salvati e indicizzati in un database locale
- All'interno delle playlist aggiunte, disattiva i video non necessari, se non ti servono
- La lista delle raccomandazioni viene generata casualmente solo dai canali e playlist aggiunti all'app
I sorgenti sono aperti, licenza GPLv3:
Di seguito una panoramica delle principali funzionalità in dettaglio, più alcune informazioni tecniche su come riprodurre video da YouTube nella tua applicazione Android senza utilizzare l'API di Google e le web wrapper.
Nella schermata principale e nella schermata del lettore: raccomandazioni casuali da canali non casuali
Ricerca istantanea nel database locale
=>
Aggiungi un nuovo canale o playlist
Cerca per nome online o incolla un indirizzo noto. La lista dei video del canale o della playlist viene salvata nel database locale, le icone non vengono memorizzate nella cache.
Playlist dinamica — riproduci i risultati della ricerca
=>
Nelle raccomandazioni sotto il video ci saranno solo i video che soddisfano la query di ricerca.
In modo analogo, se apri un video dalle impostazioni della playlist, nella lista delle raccomandazioni ci saranno solo video di quella stessa playlist.
Le playlist e i canali possono essere disattivati temporaneamente e riattivati
Si prega di notare che i video di una playlist disattivata scompariranno anche dai risultati di ricerca, dalla cronologia di visualizzazione e dall'elenco dei preferiti. Ma non preoccuparti, riappariranno immediatamente dopo che la playlist sarà riattivata.
Aggiungi video alla lista nera
Il video bloccato non verrà visualizzato nelle raccomandazioni, nei risultati di ricerca, scomparirà dall'elenco dei preferiti e dalla cronologia di visualizzazione. Il video sarà ancora visibile nelle impostazioni della playlist.
Visualizza la lista nera e riattiva gli elementi bloccati per errore:
Impostazioni > menu in alto > Lista nera
Video preferiti e cronologia di visualizzazione
I video preferiti sullo schermo del lettore sono contrassegnati da una stella nell'angolo in alto a destra.
Menu contestuali nell'intestazione dello schermo e con una lunga pressione nelle gallerie e negli elenchi
Copia il nome o l'indirizzo del video o della playlist dallo schermo di visualizzazione o da qualsiasi elenco.
Avvio rapido — aggiungi canali e playlist consigliati
=>
L'applicazione apparirà immediatamente come negli screenshot sopra.
Puoi disattivare o rimuovere canali e playlist non desiderati nelle impostazioni.
Installazione
Pagina del progetto:
in lingua inglese:
rilasci:
- Su Google Play non è presente e non sarà presente a breve (Google blocca le applicazioni che effettuano il scraping del loro sito bypassando l'API, compreso il menzionato Channel Whitelist o il lettore NewPipe)
- Compila dagli sorgenti:
- Scarica l'apk dalla sezione dei rilasci:
- Spero che apparirà nel catalogo tra un po' (, ma non si è più mosso da quasi un mese), ma per ora non c'è nulla
Tieni presente che non sarai in grado di passare tra diverse versioni provenienti da diverse fonti su un unico dispositivo a causa delle diverse firme del file apk; prima di installare una versione da una nuova fonte, dovrai prima disinstallare la versione già installata insieme ai dati — la cache delle playlist e della cronologia di visualizzazione (oppure pensare a come trasferire questi dati).
Dettagli tecnici
Non richiede un account Google/YouTube, è necessaria solo una connessione a Internet, utilizza le librerie:
- per ottenere dati dal servizio YouTube e
- per la riproduzione video.
Codice sorgente aperto, licenza libera GPLv3.
Domanda: È legale fare scraping di siti senza il permesso (o con esplicito divieto) degli autori? , che non utilizzano la loro API e fanno scraping dei loro siti, poiché violano il loro accordo con l'utente.
Risposta: certo, è legale, spetta a voi quale strumento utilizzare per leggere le informazioni pubbliche. Inoltre: , ma Gul potrebbe avere un'opinione diversa; personalmente, non ho ancora voglia di andare in tribunale americano a convincerli.
Un po' di codice
La libreria — un progetto ausiliario per il lettore , consente di scaricare l'elenco dei video per un determinato canale o playlist, scaricare informazioni dettagliate su un video noto (ciò che è visibile sulla pagina web del video), ottenere l'indirizzo dell'icona del video e anche ottenere l'indirizzo del flusso video.
Il codice per scaricare la playlist è un po' ingombrante, quindi qui non lo presenterò; chi è interessato può dare un'occhiata al sorgente, in gran parte è la classe .
Vediamo come ottenere l'indirizzo del flusso video dall'indirizzo della pagina pubblica del video e riprodurlo nel lettore.
Collegare la libreria in
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Curiosamente, dopo di ciò, non sarà comunque possibile utilizzarla, poiché gli esempi daranno errore a causa della mancanza della classe Downloader. Può essere copiato nel progetto dalla cartella dei test automatici — funziona per la versione 0.17.4 (sembra che in una versione più recente della libreria questa parte sia stata riadattata, ma è necessario controllare ulteriormente).
Ottenere l'indirizzo del flusso video dall'indirizzo della pagina video sul sito di YouTube:
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;
}Come indirizzo video, ytVidUrl può essere l'indirizzo pubblico della pagina di qualsiasi video sul sito di YouTube, ad esempio
Il lettore sarà da Google. Non si tratta di una semplice interfaccia web di YouTube, ma di un vero e proprio lettore incorporato per riprodurre qualsiasi video, sufficientemente flessibile e personalizzabile. È in grado di riprodurre anche flussi video da YouTube, se gli viene fornito l'indirizzo corretto. Abbiamo appena ottenuto l'indirizzo del flusso, quindi vediamo come inviarlo al lettore.
Collega la libreria al progetto :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Non approfondiremo tutti i dettagli relativi al posizionamento del componente del lettore all'interno dell'applicazione (puoi consultare gli esempi sul sito del progetto o nel codice), ma vedremo solo come avviare la riproduzione di un video da YouTube nel lettore utilizzando l'indirizzo ottenuto sopra:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// interrompere la riproduzione del video corrente, se è stato caricato
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);
// Mettiamo in pausa il video vecchio, mentre prepariamo il nuovo
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Se mettiamo in pausa qui dopo che il lettore si è messo in pausa da solo, finendo
// di riprodurre il video, otterremo qui un secondo evento STATE_ENDED, quindi ci serve qui
// un controllo speciale.
// Il valore di getPlayWhenReady() rimarrà true, quindi controlliamo proprio lo stato.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Prepara il lettore con la sorgente.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Impostiamo subito la posizione corrente al caricamento del video
// (nei commenti si parla di sorgenti che supportano o non supportano
// il seek al caricamento, sembra che sia una sciocchezza - semplicemente facciamo seek subito dopo il caricamento)
// Exoplayer riproduce la nuova Playlist dall'inizio invece che dalla posizione fornita
// https://github.com/google/ExoPlayer/issues/4375
// Come caricare lo stream nella posizione desiderata? #2197
// https://github.com/google/ExoPlayer/issues/2197
// in questo punto la durata normale non è ancora disponibile, quindi non la controlliamo
//if(seekTo > 0 && seekTo 0) {
// 5 secondi prima
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}Problemi noti
- Non riprodurrà video con restrizioni di età che richiedono la login a un account Google/YouTube
ad esempio: ,
consiglio: aggiungere questi video alla lista nera o chiedere all'autore del video di rimuovere la restrizione impostata per errore.
- Non riprodurrà alcuni video in streaming, per i quali il servizio restituisce una lunghezza zero (per questi video, la durata nelle liste e nelle gallerie è contrassegnata come «[dur undef]»)
ad esempio: ,
consiglio: aggiungere tali video alla lista nera.
- I video disponibili solo tramite link diretti potrebbero non essere inclusi nella playlist locale, anche se carichi tutti i video dell'utente.
ad esempio:
Se incontrate un video pubblico che non richiede login, si riproduce nel browser ma non nel lettore, inviate un report di bug (è possibile che il problema sia già stato risolto in una nuova versione NewPipeExtractor e sarà necessario solo aggiornare la build con questa versione, ).
L'interfaccia può rallentare con una connessione Internet lenta (ma non disattivata)
In definitiva
Mio figlio è passato da un tablet a una smart TV Samsung, che non è in grado di eseguire applicazioni Android. Pertanto, il miglior controllo parentale rimane comunque personale.
Ma l'app si è rivelata abbastanza comoda da farmi iniziare a usarla personalmente. La prima impressione delle versioni funzionanti iniziali è stata quella di entrare in un altro mondo. Tutto il contenuto viene caricato da YouTube, ma questo non è più YouTube, è qualcosa di diverso, sicuro e controllato, come se avessi estratto una scolopendra dall'occhio e l'avessi messa in un barattolo di vetro. E la questione è proprio nelle raccomandazioni.
Fonte: habr.com
