Кратко за introduction: искам да разкажа за онлайн плеер YouTube за Android с локални плейлисти, канали и препоръки.

Разширено introduction:
Преди известно време се сблъсках точно с такъв проблем, както и автора на невероятното приложение , и стигнах до същото отношение: искам от време на време да давам на детето таблет или смартфон с анимации, но съвсем не ме устройва как след 2-3 клика списъкът с препоръки в стандартните приложения — клиентите на YouTube завежда детето.
За съжаление, след инсталирането на приложението Channel Whitelist, се откри друг по-политичен, но все пак фатален недостатък — NIH ми (и, най-важното, на сина ми) ми се стори не много удобен интерфейс, особено след навика да използвам YouTube Kids плеера.
Навсякъде, след известно време, реших да направя своя реализация. След още време стана възможно да поставя таг на първото издание.
Основни функции:
- Добавяйте любимите си канали и плейлисти — те ще бъдат запазени и индексирани в локалната база
- В рамките на добавените плейлисти изключвайте ненужните видеа, ако не ви трябват
- Списъкът с препоръки се генерира случайно само от добавените в приложението канали и плейлисти
Източниците са отворени, лицензия GPLv3:
След това преглед на основните функции по-подробно, плюс малко технически подробности за това как да възпроизвеждате видео от YouTube в приложението си за Android без използване на Google API и уеб обвивки.
На началния екран и на екрана на плеера: случайни препоръки от неслучайни канали
Мгновено търсене в локалната база
=>
Добави нов канал или плейлист
Търсете по име онлайн или поставете известен адрес. Списъкът с видеа на канала или плейлиста се запазва в локалната база, иконите не се кешират.
Динамичен плейлист — възпроизвеждайте резултатите от търсенето
=>
В препоръките под видеото ще бъдат само видеа, удовлетворяващи търсенето.
По аналогичен начин, ако отворите видео от настройките на плейлиста, в списъка с препоръки ще бъдат само видеа от същия плейлист.
Плейлистите и каналите могат временно да бъдат изключвани и отново включвани
Обърнете внимание: видеоклиповете от изключения плейлиста ще изчезнат и от резултатите от търсенето, историята на гледанията и списъка с любими. Но не се притеснявайте, те отново ще се появят там веднага щом плейлистът бъде активиран отново.
Добави видеоклип в черния списък
Забраняваният видеоклип няма да се показва в препоръките, в резултатите от търсенето, ще изчезне от списъка с любими и историята на гледанията. Видеоклипът все още ще бъде видим в настройките на плейлиста.
Прегледайте черния списък и отново активирайте елементите, блокирани по грешка:
Настройки > меню в заглавката > Черен списък
Любими видеоклипове и история на гледанията
Любимите видеоклипове на екрана на плейъра са маркирани със звездица в горния десен ъгъл.
Контекстни менюта в заглавката на екрана и при дълго натискане в галериите и списъците
Копирайте името или адреса на видеоклипа или плейлиста на екрана на гледане или в който и да е списък.
Бързо стартиране — добавете препоръчани канали и плейлисти
=>
Приложението незабавно ще изглежда така, както на скрийншотовете по-горе.
Излишните канали и плейлисти могат да бъдат изключени или премахнати в настройките.
Инсталиране на
Страница на проекта:
на английски език:
издания:
- В Google Play няма и за в близко бъдеще няма да има (Google блокира приложения, които заобикалят API, за да парсят техния сайт, включително споменатия Channel Whitelist или плейера NewPipe)
- Събирайте от изходни кодове:
- Изтеглете apk от раздела с издания:
- Надявам се, че след известно време ще се появи в каталога (, но не напредва вече почти месец), но все още не
Имайте предвид, че не можете да превключвате между различни версии от различни източници на едно устройство поради различните подписи на файла apk, преди да инсталирате версия от нов източник, трябва първо да премахнете инсталираната версия заедно с данните — кеша на плейлистите и историята на гледанията (или да измислите как да прехвърлите тези данни).
Технически детайли
Не изисква акаунт в Google/YouTube, нужен е само интернет, използва библиотеки:
- за получаване на данни от услугата YouTube и
- за възпроизвеждане на видео.
С отворен код, свободна лицензия GPLv3.
въпрос: Легално ли е да парсиш сайтове без разрешение (или с явна забрана) от авторите? , които не използват техния API и парсят техните сайтове, тъй като нарушават тяхното споразумение за ползване.
отговор: разбира се, законно е, вашето право е какъв инструмент да използвате за четене на публична информация. Освен това: , но Джулиан може да мисли различно, лично аз в момента нямам желание да ходя в американския съд, за да ги убеждавам.
Няколко реда код
Библиотека — спомагателен проект на плейъра , който позволява да изтеглите списъка с видеа за указан канал или плейлист, да изтеглите подробна информация за конкретно видео (това, което виждате на уеб страницата на видеото), да получите адреса на значката на видеото и също така да получите адреса на видеопотока.
Кодът за изтегляне на плейлист е малко тромав, затова няма да го предоставям тук, който се интересува — проверете изходните кодове, основно това е клас .
Да видим как да получим адреса на видеопотока от адреса на публичната страница на видеото и да го пуснем в плейъра.
Свържете библиотеката в
dependencies {
...
// NewPipe: youtube parser
// https://github.com/TeamNewPipe/NewPipeExtractor
implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}Любопитно е, че след това пак няма да може да се използва, тъй като примерите ще се оплакват от липсващия клас Downloader. Можете да го копирате в проекта от директорията на автоматичните тестове — работи за версия 0.17.4 (изглежда, че в по-новата версия на библиотеката тази част е преработена, но все още трябва да проверя).
Получаване на адреса на видеопотока от адреса на страницата на видеото на сайта 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;
}Като адрес на видеото ytVidUrl може да бъде публичен адрес на страница на което и да е видео на сайта YouTube, например
Плейърът ще бъде от самата 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);
}
// Подготвяме плеера със източника.
((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);
}
}Известни проблеми
- Няма да възпроизвежда видеа с възрастови ограничения, които изискват вход в акаунт в Google/YouTube
например: ,
съвет: добавяйте такива видеа в черния списък или помолете автора на видеото да премахне ограничението, зададено по погрешка.
- Няма да възпроизвежда някои видеа на живо, за които услугата връща нулева дължина (за тези видеа продължителността в списъците и галерията е маркирана като «[dur undef]»)
например: ,
съвет: добавяйте такива видеа в черния списък.
- Видеата, достъпни само по директни линкове, може да не попаднат в локалния плейлист, дори ако качвате всички видеа на потребителя.
например:
Ако срещнете публично видео, което не изисква вход, възпроизвежда се в браузъра, но не работи в плейъра, изпратете отчета за грешка (възможно е проблемът вече да е поправен в новата версия, NewPipeExtractor и ще трябва само да актуализирате версията с тази версия, ).
Интерфейсът може да забави при бавен (но не изключен) интернет.
В крайна сметка
Синът премина от таблет на смарт-телевизор Samsung, който не може да стартира приложения за Android. Затова най-добрият контрол на родителите все пак остава личният.
Но приложението стана достатъчно удобно, за да започна да го използвам и аз. Първото впечатление от ранните работещи версии е, че попадах в друг свят. Всички съдържания се зареждат от YouTube, но това вече не е YouTube, а нещо друго, безопасно и контролирано, сякаш съм извадил стоножка от окото и съм я сложил в стъклен буркан. И става дума точно за препоръките.
Източник: habr.com
