Очередной утилитарный скрипт по принципу "что хромает - то идёт".
Был написан по следующим причинам…
Музыку я слушаю много. Очень много, фактически - постоянно. И довольно-таки часто слушаю всяческие интернет-радиостанции, на которых иногда попадется что-то такое, что хочется скачать себе. Но! Для этого надо запомнить, что именно играет сейчас :)
В роли проигрывателя, как уже упоминал, у меня MusicPD на сервере, поэтому для "записывания" названий песен было набросано вот такое вот:
mpc -h 192.168.1.100 |head -1|gawk "BEGIN {FS=\": \"} {print $2}" >> c:\2dl.txt
sort c:\2dl.txt -o c:\2dl.tmp && mv -f c:\2dl.tmp c:\2dl.txt
Да, у меня на ноуте под Виндой *NIXовские утилиты установлены, без них жить уныло :)
И вот когда в файлике 2dl.txt накопилась уйма строк, пришлось думать - как бы автоматизировать скачивание.
Качать было решено, естественно, из «секты» - база музыки там очень приличная.
Ну вот и… Готов скрипт. Кому нужен - забирайте.
Юзать так:
scriptname.py "Artist - Songname"
Находит десять песен, проверяет их размер и льёт самый большой файл. Качество - наше всё :)
Copy Source |
Copy HTML- # -*- coding: utf-8 -*-
-
- from __future__ import with_statement
- import urllib2
- import urllib
- import re
- import os
-
- class VKDwnld:
- def __init__(self, email, password):
- self.email = email
- self.password = password
- self.cookie = None
- self.header = {}
-
- def get_s(self):
- url = 'http://login.vk.com/?act=login'
- get_data = urllib.urlencode({'email' : self.email,
- 'expire' : '',
- 'pass' : self.password,
- 'vk' : ''})
-
- header = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.353.0 Safari/533.3',
- 'Host' : 'login.vk.com',
- 'Referer' : 'http://vkontakte.ru/index.php',
- 'Connection' : 'close',
- 'Pragma' : 'no-cache',
- 'Cache-Control' : 'no-cache',
- }
-
- sock = urllib2.Request(url, get_data, header)
- data = urllib2.urlopen(sock)
- return re.findall(r"name='s' id='s' value='(.*?)'", data.read())[ 0]
-
- def get_cached_cookie(self):
- try:
- with file("cookie.dat","r") as f:
- self.cookie = f.read()
- except IOError:
- return None
- if self.cookie:
- print "Got cookie from cookie.dat"
- return self.cookie
- else: return None
-
- def get_cookie(self):
- self.get_cached_cookie()
- if self.cookie: return self.cookie
- url = 'http://vkontakte.ru/login.php?op=slogin'
- get_data = urllib.urlencode({'s' : self.get_s()})
- self.header = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.353.0 Safari/533.3',
- 'Host' : 'vkontakte.ru',
- 'Referer' : 'http://login.vk.com/?act=login',
- 'Connection' : 'close',
- 'Cookie' : 'remixchk=5; remixsid=nonenone',
- 'Pragma' : 'no-cache',
- 'Cache-Control' : 'no-cache'
- }
- sock = urllib2.Request(url, get_data, self.header)
- data = urllib2.urlopen(sock)
- cookie_src = data.info().get('Set-Cookie')
- self.cookie = re.sub(r'(expires=.*?;\s|path=\/;\s|domain=\.vkontakte\.ru(?:,\s)?)', '', cookie_src)
- with file("cookie.dat","w") as f:
- f.write(self.cookie)
- return self.cookie
- def get_mp3size(self,url):
- try:
- data = urllib.urlopen(url)
- except IOError:
- return None
- meta = data.info()
- size = int(meta.getheaders("Content-length")[ 0])
- data.close()
- return size
-
- def get_mp3s(self, title):
- host = "http://vkontakte.ru/gsearch.php"
- post = urllib.urlencode({"section":"audio",
- "c[q]":title.encode("cp1251")})
- self.header['Cookie'] = self.get_cookie()
- sock = urllib2.Request(host, post, self.header)
- data = urllib2.urlopen(sock)
- data = data.read()
- url_filter = r"""
""" - title_filter=r"""((?:)[\S\s]*?) - ((?:)[\S\s]*?)
- url_dict = []
- title_dict = []
- for item in re.findall(url_filter, data.decode("cp1251"))[:10]:
- url_dict.append("http://cs%s.vkontakte.ru/u%s/audio/%s.mp3" % (item[ 0], item[1], item[2]))
- for item in re.findall(title_filter, data.decode("cp1251"))[:10]:
- title_dict.append("%s - %s" % (item[ 0], item[1]))
- return url_dict, title_dict
-
- if __name__=="__main__":
- s_file = os.sys.argv[1].decode("cp1251")
- print "Searching for: "+s_file
- vkdl = VKDwnld("user@domain.com", "pAsSwoRd")
- urls,titles = vkdl.get_mp3s(s_file)
- biggest=""
- fsize= 0
- if urls:
- cnt= 0
- for item in urls:
- current_size = vkdl.get_mp3size(item)
- if current_size>fsize:
- fsize = current_size
- biggest = item
- print "%s\n\t%s\t%s bytes" % (titles[cnt],item,current_size)
- print "\n------------\nBiggest: %s\n\tsize:%s" % (biggest,fsize)
- os.system(r'wget "%s" -O "c:\Music\Vkontakte\%s"' % (biggest.encode("cp1251"),s_file.encode("cp1251")+".mp3"))
- else:
- print "Not found."
- exit(1)