ProHoster > blog > notizie internet > La morte di Koshchei è nell'elenco delle raccomandazioni (è possibile rendere YouTube accogliente e sicuro?)
La morte di Koshchei è nell'elenco delle raccomandazioni (è possibile rendere YouTube accogliente e sicuro?)
L'introduzione è breve: voglio parlare del player online YouTube per Android con playlist, canali e consigli locali.
Introduzione ampliata:
Qualche tempo fa ho riscontrato esattamente lo stesso problema dell'autore di una meravigliosa applicazione Lista bianca dei canali, e ho determinato per me esattamente lo stesso atteggiamento nei suoi confronti: voglio poter regalare di tanto in tanto a mio figlio un tablet o uno smartphone con i cartoni animati, ma non sono affatto contento di dove, dopo 2-3 clic, l'elenco di raccomandazioni nelle applicazioni standard - client YouTube - prende il bambino.
Sfortunatamente, dopo aver installato l'applicazione Channel Whitelist, è stato scoperto un altro difetto più prosaico, ma comunque fatale: NIH I (e, soprattutto, mio figlio) hanno trovato la sua interfaccia non molto comoda, soprattutto dopo l'abitudine di utilizzare il player YouTube Kids.
In generale, dopo un po 'ero pronto per realizzare la mia implementazione. Dopo un po' di tempo è diventato possibile mettere un tag sulla prima versione.
Caratteristiche principali:
Aggiungi i tuoi canali e playlist preferiti: verranno salvati e indicizzati nel database locale
All'interno delle playlist aggiunte, disattiva i video non necessari se non ti servono
L'elenco dei consigli viene generato in modo casuale solo dai canali e dalle playlist aggiunti all'applicazione
Di seguito è riportata una panoramica delle principali funzionalità in modo più dettagliato, oltre ad alcuni dettagli tecnici su come riprodurre i video di YouTube nella tua applicazione Android senza utilizzare l'API di Google e i web wrapper.
Nella schermata principale e nella schermata del lettore: consigli casuali da canali non casuali
Ricerca istantanea nel database locale
=>
Aggiungi un nuovo canale o playlist
Cerca per nome online o inserisci un indirizzo conosciuto. L'elenco dei video di un canale o di una playlist viene salvato nel database locale; le icone non vengono memorizzate nella cache.
Playlist dinamica: riproduci i risultati della ricerca
=>
Nei consigli video ci saranno solo i video che soddisfano la query di ricerca.
Allo stesso modo, se apri un video dalle impostazioni della playlist, nell'elenco dei consigli verranno visualizzati solo i video della stessa playlist.
Le playlist e i canali possono essere temporaneamente disattivati e riattivati
Nota: i video di una playlist disabilitata scompariranno anche dai risultati di ricerca, dalla cronologia visualizzazioni e dall'elenco dei preferiti. Ma non preoccuparti, appariranno di nuovo lì immediatamente dopo aver riattivato la playlist.
Aggiungi un video alla lista nera
Un video bloccato non verrà visualizzato nei consigli, nei risultati di ricerca e scomparirà dall'elenco dei preferiti e dalla cronologia delle visualizzazioni. Il video sarà comunque visibile nelle impostazioni della playlist.
Visualizza la lista nera e riattiva gli elementi bloccati per errore: Impostazioni > menu intestazione > Lista nera
Video preferiti e cronologia visualizzazioni
I video preferiti sullo schermo del lettore sono contrassegnati da un asterisco nell'angolo in alto a destra.
Menu contestuali nel titolo della schermata e clic prolungato in gallerie ed elenchi
Copia il nome o l'indirizzo di un video o di una playlist nella schermata di navigazione o in qualsiasi elenco.
Avvio rapido: aggiungi canali e playlist consigliati
=>
L'applicazione apparirà immediatamente come negli screenshot sopra.
I canali e le playlist non necessari possono essere disattivati o eliminati nelle impostazioni.
Non è su Google Play e non lo sarà nel prossimo futuro (Google vieta le applicazioni che ignorano l'API e analizzano il loro sito Web, inclusa la citata Channel Whitelist o il player NewPipe)
Tieni presente che il passaggio tra versioni diverse da fonti diverse sullo stesso dispositivo non funzionerà a causa delle diverse firme del file apk; prima di installare la versione da una nuova fonte, dovrai prima eliminare la versione installata insieme ai dati - la cache della playlist e la cronologia di navigazione (o capire come trasferire i dati).
Dettagli tecnici
Non richiede un account Google/YouTube, serve solo Internet, utilizza le seguenti librerie:
domanda: è generalmente legale eseguire lo scraping di siti Web senza il permesso (o con un divieto esplicito) da parte degli autori? Google rimuove le app da Google Play, che non utilizzano la propria API, ma analizzano i propri siti, perché violano il loro accordo con l'utente. risposta: certo, è legale, sta a te decidere quale strumento utilizzare per leggere le informazioni disponibili al pubblico. Inoltre: Un tribunale statunitense ha completamente legalizzato lo scraping dei siti Web e ha vietato l'interferenza tecnica con essi., ma Gul potrebbe essere di diverso avviso; personalmente non ho ancora voglia di andare davanti a un tribunale americano per convincerli.
Un po' di codice
Biblioteca NewPipeExtractor - progetto di supporto ai giocatori NewPipe, ti consente di scaricare un elenco di video per un canale o una playlist specifica, scaricare informazioni dettagliate su un video famoso (ciò che è visibile sulla pagina web del video), ottenere l'indirizzo dell'icona del video e anche l'indirizzo del video flusso.
Il codice per caricare la playlist è un po' macchinoso, quindi non lo riporto qui, per chi fosse interessato dia un'occhiata al codice sorgente, è praticamente una classe ContentLoader.
Vediamo come ottenere l'indirizzo di un flusso video dall'indirizzo della pagina video pubblica e riprodurlo nel player.
È curioso che dopo questo non sarai ancora in grado di usarlo, perché... esempi si lamenteranno della mancanza della classe Downloader. Può essere copiato nel progetto dalla directory dei test automatizzati NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java - funziona con la versione 0.17.4 (sembra che questa parte sia stata rifatta in una versione più recente della libreria, ma dobbiamo ancora verificare).
Ottieni l'indirizzo del flusso video tramite l'indirizzo della pagina video sul sito Web 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;
}
L'indirizzo del video ytVidUrl può essere, ad esempio, l'indirizzo pubblico della pagina di qualsiasi video sul sito web di YouTube https://www.youtube.com/watch?v=pd2RlatmNRk
Il giocatore lo sarà exogiocatore da Google stessa. Questo non è un web wrapper su YouTube, ma un vero e proprio player incorporato per riprodurre qualsiasi video, abbastanza flessibile e personalizzabile. Può anche riprodurre flussi video da YouTube se gli fornisci l'indirizzo corretto. Abbiamo appena ricevuto l'indirizzo dello streaming, quindi vediamo come inviarlo al lettore.
Non considereremo tutte le sfumature del posizionamento del componente player sulla schermata dell'applicazione (puoi guardare gli esempi sul sito web del progetto o nel codice), vedremo solo come avviare la riproduzione di un video da YouTube nel player all'indirizzo l'indirizzo ricevuto sopra:
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);
}
}
problemi conosciuti
Non riprodurrà video con limiti di età che richiedono l'accesso al tuo account Google/YouTube
consiglio: aggiungi tali video alla lista nera o chiedi all'autore del video di rimuovere la restrizione impostata per errore.
Alcuni video trasmessi per i quali il servizio restituisce una durata pari a zero non verranno riprodotti (per tali video, la durata negli elenchi e nella galleria è contrassegnata come "[dur undef]")
Se trovi un video pubblico che non richiede login, viene riprodotto nel browser, ma non nel player, invia una segnalazione di bug (è del tutto possibile che il problema sia già stato risolto nella nuova versione NewPipeExtractor e dovrai solo aggiornare l'assembly con questa versione, per esempio).
L'interfaccia potrebbe rallentare se Internet è lento (ma non disattivato)
Come risultato,
Mio figlio è passato dal tablet alla smart TV Samsung, che non può eseguire applicazioni Android. Pertanto, il miglior controllo parentale è ancora personale.
Ma l'applicazione si è rivelata abbastanza comoda da permettermi di iniziare a usarla da solo. La prima impressione dalle prime versioni funzionanti era che fossi in un altro mondo. Tutti i contenuti vengono scaricati da YouTube, ma questo non è più YouTube, ma qualcos'altro, sicuro e controllato, come se ti togliessi un millepiedi dall'occhio e lo mettessi in un barattolo di vetro. Ed è tutta una questione di raccomandazioni.