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

Introduzione dettagliata:
Qualche tempo fa mi sono trovato di fronte al medesimo problema dell'autore di questa fantastica applicazione , e ho preso esattamente la stessa posizione: voglio avere la possibilità di dare di tanto in tanto a mio figlio un tablet o uno smartphone con cartoni animati, ma non mi piace affatto dove il sistema di raccomandazioni dei client ufficiali di YouTube porta il bambino dopo 2-3 clic.
Purtroppo, dopo aver installato l'app Channel Whitelist, ne ho scoperto un altro difetto più banale, ma comunque fatale: l'interfaccia mi è sembrata non molto comoda (e, cosa più importante, non lo era per mio figlio), soprattutto dopo essermi abituato a usare il lettore YouTube Kids.
In generale, dopo un po' di tempo, mi sono sentito pronto a realizzare la mia versione. Dopo un ulteriore lasso di tempo, è stato possibile mettere il tag sulla prima versione.
Funzionalità principali:
- Aggiungi i tuoi canali e playlist preferiti: saranno salvati e indicizzati in un database locale.
- All'interno delle playlist aggiunte, puoi disattivare i video indesiderati, se non ti servono.
- L'elenco delle raccomandazioni è generato casualmente solo dai canali e dalle playlist aggiunti nell'app.
Il codice sorgente è aperto, in licenza GPLv3:
Di seguito una panoramica delle principali funzionalità in dettaglio, oltre a qualche particolare tecnico su come riprodurre video da YouTube nella tua app Android senza utilizzare l'API di Google e wrapper web.
Sulla 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 online per nome o incolla un URL noto. L'elenco dei video del canale o della playlist viene salvato nel database locale, le icone non vengono memorizzate nella cache.
Playlist dinamiche – riproduci i risultati della ricerca.
=>
Nelle raccomandazioni sotto il video appariranno solo i video che soddisfano la ricerca.
Allo stesso modo, se apri un video dalle impostazioni della playlist, nell'elenco delle raccomandazioni appariranno solo i video di quella stessa playlist.
Le playlist e i canali possono essere disattivati temporaneamente e riattivati.
Nota: i video di una playlist disattivata scompariranno anche dai risultati di ricerca, dalla cronologia delle visualizzazioni e dall'elenco dei preferiti. Ma non preoccuparti, riappariranno subito dopo che la playlist sarà riattivata.
Aggiungi un video alla blacklist.
Il video bloccato non apparirà nelle raccomandazioni, nei risultati di ricerca, scomparirà dall'elenco dei preferiti e dalla cronologia delle visualizzazioni. Il video sarà ancora visibile nelle impostazioni della playlist.
Visualizza la blacklist e riattiva elementi bloccati per errore:
Impostazioni > menu in alto > Blacklist.
Video preferiti e cronologia visualizzazioni.
I video preferiti nello schermo del lettore sono contrassegnati con una stella nell'angolo in alto a destra.
Menu contestuali nell'intestazione dello schermo e con un clic prolungato nelle gallerie e nelle liste.
Copia il nome o l'indirizzo video o della playlist dalla schermata di visualizzazione o da qualsiasi elenco.
Avvio rapido – aggiungi canali e playlist consigliati.
=>
L'app avrà subito l'aspetto mostrato negli screenshot sopra.
Canali e playlist indesiderati possono essere disattivati o rimossi nelle impostazioni.
Installazione
Pagina del progetto:
in lingua inglese:
rilasci:
- Non è disponibile su Google Play e non lo sarà nel prossimo futuro (Google blocca le app che eseguono scraping dei loro siti bypassando l'API, incluso Channel Whitelist o il lettore NewPipe).
- Compilare dai sorgenti:
- Scarica apk dalla sezione con i rilasci:
- Spero che a breve appaia nel catalogo (, ma non si è mosso ulteriormente per quasi un mese), ma al momento non c'è.
Tieni presente che non sarà possibile passare da diverse versioni di fonti diverse su un unico dispositivo a causa di diverse firme del file apk; prima di installare una versione da una nuova fonte, dovrai eliminare prima la versione installata insieme ai dati – cache delle playlist e cronologia delle visualizzazioni (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 eseguire il scraping di siti senza autorizzazione (o con esplicito divieto) degli autori? che non utilizzano la loro API e che effettuano scraping dei loro siti, poiché violano il loro contratto di utilizzo.
risposta: certamente, è legale, spetta a te quale strumento utilizzare per leggere informazioni accessibili pubblicamente. Inoltre: , ma Gula potrebbe avere un'opinione diversa; personalmente, al momento non ho voglia di andare a convincerli in tribunale americano.
Un po' di codice
Libreria — un progetto ausiliario del lettore , consente di scaricare un elenco di video per un canale o una playlist specificati, 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 non lo inserirò qui; chi è interessato, può dare un'occhiata al codice sorgente; in generale si tratta della 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, anche dopo questo non sarà comunque possibile utilizzarla, poiché gli esempi daranno errore per la mancanza della classe Downloader. Questa può essere copiata 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 modificata, ma è ancora da verificare).
Ottenere l'indirizzo del flusso video dall'indirizzo della pagina del 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à di Google stesso. Non è una web wrapper su YouTube, ma un vero lettore incorporato per la riproduzione di video di qualsiasi genere; è abbastanza flessibile e configurabile. Può riprodurre flussi video da YouTube, se gli si fornisce l'indirizzo corretto. Abbiamo appena ottenuto l'indirizzo del flusso, quindi vediamo come inviarlo al lettore.
Collegare la libreria nel progetto :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Non considereremo tutti i dettagli del posizionamento del componente del lettore nella schermata dell'applicazione (potete dare un'occhiata agli esempi sul sito del progetto o nel codice); ci concentriamo solo su come avviare la riproduzione di video di YouTube nel lettore utilizzando l'indirizzo ottenuto in precedenza:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// fermare la riproduzione del video corrente, se era 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 vecchio video mentre prepariamo il nuovo
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Se mettiamo in pausa qui dopo che il lettore ha messo in pausa da solo, finendo
// di riprodurre il video, otterremo qui un secondo evento STATE_ENDED, quindi abbiamo bisogno di
// una verifica speciale.
// Inoltre, il valore di getPlayWhenReady() rimarrà true, quindi controlliamo esattamente lo stato.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Prepariamo il lettore con la sorgente.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Indichiamo la posizione corrente subito durante il caricamento del video
// (nei commenti si parla di qualcosa riguardante le data sources, che supportano o meno
// i jump seek durante il caricamento; sembra che sia solo una sciocchezza - semplicemente facciamo seek subito dopo il caricamento)
// Exoplayer riproduce nuova Playlist dall'inizio invece che dalla posizione fornita
// https://github.com/google/ExoPlayer/issues/4375
// Come caricare il flusso nella posizione desiderata? #2197
// https://github.com/google/ExoPlayer/issues/2197
// in questo momento 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 il login a un account Google/YouTube
ad esempio: ,
Consiglio: aggiungere questi video alla lista nera o chiedere all'autore di rimuovere la restrizione impostata per errore.
- Non verranno riprodotti alcuni video in diretta per i quali il servizio restituisce una lunghezza zero (per tali video, la durata è segnata nelle liste e nelle gallerie come «[dur undef]»)
ad esempio: ,
Consiglio: aggiungere questi video alla lista nera.
- I video accessibili solo tramite link diretti potrebbero non apparire nella playlist locale, anche se stai caricando tutti i video dell'utente.
ad esempio:
Se incontri un video pubblico che non richiede login, si riproduce nel browser ma non nel lettore, invia un bug report (è 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 potrebbe rallentare con internet lento (ma non spento)
In conclusione
Mio figlio è passato dal tablet alla smart TV Samsung, che non sa avviare le app Android. Pertanto, il miglior controllo genitoriale rimane comunque personale.
Ma l'app è risultata abbastanza comoda da farmi iniziare a usarla anch'io. La prima impressione delle versioni iniziali operative è stata di essere entrato in un altro mondo. Tutto il contenuto viene caricato da YouTube, ma questo non è più YouTube, è qualcosa di diverso, sicuro e controllabile, come se avessi preso una scolopendra dall'occhio e l'avessi messa in un barattolo di vetro. E il punto sta proprio nelle raccomandazioni.
Fonte: habr.com
