Девелоперское

May 04, 2010 23:25

Очередной утилитарный скрипт по принципу "что хромает - то идёт".
Был написан по следующим причинам…
Музыку я слушаю много. Очень много, фактически - постоянно. И довольно-таки часто слушаю всяческие интернет-радиостанции, на которых иногда попадется что-то такое, что хочется скачать себе. Но! Для этого надо запомнить, что именно играет сейчас :)
В роли проигрывателя, как уже упоминал, у меня 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
  1. # -*- coding: utf-8 -*-
  2.  
  3. from __future__ import with_statement
  4. import urllib2
  5. import urllib
  6. import re
  7. import os
  8.  
  9. class VKDwnld:
  10.     def __init__(self, email, password):
  11.         self.email = email
  12.         self.password = password
  13.         self.cookie = None
  14.         self.header = {}
  15.  
  16.     def get_s(self):
  17.         url = 'http://login.vk.com/?act=login'
  18.         get_data = urllib.urlencode({'email' : self.email,
  19.                                  'expire' : '',
  20.                                  'pass' : self.password,
  21.                                  'vk' : ''})
  22.  
  23.         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',
  24.                    'Host' : 'login.vk.com',
  25.                    'Referer' : 'http://vkontakte.ru/index.php',
  26.                    'Connection' : 'close',
  27.                    'Pragma' : 'no-cache',
  28.                    'Cache-Control' : 'no-cache',
  29.                   }
  30.  
  31.         sock = urllib2.Request(url, get_data, header)
  32.         data = urllib2.urlopen(sock)
  33.         return re.findall(r"name='s' id='s' value='(.*?)'", data.read())[ 0]
  34.  
  35.     def get_cached_cookie(self):
  36.         try:
  37.             with file("cookie.dat","r") as f:
  38.                 self.cookie = f.read()
  39.         except IOError:
  40.             return None
  41.         if self.cookie:
  42.             print "Got cookie from cookie.dat"
  43.             return self.cookie
  44.         else: return None
  45.  
  46.     def get_cookie(self):
  47.         self.get_cached_cookie()
  48.         if self.cookie: return self.cookie
  49.         url = 'http://vkontakte.ru/login.php?op=slogin'
  50.         get_data = urllib.urlencode({'s' : self.get_s()})
  51.         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',
  52.                    'Host' : 'vkontakte.ru',
  53.                    'Referer' : 'http://login.vk.com/?act=login',
  54.                    'Connection' : 'close',
  55.                    'Cookie' : 'remixchk=5; remixsid=nonenone',
  56.                    'Pragma' : 'no-cache',
  57.                    'Cache-Control' : 'no-cache'
  58.                   }
  59.         sock = urllib2.Request(url, get_data, self.header)
  60.         data = urllib2.urlopen(sock)
  61.         cookie_src = data.info().get('Set-Cookie')
  62.         self.cookie = re.sub(r'(expires=.*?;\s|path=\/;\s|domain=\.vkontakte\.ru(?:,\s)?)', '', cookie_src)
  63.         with file("cookie.dat","w") as f:
  64.             f.write(self.cookie)
  65.         return self.cookie
  66.     def get_mp3size(self,url):
  67.         try:
  68.             data = urllib.urlopen(url)
  69.         except IOError:
  70.             return None
  71.         meta = data.info()
  72.         size = int(meta.getheaders("Content-length")[ 0])
  73.         data.close()
  74.         return size
  75.  
  76.     def get_mp3s(self, title):
  77.         host = "http://vkontakte.ru/gsearch.php"
  78.         post = urllib.urlencode({"section":"audio",
  79.                                  "c[q]":title.encode("cp1251")})
  80.         self.header['Cookie'] = self.get_cookie()
  81.         sock = urllib2.Request(host, post, self.header)
  82.         data = urllib2.urlopen(sock)
  83.         data = data.read()
  84.         url_filter = r"""

    """
  85.         title_filter=r"""((?:)[\S\s]*?) - ((?:)[\S\s]*?) 
  86.         url_dict = []
  87.         title_dict = []
  88.         for item in re.findall(url_filter, data.decode("cp1251"))[:10]:
  89.             url_dict.append("http://cs%s.vkontakte.ru/u%s/audio/%s.mp3" % (item[ 0], item[1], item[2]))
  90.         for item in re.findall(title_filter, data.decode("cp1251"))[:10]:
  91.             title_dict.append("%s - %s" % (item[ 0], item[1]))
  92.         return url_dict, title_dict
  93.  
  94. if __name__=="__main__":
  95.     s_file = os.sys.argv[1].decode("cp1251")
  96.     print "Searching for: "+s_file
  97.     vkdl = VKDwnld("user@domain.com", "pAsSwoRd")
  98.     urls,titles = vkdl.get_mp3s(s_file)
  99.     biggest=""
  100.     fsize= 0
  101.     if urls:
  102.         cnt= 0
  103.         for item in urls:
  104.             current_size = vkdl.get_mp3size(item)
  105.             if current_size>fsize:
  106.                 fsize = current_size
  107.                 biggest = item
  108.             print "%s\n\t%s\t%s bytes" % (titles[cnt],item,current_size)
  109.         print "\n------------\nBiggest: %s\n\tsize:%s" % (biggest,fsize)
  110.         os.system(r'wget "%s" -O "c:\Music\Vkontakte\%s"' % (biggest.encode("cp1251"),s_file.encode("cp1251")+".mp3"))
  111.     else:
  112.         print "Not found."
  113.         exit(1)

dev, soft

Previous post Next post
Up