Въведение накратко: искам да разкажа за онлайн плеера Ютюб за Андроид с локални плейлисти, канали и препоръки.

Въведение в детайли:
Преди известно време се сблъсках точно с такава проблема, каквато има авторът на прекрасно приложение. , и установих, че имам същото отношение: искам от време на време да дам на детето таблет или смартфон с мултиците, но съвсем не ме устройва къде след 2-3 кликвания заведат детето списъка с препоръки в стандартните приложения — клиентите на Ютюб.
За съжаление, след инсталирането на приложението Channel Whitelist вече бе открит друг, по-прозаичен, но все пак фатален недостатък — NIH ми (и, най-важното, на сина ми) се стори не особено удобен интерфейс, особено след навика да ползвам плеера YouTube Kids.
Общо взето, след известно време реших да направя своя реализация. След време стана възможно да се постави таг на първия рилийз.
Основни възможности:
- Добавяйте любимите си канали и плейлисти — те ще бъдат запазени и индексирани в локалната база.
- Вътре в добавените плейлисти изключвайте ненужните видеа, ако не са ви потребни.
- Списъкът с препоръки се генерира случайно само от добавените в приложението канали и плейлисти.
Източниците са отворени, лицензия GPLv3:
По-нататък преглед на основните възможности по-подробно, плюс малко технически детайли за това как да пуснете видео от Ютюб в приложението си на Андроид без използване на Гугл АПИ и уеб обвивки.
На главния екран и на екрана на плеера: случайни препоръки от неслучайни канали.
Мгновено търсене в локалната база.
=>
Добави нов канал или плейлист.
Търсене по име онлайн или поставяне на известен адрес. Списъкът с видеа от канала или плейлиста се запазва в локалната база, иконките не се кешират.
Динамичен плейлист — пускай резултати от търсенето.
=>
В препоръките под видеото ще бъдат само видеа, отговарящи на търсенето.
По аналогичен начин, ако отворите видео от настройките на плейлиста, в списъка с препоръки ще бъдат само видеа от същия плейлист.
Плейлистите и каналите могат временно да се изключват и отново да се включват.
Обърнете внимание: видеата от изключения плейлист ще изчезнат и от резултатите от търсенето, историята на гледанията и списъка с любими. Но не се тревожете, те отново ще се появят веднага след като плейлистът бъде включен отново.
Добавете видеото в черния списък
Блокираното видео няма да се показва в препоръките, в резултатите от търсенето, ще изчезне от списъка с любими и от историята на гледанията. Видеото все още ще бъде видно в настройките на плейлиста.
Прегледайте черния списък и отново активирайте елементите, блокирани по грешка:
Настройки > меню в заглавката > Черен списък
Любими видеа и история на гледанията
Любимите видеа на екрана на плеера са отбелязани със звезда в горния десен ъгъл.
Контекстни менюта в заглавката на екрана и при продължително натискане в галерии и списъци
Копирайте името или адреса на видеото или плейлиста в екрана на гледане или в който и да е списък.
Бързо начало — добавете препоръчани канали и плейлисти
=>
Приложението незабавно ще изглежда така, както е на екранните снимки по-горе.
Ненужните канали и плейлисти могат да бъдат изключени или изтрити в настройките.
Инсталиране
Страница на проекта:
на английски език:
релизи:
- В Гугъл Плей няма и в близко време няма да бъде (Гугъл блокира приложения, които обхождат сайта, включително споменатия Channel Whitelist или плеер NewPipe)
- Събирайте от изходния код:
- Свалете apk от раздела с релизи:
- Надявам се, че след известно време ще се появи в каталога (, но не се е движила почти месец), но все още не е
Имайте предвид, че не можете да превключвате между различни версии от различни източници на едно устройство поради различни подписни файлове apk; преди инсталирането на версия от нов източник първо трябва да изтриете инсталираната версия заедно с данните — кеша на плейлистите и историята на гледанията (или да измислите как да преместите тези данни).
Технически детайли
Не изисква акаунт в Гугъл/Ютюб, нужен е само интернет, използва библиотеки:
- за получаване на данни от услугата YouTube и
- за възпроизвеждане на видеа.
Отворен изходен код, свободна лицензия GPLv3.
въпрос: Законно ли е да се парсят сайтове без разрешение (или с явно забавяне) на авторите? , които не използват тяхното API, а парсят техните сайтове, тъй като нарушават потребителското им споразумение.
отговор: разбира се, законно е, вие решавате какъв инструмент да използвате за четене на публична информация. Освен това: , но Гул може да има различно мнение, лично аз засега нямам желание да ходя в американския съд, за да ги убеждавам.
Няколко реда код
Библиотека — помощен проект на плеера , позволява да се изтегли списък с видеа за конкретен канал или плейлист, да се получи подробна информация за известно видео (това, което се вижда на уеб страницата на видеото), да се получи адресът на иконката на видеото, както и адреса на потока на видеото.
Кодът за изтегляне на плейлист е малко тромав, затова няма да го представям тук, интересуващите се могат да надникнат в изходния код, основно това е класът .
Нека видим как да получим адреса на потока на видеото по адреса на публичната страница на видеото и да го възпроизведем в плеера.
Свържете библиотеката в
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Любопитно е, че след това все пак няма да можете да я използвате, тъй като примерите ще предизвикат грешки за липсващия клас Downloader. Можете да го копирате в проекта от директорията за автоматични тестове — работи за версия 0.17.4 (изглежда, че в по-новата версия на библиотеката тази част е преработена, но трябва да се провери допълнително).
Получите адреса на потока на видеото по адреса на страницата на видеото в Ютюб:
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;
}Като адрес на видеото ytVidUrl може да бъде публичният адрес на страницата на всяко видео в Ютюб, например
Плеерът ще бъде от самата Google. Това не е уеб обвивка над YouTube, а истински вграден плейър за възпроизвеждане на всякакви видеа, достатъчно гъвкав и настраиваем. Включително може да възпроизвежда видео потоци от YouTube, ако му зададете правилния адрес. Адресът на потока получихме току-що, така че да видим как да го изпратим в плейъра.
Свържете библиотеката с проекта :
dependencies {
...
// google Exoplayer
// https://github.com/google/ExoPlayer
// https://exoplayer.dev/
implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}Няма да разглеждаме всички нюанси при разполагането на компонента на екрана на приложението (можете да ги видите в примерите на сайта на проекта или в кода), а само ще обърнем внимание на това как да стартираме възпроизвеждането на видео от YouTube в плейъра по получения по-горе адрес:
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);
}
// Подготвяме плейъра със.source.
((SimpleExoPlayer) videoPlayerView.getPlayer()).prepare(videoSource);
// Указваме текущата позиция веднага при зареждане на видеото
// (в коментарите пишат нещо за източници, които поддържат или не поддържат
// преходи seek при зареждане, изглежда, че е лъжа - просто правим seek веднага след зареждане)
// Exoplayer възпроизвежда новия плейлист отначало вместо от зададена позиция
// https://github.com/google/ExoPlayer/issues/4375
// Как да заредим стрийм в желаната позиция? #2197
// https://github.com/google/ExoPlayer/issues/2197
// в този момент нормалната продължителност все още не е налична, затова не я проверяваме
//if(seekTo > 0 && seekTo 0) {
// 5 секунди по-рано
videoPlayerView.getPlayer().seekTo(seekTo - 5000 > 0 ? seekTo - 5000 : 0);
}
videoPlayerView.getPlayer().setPlayWhenReady(true);
}
}Познати проблеми
- Няма да възпроизвежда видеа с възрастови ограничения, изискващи вход в акаунт на Гугъл/Ютюб
например: ,
съвет: добавяйте такива видеа в черния списък или помолете автора на видеото да премахне ограничението, поставено по грешка.
- Няма да възпроизвежда някои видеа-стриймове, за които услугата връща нулева дължина (за такива видеа продължителността в списъците и галерията е отбелязана като «[dur undef]»)
например: ,
Съвет: добавете такива видеа в черния списък.
- Видеата, достъпни само чрез директни връзки, може да не попаднат в локалния плейлист, дори ако качвате всичките видеа на потребителя.
например:
Ако срещнете публично видео, което не изисква вход, играе в браузъра, но не играе в плеера, изпращайте отчет за грешки (възможно е проблемът вече да е решен в новата версия, NewPipeExtractor и просто трябва да обновите сборката с тази версия, ).
Интерфейсът може да забавя при бавен (но не изключен) интернет.
В крайна сметка
Синът ми премина от таблет на смарт телевизор Samsung, който не може да стартира приложения на Android. Следователно най-добрият родителски контрол все пак е личният.
Но приложението се оказа достатъчно удобно, за да започна да го използвам сам. Първото впечатление от ранните работещи версии — сякаш попаднах в друг свят. Цялото съдържание се зарежда от YouTube, но това вече не е YouTube, а нещо различно, безопасно и контролирано, сякаш извадих сколопендра от окото и я сложих в стъклен буркан. И всичко опира до препоръките.
Източник: habr.com
