sadr0b0t / yashlang

PeerTube and YouTube player for Android with local playlists and whitelisted recommendations
GNU General Public License v3.0
51 stars 3 forks source link

Кэшировать иконки видео и плейлистов #148

Closed sadr0b0t closed 1 year ago

sadr0b0t commented 2 years ago

Полезная задача в принципе. Но особенно актуальная для релазиации режима оффлайн https://github.com/sadr0b0t/yashlang/issues/142

Пусть сразу будет отдельным тикетом.

Еще одна история с иконками-превью роликов

Кстати, про режим "оффлайн". Вопрос - вытягивать в таком режиме иконки с превью видео. Если интернета нет, то их и так не будет (но будет попытка загрузить их массово - это тормоза). Если есть, то пользователь может ожидать, что в режиме оффлайн плеер за ними не полезет. Это можно сделать настройкой. Еще можно, кстати, кэшировать превьюшки для роликов с офллайн-потоками.

Для плейлистов иконки нужно просто вообще для всех кэшировать.

И да, для режима плеера https://github.com/sadr0b0t/yashlang/issues/134 нужно качать иконки видео размером побольше, т.к. их растягиваем вместо потока аудио на весь экран.

sadr0b0t commented 2 years ago

Размер иконок:

sadr0b0t commented 1 year ago

Почищу немного код, оставлю здесь. Сейчас иконки роликов беру из API, но раньше в самом начале собирался брать их вручную. В VideoThumbManager остался неиспользуемый код.

    //private static final String THUMB_URL_TEMPLATE = "https://img.youtube.com/vi/%id%/sddefault.jpg";
    private static final String THUMB_URL_TEMPLATE = "https://img.youtube.com/vi/%id%/default.jpg";

    // http://img.youtube.com/vi/<insert-youtube-video-id-here>/default.jpg
    // http://img.youtube.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg
    // http://img.youtube.com/vi/<insert-youtube-video-id-here>/mqdefault.jpg
    // http://img.youtube.com/vi/<insert-youtube-video-id-here>/sddefault.jpg
    // http://img.youtube.com/vi/<insert-youtube-video-id-here>/maxresdefault.jpg

    /**
     * Load thumbnail for youtube video
     * @param ytId youtube video id
     * @return video thumbnail as bitmap
     * @throws IOException
     */
    public Bitmap loadVideoThumb(final String ytId) throws IOException {
        // 1) YouTube data api (Android):
        // https://github.com/youtube/api-samples/tree/master/java
        // (похоже, хотят обращаться к ютюб-сервисам, установленным на телефоне;
        // скорее всего выберем данунах, проще тягать иконки по шаблону URL и парсить страничку с поиском)
        // https://developers.google.com/youtube/v3/quickstart/android
        // build.gradle:
        //     compile('com.google.apis:google-api-services-youtube:v3-rev209-1.25.0') {
        //        exclude group: 'org.apache.httpcomponents'
        //    }
        // AndroidManifest.xml
        //     <uses-permission android:name="android.permission.INTERNET" />
        //    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

        // 2) Вручную по шаблону
        // https://www.thewebtaylor.com/articles/how-to-get-a-youtube-videos-thumbnail-image-in-high-quality
        // http://img.youtube.com/vi/<insert-youtube-video-id-here>/hqdefault.jpg
        // https://img.youtube.com/vi/KguUtafZtN8/sddefault.jpg

        return loadBitmap(THUMB_URL_TEMPLATE.replace("%id%", ytId));
    }
sadr0b0t commented 1 year ago

https://github.com/sadr0b0t/yashlang/commit/b302e96a08add054d24ff270371bf6aec97f2375 https://github.com/sadr0b0t/yashlang/commit/c1f5f69d8ada088cb2b9d1eeb6ab773299256fbe

sadr0b0t commented 1 year ago

Одна иконка видео (при текущем качестве) попучается примерно 6КБ. Для канала 1000 роликов это будет примерно 6МБ, 10 тыс роликов - 60МБ, 100 тыс роликов - 600МБ. Это уже довольно большая база. 200 тыс роликов ~ 1Гб.

sadr0b0t commented 1 year ago

Поймал эксепшен при попытке закэшировать иконку "Три толстяка"

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.compress(android.graphics.Bitmap$CompressFormat, int, java.io.OutputStream)' on a null object reference
    at su.sadrobot.yashlang.controller.ThumbManager.saveBitmap(ThumbManager.java:121)
    at su.sadrobot.yashlang.controller.ThumbManager.loadVideoThumb(ThumbManager.java:155)
    at su.sadrobot.yashlang.view.VideoItemPagedListAdapter$5.run(VideoItemPagedListAdapter.java:274)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:764)

Исправляю здесь, пока не зарелизил

sadr0b0t commented 1 year ago

Поймал эксепшен при попытке закэшировать иконку "Три толстяка"

фикс: https://github.com/sadr0b0t/yashlang/commit/52e1dd1ec5455ec04d9190f55421422de0891eff

плюс небольшой рефактор для единообразия сюда же: https://github.com/sadr0b0t/yashlang/commit/a2536a35da169b2e378803bcfc5fd5400621e498