Kurze Einführung: Ich möchte über den Online-Player YouTube für Android mit lokalen Playlists, Kanälen und Empfehlungen sprechen.

Ein ausführliches Vorwort:
Vor einiger Zeit hatte ich genau das gleiche Problem wie der Autor dieser großartigen Anwendung. , und ich habe zu diesem Problem genau die gleiche Einstellung: Ich möchte meinem Kind ab und zu ein Tablet oder Smartphone mit Zeichentrickfilmen geben, aber es stört mich sehr, wohin das Kind in den Standard-YouTube-Anwendungen nach 2-3 Klicks zu den Empfehlungen geleitet wird.
Leider wurde nach der Installation der Anwendung Channel Whitelist ein anderer, banaler, aber dennoch fataler Nachteil festgestellt – die Benutzeroberfläche von NIH erschien mir (und vor allem meinem Sohn) nicht sehr benutzerfreundlich, insbesondere nach der Gewöhnung an den YouTube Kids Player.
Allgemein reifte ich nach einiger Zeit, um meine eigene Implementierung zu erstellen. Nach einiger Zeit wurde es möglich, ein Tag für die erste Veröffentlichung zu setzen.
Hauptfunktionen:
- Fügen Sie Ihre Lieblingskanäle und -playlists hinzu – sie werden in der lokalen Datenbank gespeichert und indexiert.
- In den hinzugefügten Playlists können Sie nicht benötigte Videos deaktivieren.
- Die Liste der Empfehlungen wird zufällig aus den in der Anwendung hinzugefügten Kanälen und Playlists generiert.
Die Quellcodes sind offen, Lizenz GPLv3:
Im Folgenden eine detaillierte Übersicht über die Hauptfunktionen und einige technische Details, wie Sie Videos von YouTube in Ihrer Android-Anwendung ohne Verwendung der Google-API und Webwrapper abspielen können.
Auf dem Hauptbildschirm und im Player-Bildschirm: zufällige Empfehlungen aus nicht-zufälligen Kanälen.
Sofortige Suche in der lokalen Datenbank.
=>
Einen neuen Kanal oder eine Playlist hinzufügen.
Online nach Namen suchen oder eine bekannte Adresse einfügen. Die Liste der Videos des Kanals oder der Playlist wird in die lokale Datenbank gespeichert, Icons werden nicht zwischengespeichert.
Dynamische Playlist – Suchergebnisse abspielen.
=>
In den Empfehlungen unter dem Video werden nur Videos angezeigt, die dem Suchbegriff entsprechen.
Ähnlich, wenn Sie ein Video aus den Playlist-Einstellungen öffnen, werden in der Liste der Empfehlungen nur Videos aus derselben Playlist angezeigt.
Playlists und Kanäle können vorübergehend deaktiviert und wieder aktiviert werden.
Bitte beachten Sie: Videos aus einer deaktivierten Playlist verschwinden auch aus den Suchergebnissen, dem Verlauf und der Favoritenliste. Aber keine Sorge, sie erscheinen sofort wieder, sobald die Playlist wieder aktiviert ist.
Video auf die schwarze Liste setzen
Das blockierte Video wird nicht in Empfehlungen, Suchergebnissen angezeigt und verschwindet aus der Liste der Favoriten sowie der观看历史. Das Video wird jedoch noch in den Einstellungen der Playlist sichtbar sein.
Schwarze Liste einsehen und fälschlicherweise blockierte Elemente wieder aktivieren:
Einstellungen > Menü in der Kopfzeile > Schwarze Liste
Favoriten und Verlauf
Favoriten im Player-Bildschirm sind in der oberen rechten Ecke mit einem Sternchen gekennzeichnet.
Kontextmenüs in der Kopfzeile und durch langes Drücken in Galerien und Listen
Kopiere den Namen oder die Adresse des Videos oder der Playlist im Anzeigebereich oder in einer beliebigen Liste.
Schneller Einstieg – empfohlene Kanäle und Playlists hinzufügen
=>
Die App wird sofort so aussehen, wie auf den obigen Screenshots.
Unbenötigte Kanäle und Playlists können in den Einstellungen deaktiviert oder gelöscht werden.
Installation
Projektseite:
in englischer Sprache:
Veröffentlichungen:
- Es gibt sie nicht im Google Play und wird in naher Zukunft auch nicht verfügbar sein (Google sperrt Apps, die ihre Website ohne API scrapen, einschließlich der erwähnten Channel Whitelist oder dem Player NewPipe)
- Sammeln aus den Quellen:
- Lade die APK im Bereich für Veröffentlichungen herunter:
- Ich hoffe, dass es in einigen Zeit im Katalog erscheinen wird (, aber es tut sich seit fast einem Monat nichts), aber bisher gibt es noch nichts
Beachte, dass das Wechseln zwischen verschiedenen Versionen aus verschiedenen Quellen auf demselben Gerät aufgrund unterschiedlicher APK-Signaturen nicht möglich ist. Vor der Installation einer neuen Version aus einer anderen Quelle muss die installierte Version zuerst zusammen mit den Daten - dem Cache von Playlists und dem Verlauf - entfernt werden (oder überlegt werden, wie diese Daten übertragen werden können).
Technische Details
Benötigt kein Google-/YouTube-Konto, nur Internet, verwendet die Bibliotheken:
- zum Abrufen von Daten vom YouTube-Dienst und
- zum Abspielen von Videos.
Open Source, freie GPLv3-Lizenz.
Frage: Ist das Scraping von Webseiten ohne Genehmigung (oder mit ausdrücklichem Verbot) der Autoren überhaupt legal? , die nicht ihre API benutzen und deren Websites scrapen, weil sie gegen ihre Nutzungsbedingungen verstoßen.
Antwort: Natürlich ist es legal, es ist deine Entscheidung, welches Werkzeug du verwendest, um öffentliche Informationen zu lesen. Mehr noch: , aber Gula könnte eine andere Meinung haben, ich persönlich habe momentan kein Verlangen, sie vor dem amerikanischen Gericht zu überzeugen.
Ein wenig Code
Bibliothek — ein unterstützendes Projekt des Players , ermöglicht das Herunterladen einer Liste von Videos für einen bestimmten Kanal oder eine Playlist, das Abrufen detaillierter Informationen zu einem bekannten Video (was auf der Webseite des Videos sichtbar ist), das Erhalten der Adresse des Video-Icons sowie das Abrufen der Adresse des Video-Streams.
Der Code zum Herunterladen der Playlist ist etwas umfangreich, daher werde ich ihn hier nicht anführen, wer interessiert ist — schaut in die Quellcodes, im Wesentlichen handelt es sich um die Klasse .
Lassen Sie uns sehen, wie man die URL des Video-Streams anhand der Adresse der öffentlichen Videoseite erhält und sie im Player abspielt.
Die Bibliothek in
dependencies {
...
// NewPipe: YouTube-Parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Es ist interessant, dass man sie danach trotzdem nicht verwenden kann, da die Beispiele sich über die fehlende Klasse Downloader beschweren. Diese kann man aus dem Verzeichnis der automatischen Tests ins Projekt kopieren. — funktioniert für die Version 0.17.4 (es scheint, dass dieser Teil in einer neueren Version der Bibliothek überarbeitet wurde, muss aber noch überprüft werden).
Um die URL des Video-Streams anhand der Adresse der Videoseite auf YouTube zu erhalten:
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;
}Als Video-Adresse kann ytVidUrl die öffentliche Adresse der Seite eines beliebigen Videos auf YouTube sein, zum Beispiel
Der Player wird von Google selbst. Es handelt sich nicht um eine Web-Oberfläche für YouTube, sondern um einen echten eingebetteten Player zum Abspielen beliebiger Videos, der ausreichend flexibel und anpassbar ist. Er kann auch YouTube-Video-Streams abspielen, wenn die richtige Adresse angegeben wird. Die Adresse des Streams haben wir gerade erhalten, daher sehen wir uns an, wie wir sie an den Player übergeben.
Binden Sie die Bibliothek ins Projekt ein :
Abhängigkeiten {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Wir werden die Details zur Platzierung des Player-Komponenten auf dem Bildschirm der Anwendung nicht betrachten (Sie können sich die Beispiele auf der Projektwebsite oder im Code ansehen), sondern nur darauf eingehen, wie man das Abspielen von Videos von YouTube im Player mit der oben genannten Adresse startet:
private void playVideoStream(final String streamUrl, final long seekTo) {
if (streamUrl == null) {
// Beende die Wiedergabe des aktuellen Videos, falls es geladen wurde
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);
// Pausieren wir das alte Video, während wir das neue vorbereiten
if (videoPlayerView.getPlayer().getPlaybackState() != Player.STATE_ENDED) {
// Wenn wir hier pausieren, nachdem der Player das Video von selbst pausiert hat,
// erhalten wir hier ein weiteres Ereignis STATE_ENDED, daher benötigen wir hier
// eine spezielle Überprüfung.
// Das bedeutet, dass der Wert von getPlayWhenReady() true bleiben wird, also prüfen wir genau den Status.
// https://github.com/google/ExoPlayer/issues/2272
videoPlayerView.getPlayer().setPlayWhenReady(false);
}
// Bereite den Player mit der Quelle vor.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Geben wir die aktuelle Position sofort beim Laden des Videos an
// (in den Kommentaren steht etwas über Datenquellen, die Unterstützungen oder nicht unterstützen
// für seek bei Ladevorgängen, es scheint, dass das Quatsch ist - einfach direkt nach dem Laden seeken)
// Exoplayer spielt die neue Playlist von Anfang an statt von der angegebenen Position
// https://github.com/google/ExoPlayer/issues/4375
// Wie lädt man den Stream an der gewünschten Position? #2197
// https://github.com/google/ExoPlayer/issues/2197
// An dieser Stelle ist die normale Dauer noch nicht verfügbar, daher überprüfen wir das nicht
//if(seekTo > 0 && seekTo 0) {
// fünf Sekunden früher
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}Bekannte Probleme
- Es wird keine Videos mit Altersbeschränkungen abspielen, die eine Anmeldung in einem Google/YouTube-Konto erfordern.
zum Beispiel: ,
Tipp: Solche Videos in die schwarze Liste hinzufügen oder den Autor des Videos bitten, das irrtümlich gesetzte Limit aufzuheben.
- Einige Videoübertragungen werden nicht abgespielt, wenn der Dienst eine Null-Länge zurückgibt (für solche Videos wird die Dauer in Listen und Galerien als „[dur undef]“ angezeigt).
zum Beispiel: ,
Tipp: Solche Videos in die schwarze Liste hinzufügen.
- Videos, die nur über direkte Links zugänglich sind, können möglicherweise nicht in die lokale Wiedergabeliste gelangen, selbst wenn Sie alle Benutzer-Videos hochladen.
zum Beispiel:
Wenn Sie auf ein öffentliches Video stoßen, das kein Login benötigt, im Browser abgespielt wird, aber nicht im Player, senden Sie einen Bug-Report (es ist ziemlich möglich, dass das Problem bereits in einer neuen Version behoben wurde, NewPipeExtractor und es notwendig sein wird, nur die Sammlung mit dieser Version zu aktualisieren, ).
Die Benutzeroberfläche kann bei langsamen (aber nicht abgeschalteten) Internetverbindungen ruckeln.
Insgesamt
Der Sohn ist von einem Tablet auf einen Smart-TV von Samsung umgestiegen, der keine Android-Apps starten kann. Daher bleibt die beste Elternkontrolle persönliche Präsenz.
Aber die Anwendung ist ausreichend benutzerfreundlich geworden, sodass ich begann, sie selbst zu nutzen. Der erste Eindruck aus den frühen funktionierenden Versionen — ich bin in eine andere Welt gelangt. Alle Inhalte werden von YouTube geladen, aber es ist nun nicht mehr YouTube, sondern etwas anderes, sicheres und kontrollierbares, als hätte ich eine Skolopender aus dem Auge entfernt und in ein Glasgefäß gesetzt. Und es liegt tatsächlich an den Empfehlungen.
Quelle: habr.com
