Как стать автором
Обновить

Скрипт скачивающий всю добавленную музыку из Вконтакте

Пока учил python написал небольшой скрипт, а позже добавил GUI на pyqt4 к нему. Да, идея не особо оригинальная, но скрипт легко переделать под другие ресурсы (скачивание подкастов, фотографий и т.д.).

Краткое описание:
  • Создает папку music, в которую будет копировать файлы
  • Заходит на сайт и переходит на vkontakte.ru/audio
  • Копирует авторов, названия треков и url mp3 файлов
  • Сохраняет в папку music файлы вида: автор — название трека.mp3
  • Создает плейлист m3u (перечисление файлов)
  • Добавляются только новые треки, старые не удаляются

Для запуска скрипта должен быть установлен Python 2.x.x, для скрипта с GUI еще PyQt4. Для редактирования формы Qt Designer, ну и pyuic4 (у юбунтоводов все это есть в synaptic)


Скрипт без GUI

Функция LoginVk

Переменной url присваивается адрес скрипта авторизации, соответственно переменная form_data содержит данные для авторизации. Функция использует CookieJar() для входа и перехода по ссылкам с использованием cookie. Если скрипт не может соединиться с сайтом то функция возвращает 1.
Вконтакте использует кодировку windows-1251. Функция decode('cp1251') переводит в юникод полученную страницу.

def LoginVk(email,password):
    print 'Connect to Vk...'
    url = "http://login.vk.com?"
    form_data = {'act' : 'login', 'q' : '1', 'al_frame' : '1',
             'expire' : '', 'captcha_sid' : '',  'captcha_key' : '','from_host' : 'vkontakte.ru',
             'email' : email, 'pass' : password} 

    jar = cookielib.CookieJar() #cookie storage
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar)) #opener whith cookie
    form_data = urllib.urlencode(form_data) # encode url data

    check=0
    try:
        resp = opener.open(url, form_data)  # login
    except:
        check=1
    try:
        resp = opener.open('http://vkontakte.ru/audio')  #open audio page
    except:
        check=1

    if check:
        response=1
    else:
        response=resp.read() #copy response
        resp.close() #close site
        response = response.decode('cp1251') # decode windows-1251
        print 'Done'
    return response


Функция DownloaderMp3

Переменной file_name присваивается имя с которым будет сохранен файл. Условие if os.path.isfile(file_name) проверяет существование этого файла, если существует то файл не закачивается. Переменная meta получает информацию о скачиваемом файле. Файл качается блоками по 8192 байт.

def DownloaderMp3(url,artist,song):
    file_name = artist+' - '+song+'.mp3' 
    print "Downloading: %s" % (file_name)
    file_name = 'music/'+file_name
    if os.path.isfile(file_name): 
        print 'file exists'
    else:        
        u = urllib2.urlopen(url)
        f = open(file_name, 'wb')
        meta = u.info()
        file_size = int(meta.getheaders("Content-Length")[0])
        print "Bytes: %s" % (file_size)

        file_size_dl = 0
        block_sz = 8192
        while True:
            buffer = u.read(block_sz)
            if not buffer:
                break

            file_size_dl += block_sz
            f.write(buffer)
            #status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
            #status = status + chr(8)*(len(status)+1)
            #print status,    
        f.close()
        print 'Done'


Функция main

Единственное что нужно изменить в скрипте LoginVk('you@mail.com','youpassword'), вставить сюда свой email и пароль. С помощью regexp забираем со страницы исполнителя, название трека и url mp3 файла. Блок clearing song_list очищает название трека от ссылки на текст (к некоторым трекам добавлены тексты песен). Далее проверяем существует папка music и создаем ее если нет. В цикле while закачиваем файлы, одновременно добавляя их в плейлист.

def main():
    page=LoginVk('you@mail.com','youpassword')#login and password
    if page==1 :
        print'connection problem'
    else:            
        artist_list = re.findall(r'; return false">(.*)</a></b>',page) #take name of artist
        del artist_list[-1] # delete '+audio[5]+' 
        song_list = re.findall(r'</b> - <span class="title">(.*) </span>',page) #take name of song
        del song_list[-1] # delete '+lyricsLink+' 
        mp3_list = re.findall(r'value="(http://.*mp3),\d*"',page) #take url mp3 file

        ###########clearing song_list#########
        i=0
        for item in song_list:
            if re.match('.*</a>', item):
                clear = re.findall(r'">(.*)</a>',item)
                song_list[i]=clear[0]
            i+=1
        ###################################

        if not os.path.exists('music/'):
            os.mkdir("music", 0770)

        playlist_name = 'music/vkplaylist.m3u' #name playlist
        f = open(playlist_name, 'w') #create playlist
            
        i=0
        while i<len(mp3_list):
            DownloaderMp3(mp3_list[i],artist_list[i],song_list[i]) #Download mp3
            line_list = artist_list[i]+' - '+song_list[i]+'.mp3\n' #one line in playlist file
            f.write(line_list.encode("utf8")) #save line in playlist file
            i+=1
        f.close() #Close playlist file

        print 'Finish'


GUI для скрипта




Ссылки на скрипт:

github
SynchVk.zip
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.