sadr0b0t/yashlang

Режим оффлайн глобально

sadr0b0t opened this issue · 6 comments

Продолжение #8 в отдельном тикете

Режим "оффлайн" для всего приложения: на главной странице и в рекомендациях под видео показывать только ролики с оффлайн-версией (имеет смысл, если накачать в поездку достаточно много; здесь же, пожалуй, потребуется кэширование иконок - лучше это все рассмотреть в отдельном тикете).

Вот это реализовано:

для общей выдачи в режиме "оффлайн" придется таки завести флаг "есть дорожка оффлайн" для записей видео в общей таблице - как флаг "enabled" (следить за этим флагом при модификации таблицы закачек, держать в актуальном состоянии).


Модифицировать запросы с дополнительным фильтром по флагу будет не сложно. Сложно будет добавить этот включаемый фильтр для всего многообразия запросов, которые сейчас есть, без дублирования кода и ада с названиями функций в объекте DAO. По текущему опыту не очень понятно, получится ли в ROOM убирать кусок запроса в зависимости от внешней настройки (добавлять параметр ко всем запросам тоже пипец как не хочется). Предварительно: возможно, придется сделать базовый интерфейс на DAO VideoItem и две реализации - в одной будет фильтр по роликак с оффлайн-потоками, в другой нет (как сейчас).

Так, это уже было:

Режим "оффлайн" - во всем приложении показывать только ролики, у которых есть поток оффлайн. В базе данных для этого уже есть необходимый флаг. Нужно добавить режим в интерфейс и (сложнее) провести масштабный рефакторинг, чтобы завести на каждый вариант запроса две версии (можно продублировать все запросы с вариантом этого параметра, но это пипец дублирование по всем исходникам, или нужно попрообовать сделать две версии VideoItemDao и отдавать их через фабрику).


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

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

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

Индикация

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

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

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

Включение режима - можно завести вкладку в главных настройках. Например, после профилей. Для одной галки может многовато целой вкладки, но там же можно будет разместить галку включения режима аудио-плеера, поэтому в перспективе - ок.

Есть режим оффлайн 386e34a

  • Включается/выключается через настройки > меню > Больше настроек > первая вкладка "Разное"
    -- Выносить быстрое включение/выключение на главную пока не стал и, пожалуй, и незачем это.

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

  • Режим отображается: на главном экране иконкой "дискетка" в правом нижнем углу; на экранах "любимо", "история", "плейлисты", "поиск" - иконка "дискетка" в заголовке

Доработать:

  • при экспорте "только включенных" плейлистов в режиме оффлайн будут экспортированы только ролики с потоками оффлайн. Это, пожалуй, регрессия, т.к. наличие/отсутствие потока оффлайн к экспорту ссылок на ролики отношения не имеет. Стоит добавить отдельный вызов для включенных плейлистов без фильтра по наличию потоков оффлайн для экспорта.
  • в списке плейлистов (не в настройках, а в режиме навигации) следует скрывать плейлисты, у которых при включенном режиме оффлайн внутри ничего нет. Т.к. обычно оффлайн скачано не слишком много роликов, а плейлистов может быть включено много, придется еще хорошо поискать, в каком из этих плейлистов что-то есть. При достаточно большом количестве плейлистов экран навигации по плейлистам в режиме оффланй становится почти бесполезен.
  • В режиме оффлайн на главном экране рисую иконку "дискетка" справа внизу. Хотя иконка достаточно мелкая, лаконичность интерфейса всё равно страдает. В общем с непривычки что-то не нравится мне эта штука, но пока не знаю, как по-другому сделать. Вариант - не рисовать её ввобще, т.к. в режиме оффлайн на всех роликах и так будут нарисованы дискетки. Но это косвенный маркер.

при экспорте "только включенных" плейлистов в режиме оффлайн будут экспортированы только ролики с потоками оффлайн. Это, пожалуй, регрессия, т.к. наличие/отсутствие потока оффлайн к экспорту ссылок на ролики отношения не имеет. Стоит добавить отдельный вызов для включенных плейлистов без фильтра по наличию потоков оффлайн для экспорта.

это исправил: d7a84f8

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

Получается не вполне тривиальный запрос, уношу в отдельный тикет: #156

здесь всё

Еще несколько исправлений:

aa2aae7
0a98277

  • не пробовать грузить иконку из кэша, если файла нет

b639bfa

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

лайфхак: как теперь загрузить иконки для всех оффлайн роликов

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