вторник, 3 мая 2011 г.

Слежение за просмотренными фильмами

Люблю, знаете-ли смотреть разные сериалы. А ещё люблю смотреть их пачками по 5-10 серий - пару месяцев не смотришь, а потом серий на 5 как засядешь...

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

Ну и вот:
#!/bin/bash

if [[ $1 == '-q' ]]; then

        cd ~/.track-movies

        for d in *; do
                if [[ $2 != "" ]]; then
                        fgrep -i $2 $d/path > /dev/null 2>&1
                        [[ $? != 0 ]] && continue
                fi

                # calc view time
                CURT=0
                SUM=0
                for t in $(cat $d/times); do
                        DIFF=$(( ($t - $CURT) / 60 ))
                        CURT=$t
                        [[ $DIFF -gt 10 ]] && continue 
                        SUM=$(( $SUM + $DIFF ))
                done
                printf "%s      %4d min\n" "$(cat $d/path)" $SUM
        done

        exit


        ALL=$(find ~/.track-movies/ -name path | xargs cat)

        if [[ $2 == "" ]]; then
                echo "$ALL"
        else
                echo "$ALL" | grep -i --color=auto $2
        fi

        exit
fi


PLAYER_PIDS=$(ps ax --format %c\|%p\|%a | grep ^mplayer | sed -re 's/.*\|[ ]*([0-9]+)\|.*/\1/')

function get_movies
{
        for pid in ${PLAYER_PIDS}; do
                lsof -p $pid | sed -nre 's/[^\/]*(\/.*\.(avi|mkv|mpg|mpeg))$/\1/ p'
        done | sort | uniq
}

MOVIES=$(get_movies)

[[ $MOVIES == "" ]] && exit

IFS='
'

[[ ! -d ~/.track-movies ]] && mkdir ~/.track-movies
cd ~/.track-movies

for m in $MOVIES; do
        HASH=$(echo $m | md5sum | cut -d' ' -f 1)
        if [[ ! -d $HASH ]]; then
                mkdir $HASH
                echo $m > $HASH/path
                echo > $HASH/times
        fi
        date +%s >> $HASH/times
done

В целом всё просто. При запуске скрипта без параметров:
1. находим все PID mplayer (я только им пользуюсь, но можно добавить и другие плееры)
2. берём вcе файлы открытые процессом, фильтруем по расширению, сортируем, убираем дубликаты (smplayer зачем-то запускает 2 копии mplayer)
3. Для каждого пути вычисляем хеш, это будет директория, где будем хранить инфу о фильме
4. Сохраняем полный путь к фильму, если надо
5. Сохраняем текущее время.

Дальше запихиваем скрипт в крон, каждые 5 минут:
*/5 * * * * /home/sazarkevich/bin/track-movies.sh

Ну и всё. Теперь все ходы записываются, ладью мы не потеряем.

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

# track-movies.sh -q bang | sort
/home/torrents/The Big Bang Theory, Season 4/The.Big.Bang.Theory.S04E01.mkv 20 min
/home/torrents/The Big Bang Theory, Season 4/The.Big.Bang.Theory.S04E02.mkv 20 min
/home/torrents/The Big Bang Theory, Season 4/The.Big.Bang.Theory.S04E03.mkv 20 min
/home/torrents/The Big Bang Theory, Season 4/The.Big.Bang.Theory.S04E04.mkv 5 min
Ну, теперь всё ясно. Последняя полностью просмотренная серия - 3, а 4-ую я смотрел всего 5 минут.

Вот только печалька... Раньше телевизор я подключал вместо монитора и запускал фильмы на компе, но сразу же как я написал этот скрипт, пришлось переключить комп с телевизора на монитор. Теперь смотрим всё на телевизоре напрямую(с флешки), и скрипт получается не нужен :( Как бы его всунуть на телек....

Комментариев нет: