kamikaze 30.06.2011 04:24

Codingсинхронизация музыки в произвольной директории с плейлистом vkontakte

Наткнулся тут на пост, побудило на "покопаться".

Исходные данные:
- аккаунт вконтакте, куда добавляется понравившаяся музыка
- машина с магнитолой, жующей usb
- флэшка с музыкой, в том числе папкой с этакой солянкой, совпадающей на 99% с плейлистом вконтакте.


Цель:
С масимальным удобством поддерживать эту самую папку с солянкой в актуальном состоянии.
Есть множество решений по скачиванию музыки с контакта, удобных и не очень, но все они абсолютно не подходят под поставленную цель.
Уже готовые решения грубо можно разделить на 2 группы
1)закачка по 1 файлу - кликать по каждому треку, выбирать куда сохранять, потом перемещать на флэшку, трудоемко это(утрирую конечно, половину из этого можно сократить, но как бы то ни было)
2)массовая закачка всего списка(как в вышеуказанном посте) - удобно, для больших списков просто незаменимо, но каждый раз выкачивать всё? Пожалуй, хватит и 1 раза, а дальше уже вступит в силу наша задача, синхронизация, поддержание актуальности, что-то вроде того.

Итак. Актуальность актуальностью, а начальная база быть должна, потому воспользуемся уже дважды упомянутым способом.
Способы могут немного вариьироваться, можно с помощью хрома с расширением VKontakte Tools скачать плейлист(не забыть прокрутить страницу аудиозаписей до самого низа), и парсить полученное
1
$ grep -v '#' playlist.m3u | sed 's/\?.*$//' > list



Можно просто исходники страницы парсить
1
$ grep -o "http://.*\.mp3" sources > list



В любом случае мы получаем файлик с прямыми ссылками на каждый трек нашего плейлиста, скармливаем его wget'у, при желании сразу на флешку и идем пить кофе/чай.
1
$ wget -i list --directory-prefix=/media/flashka/music/




Ну вот, пора бы уже и задуматься о поддержании этой музыкальной коллекции в актуальном виде.
В KDE4 появился плазмоид "подключаемые устройства", имеющий вполне достаточные для наших целей возможности.
Соответственно создаем действие "синхронизировать с vk", чтобы оно появлялось при подключении устройств хранения данных и выполняло скрипт, по вкусу приправляем иконками контакта в png, дабы было красиво.






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

Из-за того что аудиозаписи подгружаются постепенно, мы можем получить прямые ссылки только на первые 50 файлов аудиозаписей. Но это не беда, при добавлении аудиозаписи, ссылка на нее будет появляться в начале файла и выбивать из этого списка последнюю. Всё сказочно просто, diff двух файлов будет давать нам добавленные и удаленные из нового списка ссылки, grep'аем только добавленные, скармливаем wget'у. Всё. Для красоты и до кучи сделано ведение этакого лога добавляемых аудиозаписей, всплывающий диалог оповещающий об успешной загрузке.

Предыдущие версии кода, которые были вставлены для истории, были безнадежно испорчены местным парсером.
Последняя версия v0.4


Тэги: bash KDE 4 vkontakte музыка
+ 9 -
Похожие Поделиться

zoobok 30.06.2011 11:41 #
В скрипте ошибочка:

pass;=$PASS, где точка с запятой лишняя.

И спасибо за скрипт. Протестировал, понравилось. Может, продолжу дело.
kamikaze 30.06.2011 13:50 #
Лишняя, да, даже не представляю когда закралась.
Не получается почему-то поправить.
kstep 01.07.2011 13:11 #
Парсер автодополняет кагбе html entity? Типа оно же на & начинается. Попробуй & в урле заменить на & amp; (без пробела, у меня это съедается)
kstep 01.07.2011 13:11 #
И кагбе баг парсера, да.
kamikaze 01.07.2011 13:20 #
Неа, с & тоже подставляет ;
ZED 30.06.2011 11:53 #
контакт не нужен
inst 30.06.2011 12:22 #
мы же не на ЛОРе
ner_uto 30.06.2011 12:46 #
Порой ты бываешь такой толстый, что даже не интересно
ZED 30.06.2011 12:57 #
Если я не скажу, никто ведь не скажет. Так и помрете в невежестве %)
mealsforall 11.08.2011 20:52 #
Мне нравится, как и у этого, и у предыдущего сообщение баллов 0, но голосов 4 и 6. Баланс, однако.
Born2Crawl 30.06.2011 13:23 #
Контакт удобно использовать для поиска и прослушивания/выкачивания музыки...
ZED 30.06.2011 13:30 #
для ФСБ удобно, не спорю.
Shtsh 30.06.2011 16:22 #
Ну да, ты что, считаешь, что ФСБ музыку не слушает?
kamikaze 30.06.2011 13:35 #
Всегда так нравилось как люди путают свое скромное мнение с непререкаемой истиной :)
ZED 30.06.2011 14:14 #
Вы наверное еще и предпочитаете слушать вокалоиды, пить безалкогольное пиво и пользоваться резиновой женщиной? Конечно всегда будут те, кто уверен в пользе наркотиков, нормальности педерастии и других девиаций. Непререкаемая истина заключается в том, что в настоящей жизни все должно быть настоящим - и друзья, и общение, и женщины. Если вы сами хотите жить в мире иллюзий, это ваше личное дело. Но пропаганда и популяризация подобных клоак недопустима.
http://www.youtube.com/watch?v=CKI9n98Rnrk
kamikaze 30.06.2011 14:25 #
Какой милый несвязный поток мыслей.
ZED 30.06.2011 19:03 #
Вот и выросло поколение, не способное понять собеседника.
kamikaze 30.06.2011 19:21 #
Ну, вы в праве думать как угодно.

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

Сразу раскрою более подробно написанное мной выше про "скромное мнение и истину", дабы было меньше вопросов, многие из как раз сейчас подрастающего поколения привыкли путать свое мнение с фактом, как и вы. То что вы считаете что контакт не нужен, какой-то фильм говно не означает что это так, это лишь означает что вы так считаете, более ничего. Это мнение может совпасть с реальностью также как и не совпасть.
Вопросы?
ekzotech 30.06.2011 12:21 #
Спасибо, одно время интересовался, но не было желания долго копаться.
caxap 30.06.2011 19:16 #
не знаю откаментил уже кто или нет, но вконтакте периодически меняет названия муз файлов. в скрипт не заглядывал, как победили?
kamikaze 30.06.2011 19:23 #
Опа, а вот об этом был не в курсе. Периодически, или просто при определенных нововведениях?
caxap 01.07.2011 13:05 #
не знаю после нововведений или нет. у меня было два скрипта: один вытягивал, другой переименовывал по мп3 тегам. примерно через месяц после первой загрузки мой скрипт вытянул все песни с новыми именами. наверное если переименовывать сразу (по названию песни, а не по тегам, потому что у некоторых песенок нет тегов) после загрузки и только потом копировать на флешку, то проблему можно решить.
kamikaze 14.08.2011 17:15 #
поправлена проблема сия
magist3r 30.06.2011 21:30 #
Немного допилил скрипт. Теперь он умеет переименовывать скачанные файлы и завершается, если новых песенок нет:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
EMAIL=""
PASS=""
LINK="http://vkontakte.ru/audio.php"

mv links links.old
mv names names.old
curl -c cookie "http://vkontakte.ru/login.php?email=$EMAIL&pass;=$PASS"
curl -b cookie $LINK | grep -o "http://.*\.mp3" > links
curl -b cookie $LINK | iconv -f cp1251 | grep title_wrap | sed 's/^.*>\([^<]*\)<\/a>.*title\">\([^<]*\).*$/\1 - \2/' > names
diff links links.old | grep "<" | sed 's/< //g' | sed 's/\s/\n/g' > .to_mv
if [ -z $(cat .to_mv) ]; then exit 0; fi #Если треков не добавилось - выходим
diff names names.old | grep "<" | sed 's/< //g' > .to_rename
wget -i .to_mv
date >> log
cat .to_mv >> log
LINES=$(cat .to_mv | wc -l)
for i in $(seq $LINES); do
        FILE=$(head -n 1 .to_mv | sed 's/^.*\///')
        NAME=$(head -n 1 .to_rename)
        sed -i 1d .to_mv
        sed -i 1d .to_rename
        mv "$FILE" "$NAME.mp3"
done
rm .to_mv
rm .to_rename
kdialog --msgbox "Успешно загружено $LINES файлов";
exit 0

~
~
magist3r 30.06.2011 21:35 #
Есть небольшой баг: если у трека есть слова, то имя этого трека не распарсится. Не могу пока придумать правильный регэксп)
kamikaze 01.07.2011 02:13 #
Отлично, переименование треков было только в планах.
Поправил регэксп, теперь с треками со словами проблем не наблюдается.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
EMAIL=""
PASS=""
LINK="http://vkontakte.ru/audio.php"

mv links links.old
mv names names.old
curl -c cookie "http://vkontakte.ru/login.php?email=$EMAIL&pass;=$PASS"
curl -b cookie $LINK | grep -o "http://.*\.mp3" > links
curl -b cookie $LINK | iconv -f cp1251 | grep title_wrap | sed 's/^.*>\([^<]*\)<\/a>.*\">\([^<]*\).*user.*$/\1 - \2/' | grep -v lyricsLink > names
diff links links.old | grep "<" | sed 's/< //g' | sed 's/\s/\n/g' > .to_mv
if [ -z $(cat .to_mv) ]; then exit 0; fi #Если треков не добавилось - выходим
diff names names.old | grep "<" | sed 's/< //g' > .to_rename
wget -i .to_mv
date >> log
cat .to_mv >> log
LINES=$(cat .to_mv | wc -l)
for i in $(seq $LINES); do
        FILE=$(head -n 1 .to_mv | sed 's/^.*\///')
        NAME=$(head -n 1 .to_rename)
        sed -i 1d .to_mv
        sed -i 1d .to_rename
        mv "$FILE" "$NAME.mp3"
done
rm .to_mv
rm .to_rename
kdialog --msgbox "Успешно загружено $LINES файлов";
exit 0
belsdeath 01.07.2011 14:11 #
pass;=$PASS"--->pass=$PASS"

ошибочка же =)
kamikaze 01.07.2011 14:22 #
Чукча не читатель, чукча писатель? Не судьба сначала прочитать чуть выше видимо.
narical 07.07.2011 19:51 #
Решил добавить сюда своих 5 копеек, хоть и не по теме скрипта.

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

Речь не о СИНХРОНИЗАЦИИ, конечно, способ одноразовый.
shkur 11.08.2011 16:15 #
попробовал. автору спасибо.

мысли:
1. некоторые имена файлов не переименовываются, т.к. есть недопустимые символы такие как слеш.

2. как бы сделать так что бы порядок файлов уже в в локальной папке был такой же как в плейлисте вконтакте? Думаю это можно сделать простым счетчиком с ведущими нулями, причем начать с последнего трека и дать ему номер например 9999
предпоследний 9998 и т.д.

3. Я запускал скрипт от kamikaze http://welinux.ru/post/6143/#cmnt107800
он видит только первые 50 треков. Как инициировать прокрутку страницы до конца, что бы скрипт увидел все треки?
kamikaze 11.08.2011 16:21 #
Кроме пункта 3 всё вполне реализуемо, есть проблема поинтереснее, завязано всё на именах файлов, а они меняются периодически и всё перестает работать. Вот передо мной лежит лист а4 с примерным алгоритмом как поправить, да всё реализовать руки не доходят.
shkur 11.08.2011 19:35 #
vkmusic видит весь плейлист. думаю надо по аналогии. Скорее всего через API но я еще не смотрел.
А Вы бы купили такой скрипт скажем за 50 рулбей в год? Я думаю будет много желающих...
shkur 12.08.2011 02:13 #
потыкал api php. пишет:
SimpleXMLElement Object
(
[error_code] => 4
[error_msg] => Incorrect signature: sid & secret authorization
[request_params] => SimpleXMLElement Object
(.........

ну ево нахрен - распарзю m3u по первому варианту
kamikaze 12.08.2011 02:22 #
Правильно, это уже тот случай, когда временные затраты на создание "автоматизации" десятикратно перекрывают затраты на "вручную" =)

На днях может займусь да допилю до ума наконец синхронизацию.
shkur 12.08.2011 11:05 #
да и в 10й строке поменять (т.е. добавить) | sed 's/\(да
shkur 12.08.2011 11:07 #
чет не прошло
10ую строку заменить на

1
curl -b cookie $LINK | iconv -f cp1251 | grep title_wrap | sed 's/^.*>\([^<]*\)<\/a>.*\">\([^<]*\).*user.*$/\1 - \2/' | sed 's/\(че
shkur 12.08.2011 11:08 #
чет глючит

т.е. убираем недопустимые символы в именах файлов.
shkur 12.08.2011 11:27 #
насчёт уникальности каждого файла.
Имя файла на сервере уникально - см ссыль
http://cs4653.vkontakte.ru/u2061878/audio/2f2e3e8e8ca0.mp3
думаю надо как-то записывать (сохранять) оригинальное имя файла, например в лог и потом сравнивать. Или в какой-то id3 тег. Или куда там еще можно записать.
shkur 12.08.2011 17:04 #
вот. значит качаем m3u. кладем в папку muzvk.
дальше файлик со следующим содержимым:
содержимое выложил docs.google.com html-версия т.к. тут глючит



#!/bin/bash
plst=$(ls | grep '\.m3u')
if [ -z $plst ]; then
echo не ни одного файла с плейлистом с расширением m3u. выходим - не счем работать.;
exit 0; fi # Если файла с плейлистом нет, то выходим. Не счем работать.

if [ -z $(ls | grep links.old) ]; then
echo нет файла links.old создаю....;
touch links.old;
fi;

if [ -z $(ls | grep names.old) ]; then
echo нет файла names.old создаю....;
touch names.old;
fi

#echo чекаем;
#exit 0;

mv links links.old
mv names names.old
cat $plst | grep -o "http://.*\.mp3" | sed 's/\(http:.*\.mp3\)\(?.*\)/\1/' > links
cat $plst | grep EXTINF | sed 's/^#EXTINF:[0-9]*,\(.*\)$/\1/' | sed 's/\(
shkur 12.08.2011 18:21 #
длинна имени файла cut -c -127
shkur 12.08.2011 20:15 #
надо найти похожие строки в m3u файле. Т.е. в строке одинакове ссылки но разные названия. sed думаю не осилю

вобщем поплыл форум...