ProHoster > Блог > Новини інтернету > Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)
Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)
Коротко: хочу розповісти про онлайн плеєр Ютюб для Андроїда з локальними плейлистами, каналами і рекомендаціями.
Вступ розгорнутий:
Якийсь час тому я зіткнувся рівно з такою проблемою, як і автор чудової програми. Channel Whitelist, І визначив для себе до неї таке саме ставлення: я хочу мати можливість час від часу давати дитині планшет або смартфон з мультиками, але мене зовсім не влаштовує, куди через 2-3 кліки заводить дитину список рекомендацій у стандартних додатках - клієнтах Ютюб.
На жаль, після встановлення програми Channel Whitelist вже у нього був виявлений інший прозаїчніший, але все одно фатальний недолік — NIH мені (і, головне, сину) здався не дуже зручним його інтерфейс, особливо після звички використовувати плеєр YouTube Kids.
Загалом ще через деякий час я дозрів, щоб зробити свою реалізацію. Ще через деякий час можна було поставити тег на перший реліз.
Основні можливості:
Додайте улюблені канали та плейлисти - вони будуть збережені та проіндексовані в локальній базі
Усередині доданих плейлистів вимикайте зайві ролики, якщо вони вам не потрібні
Список рекомендацій генерується випадково тільки з доданих у додаток каналів та плейлистів
Далі огляд основних можливостей більш докладно, плюс трохи технічних подробиць про те, як грати відео з Ютюб у вашому додатку на Андроїд без використання API Google і веб-оберток.
На головному екрані та на екрані плеєра: випадкові рекомендації з невипадкових каналів
Миттєвий пошук по локальній базі
=>
Додати новий канал або плейлист
Шукати по імені онлайн або вставити відому адресу. Список роликів каналу чи плейлиста зберігається у локальну базу, іконки не кешуються.
Динамічний плейлист - грати результати пошуку
=>
У рекомендаціях під відео будуть лише ролики, які відповідають пошуковому запиту.
Аналогічно, якщо відкрити відео з налаштувань плейлиста, у списку рекомендацій будуть лише ролики з цього ж плейлиста.
Плейлисти та канали можна тимчасово вимикати та знову вмикати
Зверніть увагу: ролики з вимкненого плейлиста зникнуть також із результатів пошуку, історії переглядів та зі списку коханих. Але не варто переживати, вони знову з'являться там одразу після того, як плейлист буде знову включений.
Внести ролик до чорного списку
Заблокований ролик не відображатиметься в рекомендаціях, результатах пошуку, зникне зі списку улюблених та з історії переглядів. Ролик все ще буде видно у налаштуваннях плейлиста.
Переглянути чорний список і знову увімкнути елементи, заблоковані помилково: Установки > меню у заголовку > Чорний список
Улюблені ролики та історія переглядів
Улюблені ролики на екрані плеєра відзначаються зірочкою у верхньому правому кутку.
Контекстні меню в заголовку екрана та за довгим кліком у галереях та списках
Копіювати ім'я або адресу відео або плейлиста в екрані відтворення або в будь-якому списку.
Швидкий старт — додати рекомендовані канали та плейлисти
=>
Програма відразу виглядатиме так, як на скріншотах вище.
Непотрібні канали та плейлисти можна вимкнути або видалити у налаштуваннях.
На Гуглплеї немає і найближчим часом не буде (Гугл банить програми, які в обхід API парять їх сайт, у т.ч. згаданий Channel Whitelist або плеєр NewPipe)
Майте на увазі, що перемикатися між різними версіями з різних джерел на одному пристрої не вийде через різні підписи файлу apk, перед встановленням версії з нового джерела доведеться встановлену версію спочатку видалити разом з даними - кешем плейлистів та історією переглядів (або придумати, як ці дані перенести).
Технічні деталі
Не вимагає облікового запису Гугл/Ютюб, потрібен тільки інтернет, використовує бібліотеки:
питання: парсити сайти без дозволу (або з явною забороною) авторів взагалі законно? Google видаляє з Google плея програми, які використовують їх API, а парсят їхні сайти, т.к. вони порушують їхню користувальницьку угоду. відповідь: звичайно, законно, це ваша справа, який інструмент використовуватиме читання загальнодоступної інформації. Більш того: Суд США повністю легалізував скрапінг сайтів та заборонив йому технічно перешкоджатиАле у Гула може бути інша думка, особисто в мене поки немає бажання вирушати в американський суд їх переконувати.
Небагато коду
Бібліотека NewPipeExtractor - Допоміжний проект плеєра NewPipe, дозволяє завантажувати список роликів для зазначеного каналу або плейлиста, завантажувати докладну інформацію про відоме відео (те, що видно на веб-сторінці ролика), отримувати адресу іконки відео, а також отримувати адресу потоку відео.
Код для завантаження плейлиста трохи громіздкий, тому тут наводити його не буду, кому цікаво - загляньте в вихідні джерела, в основному це клас ContentLoader.
Подивимося, як отримати адресу потоку відео на адресу публічної сторінки відео і грати його в плеєрі.
Цікаво, що її все одно не вийде використовувати, т.к. приклади лаятимуться на недостатній клас Downloader. Його можна скопіювати в проект із каталогу автоматичних тестів NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java — працює для версії 0.17.4 (схоже, що у новішій версії бібліотеки ця частина була перероблена, але ще потрібно перевірити).
Отримати адресу потоку відео на сторінці відео на сайті Ютюб:
Плеєр буде екзоплеєр від самої Google. Це не веб-обгортка над Ютюб, а справжнісінький вбудований плеєр для програвання будь-яких відеороликів, досить гнучкий і налаштований. Навіть вміє грати потоки відео з Ютюба, якщо вказати йому правильну адресу. Адреса потоку ми отримали щойно, тому подивимося, як його відправити у програвач.
Всі нюанси розміщення компонента плеєра на екрані програми розглядати не будемо (можете подивитися в прикладах на сайті проекту або в коді), подивимося тільки на те, як запустити програвання відео з Ютюба в плеєрі за адресою:
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);
}
}
відомі проблеми
Не буде грати ролики з віковими обмеженнями, які вимагають логін до облікового запису Гугл/Ютюб
порада: додавати такі ролики до чорного списку або попросити автора ролика зняти обмеження, виставлене помилково.
Не буде грати деякі ролики-трансляції, для яких сервіс повертає нульову довжину (для таких роликів тривалість у списках та галереї зазначена як «[dur undef]»)
Якщо зустрінете публічний ролик, який не вимагає логін, грає в браузері, але не грає в плеєрі, надсилайте баг-репорт (цілком можливо, проблема вже виправлена в новій версії NewPipeExtractor і потрібно буде лише оновити складання з цією версією, наприклад).
Інтерфейс може підгальмовувати при повільному (але не вимкненому) інтернеті
У підсумку
Син переїхав з планшета на смарт-тв Samsung, який не вміє запускати програми Андроїд. Тому найкращий батьківський контроль — все одно особистий.
Але програма вийшла досить зручною для того, щоб я почав її використовувати сам. Перше враження з ранніх версій, що працюють, — потрапив в інший світ. Весь контент завантажується з ютюбу, але це вже не ютюб, а щось інше, безпечне і контрольоване, ніби вийняв з ока сколопендру і посадив її в скляну банку. І річ саме в рекомендаціях.