Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

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

Closed
sadr0b0t opened this issue Jul 20, 2022 · 6 comments
Closed
Labels
enhancement New feature or request

Comments

@sadr0b0t
Copy link
Owner

sadr0b0t commented Jul 20, 2022

Полезная задача в принципе. Но особенно актуальная для релазиации режима оффлайн #142

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

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

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

  • Ссылки на иконки в базе можно не хранить
  • Название файла с иконкой - video_id.png playlist_id.png (в отдельных каталогах или с превиксом video_xx, pl_xx)
  • Управвление кэшированными иконками - в отдельной вкладке - там же, где сейчас закачки потоков
    -- показать размер
    -- удалить весь кэш
    -- удалить лишние файлы (из имени файла придется выуживать id видео/плейлиста и каждый в базе сверять)
    -- удалить кэш для файлов, у которых нет потоков оффлайн
    -- обновить кэш (для тех файлов, которые уже есть - тоже через запрос в базу по id)
    -- выкачать иконки для всех файлов, у которых есть оффлайн-поток
  • Простой вариант с обновлением: удалить весь кэш, выкачать кэш для файлов с потоками оффлайн
  • Вариант: сохранять кэш иконок вообще для всех видео, которые появляются в любом списке. Потом если он привысит разумные пределы чистить его через "удалить кэш для роликов, у которых нет потоков оффлайн". Скорее всего по сравнению с закачанными потоками там вообще будут копейки.

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

И да, для режима плеера #134 нужно качать иконки видео размером побольше, т.к. их растягиваем вместо потока аудио на весь экран.

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Jul 20, 2022

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

  • плейлисты: вытянуть максимальный (их очень ограниченное количество всё равно)

  • для видео:
    -- минимальный размер - посмотреть размеры иконок в списках в варианте для планшетов xlarge (должно быть точно не меньше)
    -- теоретически этот вариант можно рассматривать для кэширования иконок без разбора для всех роликов

  • больше может потребоваться для режима аудио-плеера - там их нужно растягивать на весь экран
    -- тянуть и кэшировать для всех роликов подряд без разбора может быть уже заметный по использованию ресурсов вариант
    -- но нужно еще посмотреть, как там с размерами
    -- возможно, большие версии картинок как раз кэшировать для оффлайн роликов, а маленькие - для всех подряд

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Feb 5, 2023

Почищу немного код, оставлю здесь. Сейчас иконки роликов беру из 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
Copy link
Owner Author

sadr0b0t commented Feb 5, 2023

b302e96
c1f5f69

@sadr0b0t sadr0b0t closed this as completed Feb 5, 2023
@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Feb 6, 2023

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

@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Feb 7, 2023

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

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 sadr0b0t reopened this Feb 7, 2023
@sadr0b0t
Copy link
Owner Author

sadr0b0t commented Feb 7, 2023

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

фикс: 52e1dd1

плюс небольшой рефактор для единообразия сюда же: a2536a3

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant