Search
Write a publication
Pull to refresh

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

Пока учил 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
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.