Coder Social home page Coder Social logo

thedrhax / blacksilverufa Goto Github PK

View Code? Open in Web Editor NEW
28.0 5.0 4.0 134.04 MB

Хранилище стримов и чата Twitch-канала BlackUFA

Home Page: https://bsu.drhx.ru

Python 43.86% Mako 0.47% JavaScript 48.95% Shell 1.25% SCSS 5.15% Dockerfile 0.32%
static-site

blacksilverufa's Introduction

Архив стримов BlackUFA Build Status

Перейдите на GitHub Pages для доступа ко всем функциям

Зависимости

  • bash >= 4.0
  • python3-venv (Ubuntu) или python3 (Alpine)
  • git (для работы с gh-pages и получения даты добавления стрима)
  • tzdata — для установки правильного часового пояса
  • libc6 (Ubuntu) или build-base (Alpine) — для Node.js

Сборка и тестирование

Основную часть работы выполняет shell-скрипт bsu в корне репозитория. К сожалению, автоматическая сборка на Windows в данный момент не поддерживается, но проект можно собрать вручную при наличии Python.

При первом запуске скрипт создаст виртуальное окружение Python в директории ./_python и установит туда все пакеты, неоходимые для сборки и запуска проекта (они перечислены в файле requirements.txt).

Ниже приведены примеры использования скрипта ./bsu.

# Обновить виртуальное окружение Python
./bsu venv update

# Загрузить текущую версию ветки gh-pages в директорию ./_site
# (обязательно для сборки проекта, т.к. в ветке gh-pages хранятся важные данные)
./bsu pages pull

# Загрузить текущую версию базы данных со стримами в ./data (обязательно)
./bsu data pull

# Загрузить недостающие субтитры (если они ещё доступны)
./bsu download-chats

# Собрать сайт из исходного кода
./bsu build
# или поднять веб-сервер на порту 8000
# (будет пересобирать сайт автоматически при изменении кода)
./bsu serve
# или поднять сервер и собрать сайт в режиме отладки
# (заменяет абсолютные ссылки на относительные, меняет режим webpack)
./bsu debug

# Закоммитить новую версию статики в локальную ветку gh-pages
./bsu pages commit "<msg>"

# Отправить изменения на GitHub
./bsu pages push

Связанные проекты

  • Twitch-Chat-Downloader (форк) — для сохранения чата в виде субтитров;
  • streamlink (форк) — для записи стримов без рекламы (требуется аккаунт подписчика);
  • Twitch-Utils — для автоматического склеивания записей стримов и сопоставления им записей с YouTube;

blacksilverufa's People

Contributors

disaipe avatar thedrhax avatar zaprvalcer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

blacksilverufa's Issues

Перекомпилировать все субтитры

Накопилось уже несколько изменений в их формате:

  • Убраны лишние поля (fc23a42);
  • На старых субтитрах продолжительность сообщений не совпадает с вычисленной (TheDrHax/Twitch-Chat-Downloader@a06341c);
  • Новая логика группировки словосочетаний и переноса длинных сообщений (e0ae10d);

Все изменения, перечисленные выше, будут применены при вызове ./bsu script converter --all. И они уже применены для новых стримов (т.е. действуют с 25 июля 2020).

Однако есть ещё пара решений, которые нужно обдумать:

  • Изменять ли размер субтитров? Сейчас там настроен 20-й размер шрифта, а можно поставить 16 или даже меньше.
    • Пусть будет 18, он меньше и хорошо читается;
  • Нормально ли выглядит текущая максимальная ширина сообщений? Может сделать её меньше или больше?
    • Большая часть сообщений влезает в строку. Если уменьшить, то каждое второе будет с переносом. Так что нормально, вроде;
  • Нужно ли изменить тайминги субтитров? Сейчас сообщения показываются от 2 до 5 секунд, в зависимости от их длины (от 0 до 100 и больше символов).
    • Слегка увеличил диапазон длин сообщений (со 100 до 200), так что короткие сообщения теперь будут чуть ближе к 2 секундам;

Превью на шкале перемотки

Давно хотел сделать превью при перемотке, как на YouTube. Plyr это давно умеет, но нужно подготовить файлы с превью (storyboards) и их разметку (VTT).

  • Использовать форк youtube-dl с поддержкой storyboards для скачивания превью для всех видео;
  • Сгенерировать разметку превью в формате VTT (пример);
  • Придумать, где хранить тысячи картинок - по идее, они весят где-то в районе 20КБ, так что можно и в отдельный репозиторий их записать;
  • Подключить превью к Plyr;

Переключение между Plyr и YouTube

В 2019 году YouTube отключил программное изменение качества воспроизодимого видео. Plyr по умолчанию не даёт доступа к UI плеера, так как некоторые функции ломаются (например, полноэкранный режим). Нужно сделать кнопку, которая будет временно убирать интерфейс Plyr для доступа к функциям YouTube.

  • Отключить полноэкранный режим у iframe плеера YouTube - это не даст открыть YouTube на весь экран, но не помешает сделать то же самое с Plyr;
  • Включить элементы управления в плеере YouTube;
  • Баг: При запуске воспроизведения из YouTube, Plyr сразу же ставит видео на паузу;
  • Сделать кнопку, плавающую в окне плеера;
  • По нажатию кнопки:
    • Скрывать Plyr и ставить ему стиль pointer-events: none?
    • Переключать z-index iframe плеера YouTube и субтитров, чтобы они были на переднем плане?

Улучшить формат данных, используемый при генерации сайта

Хранение всех данных в словарях и массивах делает код ненадёжным и нечитаемым. Думаю, стоит реализовать преобразование от простого формата к объектам. Такой подход позволит создавать отдельные методы для стримов и игр, а также сделает связи между ними более явными.

Поддержка склеенных записей

В архиве есть 4 группы стримов, которые уже/будут покрыты одной записью:

  • The Last of Us: Part II (все стримы, официальная запись)
  • Ghost of Tsushima (все стримы, официальная запись)
  • Marvel's Avengers (стримы 2-6, неофициальная запись)
  • Marvel's Avengers (стримы 7-8, неофициальная запись)

Сейчас эти записи приходится разбивать на несколько сегментов и ограничивать воспроизведение с помощью полей end, offset и force_start. Вместо этого предлагается добавить поддержку нескольких сегментов в одном SegmentReference.

  • Расширение формата streams.json (на примере TLoU2)
// streams.json
{
  "654380816": {  },
  "655265437": {  },
  "655528246": {  },
  "656257835": {  },
  "654380816,655265437,655528246,656257835": {
    "youtube": "ZBHv3E0ZDHo",
    "offsets": ["0:00", "7:32:13", "14:13:20", "17:13:32"],
    "note": "4 стрима были склеены в одну запись."
  },
}
// games.json
[
  {
    "streams": [
      { "name": "The Last of Us: Part II", "twitch": "654380816,655265437,655528246,656257835" }
    ]
  }
]
  • Создание виртуального стрима и сегмента, необходимых для работы SegmentReference;
    • Класс JoinedStream - принимает на вход несколько стримов и комбинирует их в стрим с одним сегментом;
      • Из первого стрима: abs_start (всегда 0), date
      • Из всех стримов: twitch, messages (сумма), duration (сумма);
      • Объединение таймкодов - включая вывод в _site/data/timecodes.json для бота;
      • Объединение субтитров - по аналогии с генерацией субтитров при использовании поля cuts;
      • Переделать инвалидацию кэша изменённых субтитров - они теперь зависят не только от cuts, но и от смещений сегментов;
    • Виртуальный сегмент;
      • Из первого сегмента: youtube, direct, official;
      • Оригинальные сегменты остаются без ссылок и должны быть проигнорированы при составлении списка недавних стримов, так как для них невозможно создать SegmentReference;
      • Вывод в _site/data/segments.json для бота;
      • Скрывать покрытые оригинальные сегменты из _site/data/segments.json;
    • Исправить сериализацию streams.json;
  • Обратная совместимость со ссылками на сайт - перенаправление на виртуальный сегмент и обратно;
    • Перенаправление с оригинального на совмещённый сегмент;
    • Обратное перенаправление, если совмещённый сегмент был удалён;
    • Перенаправление с прямой ссылки на страницу с плеером (/links/{game}.html#{segment}) - работает без изменений;
  • Оформление ссылок на оригинальные стримы;
  • Совместимость с поиском по сайту - переход по ID должен принимать одиночные и совмещённые сегменты;
    • Баг: при указании первого сегмента совмещённого стрима в поиске появляется две подсказки (обе работают);
  • Починить скачивание чатов - нужно игнорировать JoinedStream'ы при составлении списка отсутствующих субтитров;
  • Исправить статистику;
  • Запоминать позицию воспроизведения относительно оригинальных стримов;
    • Передача плееру сведений об оригинальных стримах и смещениях их первых сегментов;
    • Однозначное двухстороннее преобразование текущего времени и времени конкретного стрима;
    • Выбор самого дальнего таймкода, если пользователь смотрел сегменты оригинальных стримов до их совмещения;
    • Перезапись позиций всех оригинальных стримов во время просмотра виртуального;
  • Обновить бота для публикации комментариев;

Задачи после слияния:

  • Ссылки на торренты (пока они есть в fallback);
  • [Сложно] Поддержка нескольких источников (для стримов, разбитых на части) - киллер-фича для всего архива, но дико сложная в реализации из-за недостаточной гибкости Plyr и других HTML5 плееров;
  • [Сложно] Автоматическое добавление склеенных записей в архив - разбитые стримы уже поддерживаются, а вот это будет реально трудно реализовать;

Субтитры несовместимы с VLC и PotPlayer (как минимум)

В коммите fc23a42 весь архив был переведён на более компактный формат субтитров. Как оказалось, не все плееры полностью поддерживают стандарт Advanced SubStation Alpha. Cубтитры не отображаются в VLC и PotPlayer, однако отлично работают в MPV и JavascriptSubtitlesOctopus (цель этого проекта).

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

  • Построчное считывание файла из GET-запроса;
  • Тривиальная конвертация строк - нужно лишь разбить строку по запятым и добавить недостающие поля;
Format:         Start, End, Style,                                          Text
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text

Dialogue:           {start}, {end}, Default,                             {user}: {message}
Dialogue: Marked=0, {start}, {end}, Default, {user}, 0000, 0000, 0000, , {user}: {message}
  • Запись файла в Blob с последующей генерацией URL;
  • Бонус: Отображение прогресса преобразования файла;

Добавить поддержку ВК

Поддержка ВКонтакте снова сломана. Дело в том, что теперь прямые ссылки, полученные моим сервером, могут быть открыты только с того же IP. По очевидным причинам это не подходит для применения здесь.

Не знаю, что теперь с этим делать, так что пусть этот тикет здесь побудет.

Альтернативные источники сегментов

Для некоторых стримов просто необходима возможность добавлять запись из альтернативного источника. В данный момент всё будет работать, но довольно криво:

  • Таймкоды будут отображаться только на последнем сегменте;
  • Сегменты отображаются отдельно и их нужно указывать в games.json;

Трейлеры Мамая

Рубрика Мамая относительно закрепилась на стримах, поэтому хотелось бы отметить соответствующие трейлеры особым образом.

Для этого понадобится:

  • Найти все сообщения Мамая в логах IRC (субтитры не подходят, т.к. его иногда банят, и сообщения пропадают);
  • Проверить каждое сообщение на релевантность к какому-либо из таймкодов (наверное с помощью функции Okapi BM25);
  • При обнаружении совпадений добавить отметку к трейлеру (или вынести его в отдельный список);

Рендерить чат сбоку от видео

Было бы круто реализовать рендеринг чата, как на стриме - сбоку от видео и без исчезающих сообщений. Подробности пока не придумал.

Ограничить использование параметра start в стримах

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

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

Вынести генерацию сайта с GitHub

Лучше взять преобразование Markdown в HTML под свой контроль. Даже если этим по прежнему будет заниматься Jekyll, можно будет использовать любую тему, а не только те, которые предлагает GitHub. Ещё это сделает обновление сайта более оперативным, а то сейчас оно занимает пару минут после отправки изменений в ветку gh-pages.

Интерактивная главная страница

На главной странице перечислено уже несколько сотен различных стримов и прохождений. Со временем их будет становиться всё больше, что будет дальше утяжелять страницу и усложнять поиск по ней.

Вместо этого можно сделать несколько фильтров:

  • По статусу прохождения (категории);
  • По временному диапазону;
  • По названию (аналогично текущему полю поиска);
  • Отдельная галочка "Искать по всем стримам", которая покажет вообще все возможные карточки, а не как сейчас - по первому стриму из каждого прохождения;

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

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

[Plyr] Обеспечить более точную перемотку стрима на сайте

В данный момент абсолютное большинство записей на сайте длятся более 2 часов. Из-за этого не очень удобно перематывать стрим, так как сдвиг курсора на 1 пиксель перематывает видео на 30 секунд (и это на экране 1080p). А с тачскрина вообще невозможно попасть на нужный момент.

Варианты решения проблемы:

  • Добавить панель с кнопками под плеер. Ну и заодно дать возможность вручную вбивать нужный таймкод, чтобы быстро на него перейти;
  • Как-то модифицировать Plyr, чтобы можно было менять режим шкалы времени. В обычном режиме показывать всю шкалу, а в более точно показывать только текущий момент и 10 минут в обе стороны.

Второй вариант сложнее, но зато позволит не выходить за рамки плеера.

Поддержка переменного смещения (или вырезанных фрагментов)

  • Реализация за счёт генерации виртуальных сегментов
  • Реализация за счёт редактирования субтитров и перерасчёта таймкодов
    • Генерация субтитров
    • Перерасчёт таймкодов
    • Динамическое смещение в параметрах start и end
      • Из-за этого ссылки на сегменты с параметром start начинаются не с того момента (например, 1-й The Sims 4)
  • Рефакторинг
    • Вынести генерацию субтитров из структуры данных
    • Реализовать метод offset(t) вместо свойства с тем же названием
      • Исправляет пункт 2.3;
      • Тогда в TimecodesSlice в качестве offset вместо числа надо будет передавать (лямбда-)функцию, зависящую от времени;

Сортировка по дате

Нужно сортировать игры по дате первого стрима, чтобы очерёдность была более очевидна.

Ссылки на таймкоды и на конкретный стрим конкретной игры

Текущая реализация коротких ссылок позволяет переходить прямо на конкретный стрим или игру по их ID. Было бы полезно расширить эту функциональность.

/r/?{игра}                     → /links/{игра}.html
/r/?{сегмент}                  → /r/?{игра}/{сегмент}
/r/?{сегмент}/{таймкод}        → /r/?{игра}/{сегмент}/{таймкод}
/r/?{игра}/{сегмент}/{таймкод} → /links/{игра}.html#{сегмент}?t={таймкод}
  • Расширить парсер в redirect.js;
  • Добавить поддержку параметра ?t={таймкод} в player.js;
  • Сделать таймкоды копируемыми;

Добавить 4-й уровень разделения стримов

В данный момент реализована следующая иерархия:

  1. Stream - ссылается на конкретный стрим на Twitch;
  2. Segment - описывает запись фрагмента стрима. Stream может содержать несколько Segment'ов. Порядок сегментов определяется по смещению записи относительно начала стрима (поле offset);
  3. SegmentReference - ссылается на весь Segment или его фрагмент. Позволяет связывать Segment с объектами Game и затем отображать их на сайте. Порядок SegmentReference определяется по значению поля start;

Проблема в том, что в некоторых случаях один SegmentReference описывает сразу несколько релевантных фрагментов стрима. Например, если на одном стриме было несколько "первых взглядов", то в названии одного SegmentReference записывается несколько игр, разделённых слэшем, чтобы не дублировать один и тот же плеер на странице. Также возникают проблемы, когда на одном стриме одна игра повторяется несколько раз, но с перерывами на другие игры.

Текущая реализация позволяет указать начало только первой игры в SegmentReference, а остальные тайминги теряются. Это делает невозможным автоматическое разделение SegmentReference при добавлении записей через CLI. Например, бот не смог добавить запись 3-го Nioh 2 из-за того, что и перед, и после Nioh был The Longing, но учтён был только первый заход в игру, а второй был прибавлен к ожидаемой продолжительности Nioh 2.

Поэтому нужно добавить возможность отмечать у SegmentReference точки возможного разделения. Для этого можно изменить синтаксис games.json следующим образом:

{
  "name": "The Longing",
  "category": "ongoing",
  "id": "the-longing",
  "streams": [
    { "twitch": "563856575", "splits": [
      { "name": "1 (400)", "start": "3:36:11" },
      { "name": "1 (400)", "start": "6:01:02" }
    ] },
    { "name": "2 (396-395)", "twitch": "564858921" },
    { "twitch": "565405331", "splits": [
      { "name": "3 (393-392)" },
      { "name": "3 (393-392)", "start": "5:39:50" }
    ] },
    { "twitch": "567045755", "segment": 1, "splits": [
      { "name": "4 (383-382)" },
      { "name": "4 (383-382)", "start": "7:27:55" }
    ] },
    { "twitch": "567719582", "segment": 0, "splits": [
      { "name": "5 (380-379)" },
      { "name": "5 (380-379)", "start": "4:52:12" }
    ] }
  ]
}

Для составных SegmentReference указываются только ID стрима и номер сегмента, а название и время начала определяются из SubReference. Дублирующиеся названия должны быть отброшены, т.е. в примере выше слэшей в названиях SegmentReference не будет. Или, как вариант, разрешить указывать SubReference без названия и в случае разделения присваивать им название предыдущего SubReference.

Другой пример:

{
  "name": "Первый взгляд",
  "category": "first",
  "type": "list",
  "id": "first",
  "streams": [
    "    ...    ",
    { "name": "Warcraft III: Reforged", "twitch": "543591605" },
    { "twitch": "559668833", "splits": [
      { "name": "Foregone" },
      { "name": "Beautiful Desolation", "start": "3:42:17" }
    ] },
    { "twitch": "562741500", "splits": [
      { "name": "Weakless" },
      { "name": "Wolcen: Lords of Mayhem", "start": "2:02:40" }
    ] },
    { "twitch": "563856575", "splits": [
      { "name": "Halo: Combat Evolved Anniversary" },
      { "name": "Stilt Fella", "start": "2:08:43" }
    ] }
  ]
}

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

Реализовать поддержку сегментированных записей стримов

У нас есть уже два стрима, которые не были загружены на YouTube. Они в итоге попали в ВК, но из-за ограничения продолжительности видео были разбиты на две части. Нужно что-нибудь придумать, чтобы на второй части стрима нормально отображались субтитры.

  • Показывать по плееру на каждый сегмент стрима
  • Посчитать и применить смещение субтитров для 2-го и последующих сегментов
  • Адаптировать консольные команды под этот тип стримов
  • Совместить все сегменты в одном плеере, как в MPV
    ... или ...
  • Разворачивать оба плеера при переходе по ссылке с указанием стрима
  • Реализовать поддержку единых таймкодов для всех сегментов

Доработать поддержку ВК

  • Обновить README (опять)
  • Отдельный пример команды запуска стрима
  • Генерировать команду с помощью JavaScript
  • Получать видео через перенаправление с API

Парсить список клипов из чата

Было бы круто агрегировать ещё и клипы. А ещё лучше -- подгружать их названия прямо с Twitch. Клипы не удаляются вместе со стримами, поэтому тоже являются ценным материалом для архива.

Порядок стримов и поиск по ID

Первое. Хотелось бы иметь возможность просматривать весь архив стримов по порядку их выхода. Сейчас можно увидеть только 10 последних стримов, а это грубо говоря 2 недели. Бывает что ищешь какой то старый стрим, но не помнишь названия игры.

Второе. Хотелось бы иметь возможность поиска стрима по его ID, ну или поддержку прямых ссылок с ID (типа: https://blackufa.thedrhax.pw/564858921).

История изменений стрима

Было бы круто показывать на сайте полную историю стрима (в плане записей и разбиений на сегменты). Реализовать можно по тому же принципу, по которому работает история сообщений на GitHub.

Screenshot_20210204-015137

  • Извлечение истории стрима из Git (составить список ревизий, для каждой извлечь состояние);
  • Что делать с объединёнными стримами?;
  • Кэширование: сохранять в cache.json только ревизии или состояния тоже?;
  • history.json: объект, сопоставляющий ID стрима массиву его состояний;
"123": [
  {
    "date": "...",
    "state": { ... }
  }
]
  • Рендеринг истории на сайте;

Переход к недавно просмотренному

Хотел предложить идею по созданию блока для перехода к недавно просматриваемым стримам/плейлистам с главной страницы. Пусть сайт статичен, но наверное можно использовать куки.

Видео недоступно

Заметил, что сегмент 435683759 не воспроизводится на сайте из-за каких-то ограничений. Скорее всего это опять правообладатели постарались.

Screenshot_20200916-183851

Нужно выяснить, возможно ли найти такие видео чисто через YouTube Data API, и затем перезалить их на архивный канал.

Динамические фильтры сообщений

В данный момент архив поддерживает только глобальные фильтры сообщений по имени пользователя и регулярному выражению. Нужно добавить возможность указывать фильтры для отдельных игр и стримов. Например, это пригодится на Dead Cells, Noita, Clone Drone in the Danger Zone и других играх, где нужна постоянная фильтрация чата.

[
  {
    "name": "Clone Drone in the Danger Zone",
    "category": "infinite",
    "id": "clone-drone",
    "streams": [
      ...
    ],
    "blacklist": {
      "users": [
        "blackufa"
      ]
    }
  },
  {
    "name": "Dead Cells",
    "category": "infinite",
    "id": "dead-cells",
    "streams": [
      ...
    ],
    "blacklist": {
      "users": [
        "blackufa"
      ],
      "messages": [
        "!?(pick ?me|gg|rain|bombs|flies|cheers|jump|gud|rofl|dark|nice|spikes|easy|brut).*",
        "!?(poison|noob|notbad|tact|surv|secret|zombies?|heal|woot|fuuu|cool|great|praise).*",
        "!?(doors|chic?ken|shots|blood|dmg|boo|awww|chicken|nooo|birds|rekt|boy|ouch|:'\\().*",
        "!?(gitgud|boi|бабах|бах|паф|бум|тик|так|буф|пиф|хрясь|дзинь|[дL][0-9@\\!#]|do ?it).*",
        "!?(go|good ?luck|секрет|boss|lol|rofg|ahah|nice ?fall|haha).*"
      ]
    }
  },
  {
    "name": "Первый взгляд",
    "category": "first",
    "type": "list",
    "id": "first",
    "streams": [
      ...,
      { "twitch": "772063368", "subrefs": [
        { "name": "AquaNox: Deep Descent" },
        { "name": "Fishing: North Atlantic", "start": "2:32:49" },
        {
          "name": "Noita", "start": "3:58:41",
          "blacklist": {
            "messages": [
              "^[1-4]$"
            ]
          }
        }
      ] }
    ]
  }
]
  • Ограничение действия фильтров - на стримах с несколькими играми фильтры по играм и subrefs должны действовать только на своих участках, не затрагивая весь стрим;
  • Повторная обработка субтитров при изменении фильтров в games.json;

Восстановление ранних стримов

Архив начал собирать стримы в марте 2017 года. Всё, что было до первого стрима по BotW, теперь утеряно, так как Twitch не хранит стримы дольше 2 месяцев, а официальный архивный канал в то время ещё не использовался (хотя и существовал). И хотя логи чата и ID стримов уже не вернуть, их записи по-прежнему доступны в ВК.

  • Выбрать отдельный формат или диапазон ID, чтобы исключить коллизии с основными стримами;
00 00 00 00 0
│  │  │  │  └─ Порядковый номер
│  │  │  └──── День
│  │  └─────── Месяц
│  └────────── Год
└───────────── Два нуля в начале
  • Переопределение даты стрима - дату можно получить из ID;
  • Игнорировать старые стримы в chats.py и converter.py, т.к. скачать чат для них не получится;
  • Продолжительность стрима неизвестна - брать максимальный abs_end из сегментов?;
  • Убрать параметр --sub-file из команды MPV и ссылку на субтитры;

Источники:

Источник Контент Ссылка
BlackSilverUFA Официальные записи Канал YouTube
Олег Степанов Даты стримов, звуковые дорожки и записи ВК
GoodKott Готовые записи Плейлист YouTube
BlackUFA Highlights Готовые записи Канал YouTube

Список прохождений (дополняется):

Проблема с воспроизведением

Смотрел вчера запись Stray Souls и где-то после 3 часа записи (точно не помню) возникла проблема: вместо странички черный экран (скрин 1). Обновить страницу не помогло, я забил и продолжил на Ютубе. А сегодня подумал написать сюда, тк проблема никуда не делась. При переходе на предыдущую страницу (главную) - то же самое (скрин 2). Скрины 3 и 4 с консоли на проблемной странице (перед нажатием на плей и после). Надеюсь, поможет.

Capture1
Capture2
Capture3
Capture4

Отдельный репозиторий для изменённых субтитров

Их не так много, но лучше их хранить отдельно, т.к. они не добавляют никакой полезной информации. У отдельного репозитория также можно будет периодически чистить историю, не боясь потерять какую-то часть полезной информации.

К изменённым субтитрам относятся:

  • Субтитры для сегментов с вырезанными моментами (cuts);
  • Субтитры для объединённых стримов (WIP);

Система тегов

В данный момент архив поддерживает только один тип группировки стримов - по прохождениям. Это не особо гибкое решение, т.к. каждая новая группа создаёт новую страницу, результат в поиске и т.д. Например, если сделать группу стримов с артами, то получится ОГРОМНАЯ страница, которая уронит любой браузер.

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

  • Сделать файл tags.json, в котором будут группы тегов и их список;
  • Добавить поле tags к: Game, SegmentReference, SubReference;
  • Наследование тегов: от Game → SegmentReference → SubReference;
  • Заполнить основные теги у всех прохождений (вот тут и начинается боль);
  • Фильтрация по тегам (зависит от #18);

[субтитры] Время отображения каждого сообщения

Текущих 2-х секунд часто бывает недостаточно для чтения сообщений длинее, чем "LUL". Нужно как минимум увеличить это время до 3-4 секунд, а ещё лучше сделать этот параметр настраиваемым.

  • Попробовать заменить все тайминги скриптом. Сильно ли увеличится репозиторий?
  • Погуглить, есть ли способ изменить продолжительность показа сообщения в ASS редактированием одной строки (ну а вдруг)
  • Если такого способа не найдётся, написать функцию,которая будет расчитывать продолжительность в зависимости от длины сообщения

Сайт не открывается в Basilisk, PaleMoon и т.п.

На браузерах и форках, основанных на 42 фаерфоксах, любая страница полностью пустая и серая
из-за регулярного выражения
SyntaxError: invalid regexp group
Источник: https://bsu.drhx.ru/dist/bundle.js
Строка 2, символ 763004
Исходный код:
onfig.attributes.embed.hash)):a=function(e){const t=e.match(/^.(?:vimeo.com/|video/)(?:\d+)(?:?.&*h=|/)+(?[\

Сохранять время просмотра в localStorage

Было бы удобно реализовать функцию продолжения просмотра, так как сейчас оно работает только на сегментах YouTube, и эта информация теряется при замене видео. А на сегментах с источником direct такой функции вообще нет.

Добавление записи стрима с YT к игре

@TheDrHax Привет! Я хочу добавить прохождение Little Nightmares к игре (у тебя в архиве только DLC). Я почитал доку по структурам, и я так понимаю нужно обязательно указывать id стрима для для объекта стрима (собственно логично). Но для данного стрима осталась только запись на YT. Я поискал у Артура на твиче по тегам, видать запись не сохранилась. Собственно вопрос, как быть с прохождениями такого типа? Как добавить запись стрима, если она сохранилась только на YT? Просто ставить рандомный ID или есть какой-нибудь обход?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.