Closed sadr0b0t closed 1 year ago
Размер иконок:
плейлисты: вытянуть максимальный (их очень ограниченное количество всё равно)
для видео: -- минимальный размер - посмотреть размеры иконок в списках в варианте для планшетов xlarge (должно быть точно не меньше) -- теоретически этот вариант можно рассматривать для кэширования иконок без разбора для всех роликов
больше может потребоваться для режима аудио-плеера - там их нужно растягивать на весь экран -- тянуть и кэшировать для всех роликов подряд без разбора может быть уже заметный по использованию ресурсов вариант -- но нужно еще посмотреть, как там с размерами -- возможно, большие версии картинок как раз кэшировать для оффлайн роликов, а маленькие - для всех подряд
Почищу немного код, оставлю здесь. Сейчас иконки роликов беру из 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));
}
Одна иконка видео (при текущем качестве) попучается примерно 6КБ. Для канала 1000 роликов это будет примерно 6МБ, 10 тыс роликов - 60МБ, 100 тыс роликов - 600МБ. Это уже довольно большая база. 200 тыс роликов ~ 1Гб.
Поймал эксепшен при попытке закэшировать иконку "Три толстяка"
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)
Исправляю здесь, пока не зарелизил
Поймал эксепшен при попытке закэшировать иконку "Три толстяка"
фикс: https://github.com/sadr0b0t/yashlang/commit/52e1dd1ec5455ec04d9190f55421422de0891eff
плюс небольшой рефактор для единообразия сюда же: https://github.com/sadr0b0t/yashlang/commit/a2536a35da169b2e378803bcfc5fd5400621e498
Полезная задача в принципе. Но особенно актуальная для релазиации режима оффлайн https://github.com/sadr0b0t/yashlang/issues/142
Пусть сразу будет отдельным тикетом.
Еще одна история с иконками-превью роликов
Для плейлистов иконки нужно просто вообще для всех кэшировать.
И да, для режима плеера https://github.com/sadr0b0t/yashlang/issues/134 нужно качать иконки видео размером побольше, т.к. их растягиваем вместо потока аудио на весь экран.