пятница, 15 июня 2012 г.

Консольный граббер музыки с профиля vk.com cо свистелками и перделками

Всё-таки решил разобраться с API vk.com, да и написать под себя скрипт. Вконтакте я использую всё же больше как плеер и поисковик музыки, нежели как социальную сеть, поэтому иметь хорошую скачивалку музыки под рукой было бы очень не плохо. 

Начну с того, как же все таки работать с API. Под Python есть хорошая либа - vkontakte (ставится без проблем через pip), но просто подключение ее ничего не даст(что логично), необходимо зарегать своё приложение, как это делается написано тут: http://habrahabr.ru/post/125155/. Там вам дадут защищенный ключ и ID приложения, с помощью которых необходимо получить токен. Токен - это некоторая длинная замысловатая строка, которая необходима для получения определенных прав и свобод для работы с vk.com. Собственно получить его можно вбив в строку браузера что-то подобное: http://oauth.vk.com/authorize?client_id=ID ВАШЕГО ПРИЛОЖЕНИЯ&scope=audio(ПОЛУЧИМ ДОСТУП К АУДИО)&response_type=token, вас пошлют на страничку, в адресной строке которой можно и увидеть пресловутый токен(выглядит он примерно так: "9d791f49d29a92ea9d19f7da559d6df31e99d409d404a6dcd989bf1baa42bb3"). Всё, токен получили можно действовать. Справка по API описана тут:

Итак, что нам нужно сделать? Во первых получить всю музыку и сотворить некие функции по работе с ней. Реализуем следующие функции: 

Печать всех композий
def printAllAudio(audio):
    subprocess.call("clear")
    for i in xrange(len(audio)):
        print str(i)+" "+audio[i]["artist"]+" - "+audio[i]["title"]  

Скачка одной композиции по её номеру:
def downloadOnNumber(audio, number):
     nameFileNew=audio[number]["artist"]+" - "+audio[number]["title"]
     print "GET FILE: "+nameFileNew
     print "FILE NUMBER: "+str(number)
     subprocess.call(['wget', audio[number]["url"]])
     p=re.compile(r"[0-9a-zA-Z]+\.mp3$")
     nameFileOld=p.findall(audio[number]["url"])
     os.rename(nameFileOld[0],nameFileNew+".mp3") 

Cкачка всех композиций:
def dounloadAllFiles(audio):
    for i in xrange(len(audio)):
        downloadOnNumber(audio, i)

Скачка по названию группы:
def downloadOnArtist(audio, artist):
    kol=0
    for i in xrange(len(audio)):
        if audio[i]["artist"] in artist:
            downloadOnNumber(audio, i)
            kol+=1
    return kol  

Скачка по названию песни:
 def downloadOnComposition(audio, composition):
    kol=0
    for i in xrange(len(audio)):
        if audio[i]["title"] in composition:
            downloadOnNumber(audio, i)
            kol+=1
    return kol 

Скачка по интервалу:
def dowloadOnInterval(a, b):
   for i in xrange(a, b+1):
       downloadOnNumber(audio, i)

Как видим, достаточно широкий функционал получился :) Используем внешнюю утилиту wget, которая обладает очень красивым выхлопом. Примерно все выглядит таким образом:   
Теперь неплохо было бы все сделать в консоль-стайл, предусмотреть команды, а также слабенькую защиту от  дурачка. 
В общем тянуть не буду, все выглядит примерно так:

 audio=vk.audio.get(uid='ВАШ ID vk.com')
    count=len(audio)
    print "Введите команду: "
    command=raw_input().split()
    if command[0]=="help":
        subprocess.call("clear")
        print "Доступные команды: "
        print "grub +"
        print "-all = скачать все песни из аудио"
        print "-s = скачать песню по её названию (пробел) название песни"
        print "-ar = скачать песню по название группы(имя артиста) (пробел) имя артиста(группы):"      
        print "-print = распечатать все песни и их номер"
        print "-n = cкачать по номеру (пробел) номер песни" 
        print "-i = скачать по интрервалу (пробел) первое число (пробел) второе число" 
    elif command[0]=="grub":
        if command[1]=="-all":
            dounloadAllFiles(audio)
        elif command[1]=="-ar":  
            kol=downloadOnArtist(audio, joinOther(command))
            if kol==0: print "Нет совпадений в имени!"
        elif command[1]=="-s":
            kol=downloadOnComposition(audio, joinOther(command))
            if kol==0: print "Нет совпадений в имени!"
        elif command[1]=="-print":
            printAllAudio(audio)
        elif command[1]=="-n":
            if command[2].isdigit()==False: print "Это не числовое значение!"
            elif 1<int(command[2])<count: downloadOnNumber(audio, int(command[2]))
            else: print "Песни с таким номером нет!"
        elif command[1]=="-i":
            if command[2].isdigit()==False or command[3].isdigit()==False: print "Это не числовое значение!"
            elif int(command[2])>int(command[3]): print "Первое значение интервала должно быть меньше второго!"
            elif int(command[2])<1 or int(command[3])<1 or int(command[2])>count or int(command[3])>count: print  "Введите значения от 1 до числа композиций"
            else:  dowloadOnInterval(int(command[2]), int(command[3]))          
    else: print command[0]+"- Не, не слышал :)" 

Всё работает на ура;) Теперь можно качать любимые песни не выходя из не менее любимой консоли))

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

Отправить комментарий