Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Коротко: хочу розповісти про онлайн плеєр Ютюб для Андроїда з локальними плейлистами, каналами і рекомендаціями.

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Вступ розгорнутий:
Якийсь час тому я зіткнувся рівно з такою проблемою, як і автор чудової програми. Channel Whitelist, І визначив для себе до неї таке саме ставлення: я хочу мати можливість час від часу давати дитині планшет або смартфон з мультиками, але мене зовсім не влаштовує, куди через 2-3 кліки заводить дитину список рекомендацій у стандартних додатках - клієнтах Ютюб.

На жаль, після встановлення програми Channel Whitelist вже у нього був виявлений інший прозаїчніший, але все одно фатальний недолік — NIH мені (і, головне, сину) здався не дуже зручним його інтерфейс, особливо після звички використовувати плеєр YouTube Kids.

Загалом ще через деякий час я дозрів, щоб зробити свою реалізацію. Ще через деякий час можна було поставити тег на перший реліз.

Основні можливості:

  • Додайте улюблені канали та плейлисти - вони будуть збережені та проіндексовані в локальній базі
  • Усередині доданих плейлистів вимикайте зайві ролики, якщо вони вам не потрібні
  • Список рекомендацій генерується випадково тільки з доданих у додаток каналів та плейлистів

Вихідники відкриті, ліцензія GPLv3: https://github.com/sadr0b0t/yashlang/

Далі огляд основних можливостей більш докладно, плюс трохи технічних подробиць про те, як грати відео з Ютюб у вашому додатку на Андроїд без використання API Google і веб-оберток.

На головному екрані та на екрані плеєра: випадкові рекомендації з невипадкових каналів

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Миттєвий пошук по локальній базі

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) => Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Додати новий канал або плейлист

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Шукати по імені онлайн або вставити відому адресу. Список роликів каналу чи плейлиста зберігається у локальну базу, іконки не кешуються.

Динамічний плейлист - грати результати пошуку

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) => Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

У рекомендаціях під відео будуть лише ролики, які відповідають пошуковому запиту.

Аналогічно, якщо відкрити відео з налаштувань плейлиста, у списку рекомендацій будуть лише ролики з цього ж плейлиста.

Плейлисти та канали можна тимчасово вимикати та знову вмикати

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Зверніть увагу: ролики з вимкненого плейлиста зникнуть також із результатів пошуку, історії переглядів та зі списку коханих. Але не варто переживати, вони знову з'являться там одразу після того, як плейлист буде знову включений.

Внести ролик до чорного списку

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Заблокований ролик не відображатиметься в рекомендаціях, результатах пошуку, зникне зі списку улюблених та з історії переглядів. Ролик все ще буде видно у налаштуваннях плейлиста.

Переглянути чорний список і знову увімкнути елементи, заблоковані помилково:
Установки > меню у заголовку > Чорний список

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Улюблені ролики та історія переглядів

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Улюблені ролики на екрані плеєра відзначаються зірочкою у верхньому правому кутку.

Контекстні меню в заголовку екрана та за довгим кліком у галереях та списках

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Копіювати ім'я або адресу відео або плейлиста в екрані відтворення або в будь-якому списку.

Швидкий старт — додати рекомендовані канали та плейлисти

Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?) => Смерть Кощія у списку рекомендацій (чи можна зробити затишним та безпечним Ютюб?)

Програма відразу виглядатиме так, як на скріншотах вище.

Непотрібні канали та плейлисти можна вимкнути або видалити у налаштуваннях.

Встановлення

Сторінка проекту: https://github.com/sadr0b0t/yashlang/
англійською мовою: https://github.com/sadr0b0t/yashlang/blob/master/README.en.md
релізи: https://github.com/sadr0b0t/yashlang/releases

Майте на увазі, що перемикатися між різними версіями з різних джерел на одному пристрої не вийде через різні підписи файлу apk, перед встановленням версії з нового джерела доведеться встановлену версію спочатку видалити разом з даними - кешем плейлистів та історією переглядів (або придумати, як ці дані перенести).

Технічні деталі

Не вимагає облікового запису Гугл/Ютюб, потрібен тільки інтернет, використовує бібліотеки:

Відкритий вихідний код, вільна ліцензія GPLv3.

питання: парсити сайти без дозволу (або з явною забороною) авторів взагалі законно? Google видаляє з Google плея програми, які використовують їх API, а парсят їхні сайти, т.к. вони порушують їхню користувальницьку угоду.
відповідь: звичайно, законно, це ваша справа, який інструмент використовуватиме читання загальнодоступної інформації. Більш того: Суд США повністю легалізував скрапінг сайтів та заборонив йому технічно перешкоджатиАле у Гула може бути інша думка, особисто в мене поки немає бажання вирушати в американський суд їх переконувати.

Небагато коду

Бібліотека NewPipeExtractor - Допоміжний проект плеєра NewPipe, дозволяє завантажувати список роликів для зазначеного каналу або плейлиста, завантажувати докладну інформацію про відоме відео (те, що видно на веб-сторінці ролика), отримувати адресу іконки відео, а також отримувати адресу потоку відео.

Код для завантаження плейлиста трохи громіздкий, тому тут наводити його не буду, кому цікаво - загляньте в вихідні джерела, в основному це клас ContentLoader.

Подивимося, як отримати адресу потоку відео на адресу публічної сторінки відео і грати його в плеєрі.

Підключити бібліотеку до
app/build.gradle

dependencies {
...
    // NewPipe: youtube parser
    // https://github.com/TeamNewPipe/NewPipeExtractor
    implementation "com.github.TeamNewPipe:NewPipeExtractor:v0.17.4"
...
}

Цікаво, що її все одно не вийде використовувати, т.к. приклади лаятимуться на недостатній клас Downloader. Його можна скопіювати в проект із каталогу автоматичних тестів NewPipeExtractor/extractor/src/test/java/org/schabi/newpipe/Downloader.java — працює для версії 0.17.4 (схоже, що у новішій версії бібліотеки ця частина була перероблена, але ще потрібно перевірити).

Отримати адресу потоку відео на сторінці відео на сайті Ютюб:

app/src/main/java/su/sadrobot/yashlang/controller/ContentLoader.java

    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 може бути публічна адреса сторінки будь-якого відео на сайті Ютюб, наприклад https://www.youtube.com/watch?v=pd2RlatmNRk

Плеєр буде екзоплеєр від самої Google. Це не веб-обгортка над Ютюб, а справжнісінький вбудований плеєр для програвання будь-яких відеороликів, досить гнучкий і налаштований. Навіть вміє грати потоки відео з Ютюба, якщо вказати йому правильну адресу. Адреса потоку ми отримали щойно, тому подивимося, як його відправити у програвач.

Підключити бібліотеку до проекту app/build.gradle:

dependencies {
...
    // google Exoplayer
    // https://github.com/google/ExoPlayer
    // https://exoplayer.dev/
    implementation 'com.google.android.exoplayer:exoplayer:2.10.8'
...
}

Всі нюанси розміщення компонента плеєра на екрані програми розглядати не будемо (можете подивитися в прикладах на сайті проекту або в коді), подивимося тільки на те, як запустити програвання відео з Ютюба в плеєрі за адресою:

app/src/main/java/su/sadrobot/yashlang/WatchVideoActivity.java

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);
    }
}

відомі проблеми

  • Не буде грати ролики з віковими обмеженнями, які вимагають логін до облікового запису Гугл/Ютюб

наприклад: Ілля Муромець, Кіноконцерн "Мосфільм", Руслан та Людмила 1-а серія / Ruslan and Lyudmila film 1, Кіноконцерн «Мосфільм»

порада: додавати такі ролики до чорного списку або попросити автора ролика зняти обмеження, виставлене помилково.

  • Не буде грати деякі ролики-трансляції, для яких сервіс повертає нульову довжину (для таких роликів тривалість у списках та галереї зазначена як «[dur undef]»)

наприклад: Ну зачекай! Усі Випуски Союзмультфільм HD (Мультики для дітей), Мультики студії Союзмультфільм, Топ мультиків Союзмультфільм, Мультики студії Союзмультфільм

порада: додавати такі ролики до чорного списку.

  • Ролики, доступні лише за прямими посиланнями, можуть не потрапити в локальний плейлист, навіть якщо ви завантажуєте всі ролики користувача

наприклад: Приборкання вогню 1 серія, Кіноконцерн «Мосфільм»

  • Якщо зустрінете публічний ролик, який не вимагає логін, грає в браузері, але не грає в плеєрі, надсилайте баг-репорт (цілком можливо, проблема вже виправлена ​​в новій версії NewPipeExtractor і потрібно буде лише оновити складання з цією версією, наприклад).

  • Інтерфейс може підгальмовувати при повільному (але не вимкненому) інтернеті

У підсумку

Син переїхав з планшета на смарт-тв Samsung, який не вміє запускати програми Андроїд. Тому найкращий батьківський контроль — все одно особистий.

Але програма вийшла досить зручною для того, щоб я почав її використовувати сам. Перше враження з ранніх версій, що працюють, — потрапив в інший світ. Весь контент завантажується з ютюбу, але це вже не ютюб, а щось інше, безпечне і контрольоване, ніби вийняв з ока сколопендру і посадив її в скляну банку. І річ саме в рекомендаціях.

Джерело: habr.com

Додати коментар або відгук