Сграбить видеотрансляцию сайта МатчТВ. Linux only.

Discussion in 'Софт' started by 027, Jan 17, 2021.

  1. 027

    027 Активный участник

    8,930
    2,847
    Накостылял тут для себя грабилку. Надо кому?

    ЛИКБЕЗ
    ------

    Интернет-трансляции передаются браузеру чанками (кусками, chunk). Скрипт плеера отслеживает обновления плейлиста и скачивает очередной чанк для показа в браузере.
    Утилита youtube-dl (в отличие от сервисов типа savefrom.net) умеет собирать чанки, а не только работать с полными файлами для скачивания. Она прекрасна.
    Однако с трансляцией Матч ТВ: смотреть игры в прямом эфире бесплатно | Прямые спортивные трансляции онлайн не справляется, несмотря на присутствие в списке заявленных. Автор на просьбы забил и разговаривать не хочет.

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


    ПРИНЦИП РАБОТЫ
    --------------

    В бесконечном цикле запускается утилита inotifywait — следилка за записью файлов в каталоге кэша браузера.
    Если она обнаруживает достойного кандидата, копирует этот чанк во временный каталог.
    Когда пользователь нажмет Ctrl+C в консоли, где запущен скрипт, цикл захвата прерывается, а из захваченных кусков собирается полное видео.


    КАК ГРАБИТЬ
    -----------

    Настроить пути в скрипте.
    Запустить трансляцию в хромиуме (хроме, хромоклонах).
    Выбрать в настройках желаемое качество видео.
    Запустить скрипт.
    Нажать Ctrl+C для остановки захвата чанков.
    Дождаться сборки видеофайла.
    ???
    PROFIT!


    НАСТРОЙКИ
    ---------

    TARGET_DIR — куда писать финальное видео.
    CACHE_PATH — путь к кэшу хрома на вашем компе. Для убунты, стандартно, $HOME/.cache/chromium/Default/Cache


    ПРИМЕЧАНИЯ
    ----------

    Нажатие Ctrl+C перехватывается командой trap. Завершается не весь скрипт, а бесконечный цикл захвата чанков. После этого из чанков собирается полное видео, а временныйе файлы удаляются. Если долго нет реакции (больше минуты) нажмите еще раз (но вроде этот глюк я победил).
    Code:
    #!/bin/bash
    
    # настройки
    TARGET_DIR="/mnt/tirobaitneg/Загрузки/sport"
    CACHE_PATH="/mnt/tirobaitneg/.home/.cache/chromium/Default/Cache"
    
    
    # подготовительные операции
    TEMP_DIR=$TARGET_DIR/video-grabber
    ACCUM_DIR=$TARGET_DIR/video-grabber/chunks
    CHUNK_LIST=$TARGET_DIR/video-grabber/list.txt
    # удаляем старый (потерянный) временный каталог
    if [[ -d $TEMP_DIR ]]; then
      rm -rf $TEMP_DIR
    fi
    # создаем структуру временных каталогов
    mkdir -p $ACCUM_DIR
    
    
    # цикл захвата чанков из кэша хромиума, прерываем по Ctrl+C
    STOP_CAPTURE=
    trap "STOP_CAPTURE=1" SIGINT
    while true; do
    
      # ловим создание файла в кэше
      # FNAME=`inotifywait -q -e create --format %f $CACHE_PATH`
    
      # следим за ним, когда он закроется на запись
      FNAME=`inotifywait -q -e close_write --format %f $CACHE_PATH`
    
      # отбрасываем заведомо неподходящие по размеру файлы
      FILE="$CACHE_PATH/$FNAME"
      FSIZE=`stat --format=%s $FILE`
    
      if [ "$FSIZE" -gt "300000" ]; then
        # копируем чанк в накопительную директорию
        cp -p --reflink=auto $FILE /$ACCUM_DIR/
        # печатаем инфо в консоль
        FSIZE=$(( FSIZE / 1024 ))
        echo "Чанк $FNAME, размер $FSIZE кБ"
      fi
      # проверяем команду завершения захвата
      if [ -n "$STOP_CAPTURE" ]; then
        echo
        echo "Остановка захвата чанков"
        break
      fi
    done
    
    
    # создаем список захваченных чанков,упорядоченных по времени создания
    i=1
    STORE_IFS=$IFS
    IFS=$'\n'
    TEMP_LIST=`ls -1tr $ACCUM_DIR`
    IFS=$STORE_IFS
    
    echo "Создаю список чанков"
    for TEMP_NAME in $TEMP_LIST; do
      FILE="$ACCUM_DIR/$TEMP_NAME"
      # проверяем, что это потоковый чанк
      MINFO=`mediainfo --Inform="General;%Format%" $FILE`
      if [ -n "$MINFO" ]; then
        echo "file $ACCUM_DIR/$TEMP_NAME" >> $CHUNK_LIST
      fi
    done
    
    # склеиваем захваченные чанки
    echo "Собираю видео в файл $TARGET_DIR/video.ts"
    ffmpeg -hide_banner -loglevel 8 -y -f concat -safe 0 -i $CHUNK_LIST -c copy $TARGET_DIR/video.ts
    
    # удаляем временный каталог
    rm -rf $TEMP_DIR
    
    

    Максимальное качество 1080p 25fps. Жмакать тут:

    Снимок экрана от 2021-01-17 01-21-55.png

    Элементы управления на записи не появляются. Можно выключить и снова включить звук, на записи не отразится.
     
    Last edited: Jan 17, 2021
    AlexLM likes this.
  2. Deceiver

    Deceiver Активный участник

    25,631
    7,794
    под винду бы чего похожего ...
     
  3. kajuga

    kajuga Активный участник

    8,829
    3,968
    под убунту есть замечательная SimpleScreenRecorder - грабит как весь экран, так выделенную область, вкладку
    + настройки сжатия, частоты кадров, кодеки и все такое, удобная
    2021-01-1709:04.png
     
  4. 027

    027 Активный участник

    8,930
    2,847
    Вот только жрет, как не в себя. У меня проц дохловат для этой цели. Я, правда не эту пробовал, а OBS Studio. Даже 720р записывается с низким fps, на глаз меньше 20.

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

    Звиняте, дядьку, к виндам уже лет семь не прикасался.

    P.S. @kajuga, глянул ваш ролик — та же фигня с низким fps. Я такое не могу смотреть, глаза начинают болеть сразу. Я и честные 25 fps на спортивных динамических сценах с трудом перевариваю. Хоккей и баскетбол хуже всего, я там и на 50 fps рывки вижу, но хотя бы глаза не вытекают.

    Найти бы трансляцию Матч ТВ хотя бы 720i 25 fps, т.е. 50 полукадров в секунду... В интернетах пишут, что Матч был даже 60 fps на OttClub, но сейчас там только «Матч! Боец».
     
    Last edited: Jan 18, 2021
  5. RubiN

    RubiN Активный участник

    6,620
    422
    Open Broadcaster Software, бесплатная, хочешь в файл пиши, хочешь в ютуп или твич транслируй