ВходИмяПароль
Автоматически входить при каждом посещении    
Регистрация
Регистрация
Войти и проверить личные сообщения
Войти и проверить личные сообщения
Список форумов ЛанМедиаСервис » Другое ПО, скрипты и сервисы

Начать новую тему   Ответить на тему
скрипт генерации ed2k и DC++ ссылок На страницу 1, 2, 3, 4, 5, 6  След.
Предыдущая тема :: Следующая тема  
Автор Сообщение

Instruktor 





Зарегистрирован: 29.02.2008
Сообщения: 89


russia.gif
Сообщение Добавлено: 2008-03-14 13:21 pm    Заголовок сообщения: скрипт генерации ed2k и DC++ ссылок Ответить с цитатой

скрипт генерации ed2k и DC++ ссылок

задача:
- сгенерить хеш-суммы, составить ссылки и заполнить соответствующие поля для всех файлов, зарегистрированных в видеокаталоге;
- выполнять генерация для новых файлов регулярно по расписению (cron);

условия:
- FreeBSD 6.2;
- файлы раcположены локально или подмонтированы по ftp|smb|nfs;
- в mysql имена файлов храняться в кодировке cp1251, имена самих файлов в koi8-r;

средства:
- штатные системные утилиты FreeBSD 6.2;
- tthsum, утилита генерит TTH-хеш для ссылок DC++ (/usr/ports/security/tthsum);
- ed2k_hash, утилита генерит ed2k-ссылку (/usr/ports/net-p2p/edonkey-tool-hash);
- iconv, утилита конвертит кодировку строки (/usr/ports/converters/iconv);
- mysql, консольный клиент;

скрипт:
Код:

#!/bin/sh

# корректируем PATH
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin:/root/sbin; export PATH

my="mysql -N -h127.0.0.1 -uvideo -p154121 video"        # обращение к mysql
lock="/var/run/p2p_hash_count.lock"                     # флаг блокировки
log="/var/log/p2p_hash_count.log"                       # лог
my_chs="cp1251"                                         # кодировка имён файлов в mysql
sys_chs="koi8-r"                                        # системная кодировка имён
#--------------------------------------------
test -f $lock && exit                                   # проверяем не запущен ли уже процесс
touch $lock                                             # ставим флаг блокировки
#--------------------------------------------

# выполнять пока есть пустые поля dc++ или ed2k
while [ `echo "select count(ID) from files where dcppLink='' or ed2kLink=''" | $my` -gt 0 ]
do
    row=`echo "select ID,Size,Path from files where dcppLink='' or ed2kLink='' limit 1" | $my`  # получаем объект
    f_id=`echo $row | awk '{print $1}'`                                                         # ID
    f_size=`echo $row | awk '{print $2}'`                                                       # объём в байтах
    f_path=`echo $row | awk '{print $3}' | iconv -f $my_chs -t $sys_chs`                        # путь
    f_name=`basename $f_path | tr " " "_" | tr -d "'" | iconv -f $sys_chs -t $my_chs`           # имя файла
    dat=`date "+%Y-%m-%d_%H:%M:%S"`

    if test -f "$f_path"        # проверяем есть ли доступ к файлу, если нет то всё бросаем
    then
    else
        echo "$dat file not found: id=$f_id path=$f_path" >> $log
        rm -f $lock
        exit
    fi

# DC++ Генерим ссылку (если нет), забиваем в базу и пишем лог.

    if [ `echo "select count(ID) from files where ID=$f_id and dcppLink=''" | $my` != "0" ]
    then
        dcpp="magnet:?xt=urn:tree:tiger:`nice -n 5 tthsum "$f_path" | awk '{print $1}'`&xl=${f_size}&dn=${f_name}"
        echo "update files set dcppLink='$dcpp' where ID=$f_id" | $my 2>&1 >> $log
        echo "$dat dc++ link created: id=$f_id link=$dcpp" | iconv -f $my_chs -t $sys_chs >> $log
    fi

# ed2k Генерим ссылку (если нет), забиваем в базу и пишем лог.

    if [ `echo "select count(ID) from files where ID=$f_id and ed2kLink=''" | $my` != "0" ]
    then
        ed2k=`nice -n 5 edonkey-tool-hash "$f_path" | tr " " "_" | tr -d "'" | iconv -f $sys_chs -t $my_chs`
        echo "update files set ed2kLink='$ed2k' where ID=$f_id" | $my 2>&1 >> $log
        echo "$dat ed2k link created: id=$f_id link=$ed2k" | iconv -f $my_chs -t $sys_chs >> $log
    fi
done
#--------------------------------------------
rm -f $lock     # снимаем блокировку
exit


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


Последний раз редактировалось: Instruktor  (2008-03-17 18:41 pm), всего редактировалось 4 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

iVale 





Зарегистрирован: 11.03.2008
Сообщения: 33


albania.gif
Сообщение Добавлено: 2008-03-14 15:40 pm    Заголовок сообщения: Ответить с цитатой

Респек, то что нужно!
Только не совсем понятно как работает:
- Добавляется dc++ ссылка в БД самого скрипта видеокаталога?
- Как в админке добавлять ссылку, что бы её увидели юзеры?
- Как выглядит на практике?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

Instruktor 





Зарегистрирован: 29.02.2008
Сообщения: 89


russia.gif
Сообщение Добавлено: 2008-03-14 15:57 pm    Заголовок сообщения: Ответить с цитатой

iVale писал(а):

- Добавляется dc++ ссылка в БД самого скрипта видеокаталога?

Ссылки добавляются непосредственно в базу данных видеокаталога.
Как только ссылка добавилась - она отображается на страничке фильма.
iVale писал(а):

- Как в админке добавлять ссылку, что бы её увидели юзеры?

В админке в редакторе в разделе "файлы" фильмов есть соответствующие два поля "Ссылка ed2k" и "Ссылка DC++". Здесь можно поставить ссылки вручную и они будут отображены на странице фильма.
iVale писал(а):

- Как выглядит на практике?

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

iVale 





Зарегистрирован: 11.03.2008
Сообщения: 33


albania.gif
Сообщение Добавлено: 2008-03-14 16:08 pm    Заголовок сообщения: Ответить с цитатой

Instruktor писал(а):
В админке в редакторе в разделе "файлы" фильмов есть соответствующие два поля "Ссылка ed2k" и "Ссылка DC++". Здесь можно поставить ссылки вручную и они будут отображены на странице фильма.

Тоесть в изначальной поставке видео скрипта уже есть поля dc++ и ed2k, и вводить их можно вручную? (спрашиваю потому, т.к. только оплачиваю продукт), но Ваш скрипт позволяет автоматически пропарсить туда ссылки?

Тоесть фильмы днём добавляются модерами (без дц++ ссылок), ночью скрипт запускается и парсит ссылки в БД, которые потом уже сами появляются на странице фильма?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

Angel





Зарегистрирован: 29.02.2008
Сообщения: 79


ukraine.gif
Сообщение Добавлено: 2008-03-14 17:27 pm    Заголовок сообщения: Ответить с цитатой

iVale  писал(а):

Тоесть в изначальной поставке видео скрипта уже есть поля dc++ и ed2k, и вводить их можно вручную? (спрашиваю потому, т.к. только оплачиваю продукт), но Ваш скрипт позволяет автоматически пропарсить туда ссылки?

Тоесть фильмы днём добавляются модерами (без дц++ ссылок), ночью скрипт запускается и парсит ссылки в БД, которые потом уже сами появляются на странице фильма?


Совершенно верно
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

iVale 





Зарегистрирован: 11.03.2008
Сообщения: 33


albania.gif
Сообщение Добавлено: 2008-03-17 17:55 pm    Заголовок сообщения: Ответить с цитатой

Пробую на linux slackware, установил
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
http://freshmeat.net/redir/tthsum/53976/url_tgz/tthsum-1.1.0.tar.gz
Код:
#!/bin/sh

# корректируем PATH
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin:/root/sbin; export PATH

my="mysql -N -h127.0.0.1 -uюзнр -pпароль база"        # обращение к mysql
lock="/var/run/p2p_hash_count.lock"                     # флаг блокировки
log="/var/log/p2p_hash_count.log"                       # лог
my_chs="cp1251"                                         # кодировка имён файлов в mysql
sys_chs="koi8-r"                                        # системная кодировка имён
#--------------------------------------------
test -f $lock && exit                                   # проверяем не запущен ли уже процесс
touch $lock                                             # ставим флаг блокировки
#--------------------------------------------

# выполнять пока есть пустые поля dc++ или ed2k
while [ `echo "select count(ID) from files where dcppLink='' or ed2kLink=''" | $my` -gt 0 ]
do
    row=`echo "select ID,Size,Path from files where dcppLink='' or ed2kLink='' limit 1" | $my`  # получаем объект
    f_id=`echo $row | awk '{print $1}'`                                                         # ID
    f_size=`echo $row | awk '{print $2}'`                                                       # объём в байтах
    f_path=`echo $row | awk '{print $3}' | iconv -f $my_chs -t $sys_chs`                        # путь
    f_name=`basename $f_path | tr " " "_" | tr -d "'" | iconv -f $sys_chs -t $my_chs`           # имя файла
    dat=`date "+%Y-%m-%d_%H:%M:%S"`
         if test -f "$f_path"        # проверяем есть ли доступ к файлу, если нет то всё бросаем
         then
         else
                       echo "$dat file not found: id=$f_id path=$f_path" >> $log
                       rm -f $lock
                       exit
       fi

# DC++ Генерим ссылку (если нет), забиваем в базу и пишем лог.

       if [ `echo "select count(ID) from files where ID=$f_id and dcppLink=''" | $my` != "0" ]
    then
          dcpp="magnet:?xt=urn:tree:tiger:`nice -n 5 tthsum "$f_path" | awk '{print $1}'`&xl=${f_size}&dn=${f_name}"
          echo "update files set dcppLink='$dcpp' where ID=$f_id" | $my 2>&1 >> $log
          echo "$dat dc++ link created: id=$f_id link=$dcpp" | iconv -f $my_chs -t $sys_chs >> $log
        fi

                                                                                                    #
                            done
                            rm -f $lock   
                            exit


Как вы видите убрал вконце про ed2k, правильно ли идёт обращение к mysql? я про слитное -uюзер, -pпароль?

Файл p2p_hash_count.lock создаётся с весом 0.

В базе пусто.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

Instruktor 





Зарегистрирован: 29.02.2008
Сообщения: 89


russia.gif
Сообщение Добавлено: 2008-03-17 18:07 pm    Заголовок сообщения: Ответить с цитатой

iVale писал(а):
Пробую на linux slackware, установил
Как вы видите убрал вконце про ed2k, правильно ли идёт обращение к mysql? я про слитное -uюзер, -pпароль?


Слитно это нормально. Так должно быть.

для отладки нужно смотреть какой формируется запрос к базе
строку:
echo "update files set dcppLink='$dcpp' where ID=$f_id" | $my 2>&1 >> $log

заменить на:
echo "update files set dcppLink='$dcpp' where ID=$f_id"

Скрипт запустить в консоли и смотреть на ошибки и формируемые sgl-запросы.
Поскольку система другая - без отладки никак.

iVale писал(а):
Файл p2p_hash_count.lock создаётся с весом 0.


Размер не важен, важно наличие файла.
Если файл есть - заблокировано, если файла нет, можно запускаться.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

iVale 





Зарегистрирован: 11.03.2008
Сообщения: 33


albania.gif
Сообщение Добавлено: 2008-03-17 18:18 pm    Заголовок сообщения: Ответить с цитатой

Запускается без ошибок, как посмотреть текущие запросы к базе?
Замечу что лог не пишется вообще.

Код:
mysql -N -h127.0.0.1 -uюзер -pпароль [b]база[/b]

Последнее я правильно понял - база указывается?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

Instruktor 





Зарегистрирован: 29.02.2008
Сообщения: 89


russia.gif
Сообщение Добавлено: 2008-03-17 18:31 pm    Заголовок сообщения: Ответить с цитатой

iVale писал(а):
Запускается без ошибок, как посмотреть текущие запросы к базе?
Замечу что лог не пишется вообще.

Код:
mysql -N -h127.0.0.1 -uюзер -pпароль [b]база[/b]

Последнее я правильно понял - база указывается?


да, последнее это база.

Убедитьсь, что перед стартом скрипта удалён лок-файл. Пока есть лок скрипт выполняться не будет.
или можно закомментировать test -f $lock && exit
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

iVale 





Зарегистрирован: 11.03.2008
Сообщения: 33


albania.gif
Сообщение Добавлено: 2008-03-17 18:50 pm    Заголовок сообщения: Ответить с цитатой

Удалил лок файл, запускаю заново:
Код:
sudo sh getdclinks1.sh
getdclinks1.sh: line 27: syntax error near unexpected token `else'
getdclinks1.sh: line 27: `         else'

Привожу опять скрипт:
Код:
#!/bin/sh

# корректируем PATH
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/root/bin:/root/sbin; export PATH

my="mysql -N -h127.0.0.1 -ulmss -pjtdMNmRPUepUwACE lmss1"        # обращение к mysql
lock="/var/run/p2p_hash_count.lock"                     # флаг блокировки
log="/var/log/p2p_hash_count.log"                       # лог
my_chs="cp1251"                                         # кодировка имён файлов в mysql
sys_chs="koi8-r"                                        # системная кодировка имён
#--------------------------------------------
test -f $lock && exit                                   # проверяем не запущен ли уже процесс
touch $lock                                             # ставим флаг блокировки
#--------------------------------------------

# выполнять пока есть пустые поля dc++ или ed2k
while [ `echo "select count(ID) from files where dcppLink='' or ed2kLink=''" | $my` -gt 0 ]
do
    row=`echo "select ID,Size,Path from files where dcppLink='' or ed2kLink='' limit 1" | $my`  # получаем объект
    f_id=`echo $row | awk '{print $1}'`                                                         # ID
    f_size=`echo $row | awk '{print $2}'`                                                       # объём в байтах
    f_path=`echo $row | awk '{print $3}' | iconv -f $my_chs -t $sys_chs`                        # путь
    f_name=`basename $f_path | tr " " "_" | tr -d "'" | iconv -f $sys_chs -t $my_chs`           # имя файла
    dat=`date "+%Y-%m-%d_%H:%M:%S"`
         if test -f "$f_path"        # проверяем есть ли доступ к файлу, если нет то всё бросаем
         then
         else
                       echo "$dat file not found: id=$f_id path=$f_path" >> $log
                       rm -f $lock
                       exit
       fi

# DC++ Генерим ссылку (если нет), забиваем в базу и пишем лог.

       if [ `echo "select count(ID) from files where ID=$f_id and dcppLink=''" | $my` != "0" ]
    then
          dcpp="magnet:?xt=urn:tree:tiger:`nice -n 5 tthsum "$f_path" | awk '{print $1}'`&xl=${f_size}&dn=${f_name}"
          echo "update files set dcppLink='$dcpp' where ID=$f_id"
          echo "$dat dc++ link created: id=$f_id link=$dcpp" | iconv -f $my_chs -t $sys_chs >> $log
        fi

done
rm -f $lock
exit
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

Instruktor 





Зарегистрирован: 29.02.2008
Сообщения: 89


russia.gif
Сообщение Добавлено: 2008-03-17 20:45 pm    Заголовок сообщения: Ответить с цитатой

[quote="iVale "]Удалил лок файл, запускаю заново:
Код:
sudo sh getdclinks1.sh
getdclinks1.sh: line 27: syntax error near unexpected token `else'
getdclinks1.sh: line 27: `         else'


В линуксе if then else обрабатывается иначе. Здесь после then нужно поместить любую команду.

найти:

Код:
if test -f "$f_path"
then
else
     echo "$dat file not found: id=$f_id path=$f_path" >> $log
     rm -f $lock
     exit
fi


сделать так:

Код:
if test -f "$f_path"
then
     pwd
else
     echo "$dat file not found: id=$f_id path=$f_path" >> $log
     rm -f $lock
     exit
fi
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

iVale 





Зарегистрирован: 11.03.2008
Сообщения: 33


albania.gif
Сообщение Добавлено: 2008-03-17 20:50 pm    Заголовок сообщения: Ответить с цитатой

Спасибо за отзыв. Сделал как вы сказали:
Код:
sudo sh getdclinks1.sh
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)
getdclinks1.sh: line 17: [: -gt: unary operator expected
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

Marcus





Зарегистрирован: 29.02.2008
Сообщения: 15


russia.gif
Сообщение Добавлено: 2008-03-18 10:27 am    Заголовок сообщения: Ответить с цитатой

iVale ,
У меня на Linux CentOS 5 заработало только после некоторых манипуляций (в частности тех, которые тут уже приводили) ...
Вот что получилось

Код:

#!/bin/sh

PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

my="mysql -N -h<ip_mysql> -u<user> -p<password> database_name"               # обращение к mysql
lock="/var/run/p2p_hash_count.lock"                              # флаг блокировки
log="/var/log/p2p_hash_count.log"                                # лог
my_chs="utf8"                                                    # кодировка имён файлов в mysql
sys_chs="utf-8"                                                  # системная кодировка имён
#--------------------------------------------
test -f $lock && exit                                            # проверяем не запущен ли уже процесс
touch $lock                                                      # ставим флаг блокировки
#--------------------------------------------

# выполнять пока есть пустые поля dc++ или ed2k
while [ `echo "select count(ID) from files where dcppLink=''" | $my` -gt 0 ]
do
    row=`echo "select ID,Size from files where dcppLink='' limit 1" | $my`  # получаем объект
    f_id=`echo $row | awk '{print $1}'`                                                         # ID
    f_size=`echo $row | awk '{print $2}'`                                                       # объём в байтах
    f_path=`echo "set names $my_chs; select Path from files where ID=$f_id" | $my`                        # путь
    f_name=`echo "set names $my_chs; select Name from files where ID=$f_id" | $my`           # имя файла
    dat=`date "+%Y-%m-%d_%H:%M:%S"`

    if test -f "$f_path"        # проверяем есть ли доступ к файлу, если нет то всё бросаем
    then
        pwd
    else
         echo "$dat file not found: id=$f_id path=$f_path" | iconv -f $my_chs -t $sys_chs >> $log
         rm -f $lock
         exit
    fi
# DC++ Генерим ссылку (если нет), забиваем в базу и пишем лог.

    if [ `echo "select count(ID) from files where ID=$f_id and dcppLink=''" | $my` != "0" ]
    then
        dcpp=`nice -n 5 tthsum "$f_path" | awk '{print $1}'`
        echo "set names $my_chs; update files set dcppLink='magnet:?xt=urn:tree:tiger:$dcpp&xl=${f_size}&dn=${f_name}' where
ID=$f_id" | $my 2>&1 >> $log
        echo "$dat dc++ link created: id=$f_id name=$f_name link=$dcpp" | iconv -f $my_chs -t $sys_chs >> $log
    fi
done


И работает на УРА! Респект Instruktor !

Кстати, если заметили, то замена

Код:

f_path=`echo $row | awk '{print $3}' | iconv -f $my_chs -t $sys_chs`                        # путь
f_name=`basename $f_path | tr " " "_" | tr -d "'" | iconv -f $sys_chs -t $my_chs`           # имя файла


на

Код:

f_path=`echo "set names $my_chs; select Path from files where ID=$f_id" | $my`                        # путь
    f_name=`echo "set names $my_chs; select Name from files where ID=$f_id" | $my`           # имя файла


позволяет индексировать файлы с пробелами в названии/пути.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

iVale 





Зарегистрирован: 11.03.2008
Сообщения: 33


albania.gif
Сообщение Добавлено: 2008-03-18 14:21 pm    Заголовок сообщения: Ответить с цитатой

У меня по прежнему ошибка
НО, заменяю
Код:
while [ `echo "select count(ID) from files where dcppLink=''" | $my` -gt 0 ]

на
Код:
while [ `echo "select count(ID) from files where dcppLink=''" | $my -gt 0` ]

ошибка
Код:

sudo sh getdclinks1.sh
getdclinks1.sh: line 17: [: too many arguments
Вернуться к началу
Посмотреть профиль Отправить личное сообщение

Instruktor 





Зарегистрирован: 29.02.2008
Сообщения: 89


russia.gif
Сообщение Добавлено: 2008-03-18 14:34 pm    Заголовок сообщения: Ответить с цитатой

очевидно, нет коннекта к базе

уберите из строки коннекта -h127.0.0.1
пусть через сокет конектится

если не поможет то нужно разбираться с юзером и его правами на базу данных
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов ЛанМедиаСервис » Другое ПО, скрипты и сервисы Часовой пояс: GMT
На страницу 1, 2, 3, 4, 5, 6  След.
Страница 1 из 6

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы