#!/usr/bin/python """ Crapy Jiwa download tool """ import re import sys import json import time from hashlib import md5 from random import choice import urllib,httplib,urllib2 def filter(s): return s.replace('\n',' ') def randomUA(): rstr = ''.join([choice('0123456789') for i in range(32)]) return 'Mozilla Firefox (%s)'%rstr def getSongDetails(sid): r = urllib2.Request('http://www.jiwa.fr/song/%d/play/'%sid) resp = urllib2.urlopen(r).read() return json.loads(resp) def lookupSongs(keywords): try: r = urllib2.Request('http://www.jiwa.fr/search?q=%s'%urllib.quote(keywords)) resp = urllib2.urlopen(r).read() matches = re.findall('/track/.*-([0-9]+)\.html',resp) res = [] for match in list(set(matches))[:5]: res.append(getSongDetails(int(match))) return res except urllib2.Error,e: return None def dlTrack(sid,filename): errors = 0 while errors<3: token = getToken(sid) _t = token.split('=') url = 'http://m.jiwa.fm/play.php' l1 = 'gwqd29ydg7sqys_qsh0' l3 = _t[0] l4 = _t[1] l5 = _t[2] l6 = _t[3] l7 = md5(l1).hexdigest() l8 = md5(l3+l7+str(sid)).hexdigest() url = "%s?r=%s&s=%s&t=%s&m=%s&from=1" % (url,l4,str(sid),l8,l6) r = httplib.HTTPConnection('m.jiwa.fm:80') r.putrequest('GET',url) r.putheader('Host','m.jiwa.fm:80') r.putheader('User-Agent',randomUA()) r.endheaders() token = r.getresponse().read() if token=='-1': errors += 1 time.sleep(1) else: f = open(filename,'wb') f.write(token) f.close() return True return False def getToken(sid): params = { 's':str(sid), } p = urllib.urlencode(params) r = httplib.HTTPConnection('m.jiwa.fm:80') r.putrequest('POST','http://m.jiwa.fm/token.php?r=1') r.putheader('Host','m.jiwa.fm:80') r.putheader('User-Agent',randomUA()) r.putheader('Content-Type','application/x-www-form-urlencoded') r.putheader('Content-Length',str(len(p))) r.endheaders() r.send(p) token = r.getresponse().read() return token if __name__ == '__main__': print '[>] iJaw - A Jiwa search & download tool' print '[>] author: virtualabs (http://www.virtualabs.fr)' print '[>]' if len(sys.argv)>2: operator = sys.argv[1] if operator == 'search': kw = ' '.join(sys.argv[2:]) print '[+] Looking for songs ...' tracks = lookupSongs(kw) if tracks: if len(tracks)>0: print '' print 'Song ID - Song Name [Artist, Album]' print '' for t in tracks: print '%s - %s [%s, %s]' % (t['songId'],filter(t['songName']),filter(t['artistName']),filter(t['albumName'])) print '' print '%d songs found' % len(tracks) else: print '[!] No songs found.' else: print '[!] No songs found.' elif operator == 'get': tracks = [t for t in sys.argv[2:]] for sid in tracks: print '[+] getting track info ...' _track = getSongDetails(int(sid)) filename = '%s_%s_%s.mp3' % (_track['artistName'].replace(' ','_'),_track['albumName'].replace(' ','_'),_track['songName'].replace(' ','_')) print '[+] downloading track ...' if dlTrack(sid,filter(filename)): print '[i] saved to %s.' % filter(filename) else: print '[!] Unable to download song.' elif operator == 'dl': kw = ' '.join(sys.argv[2:]) tracks = lookupSongs(kw) if tracks: for t in tracks: _track = getSongDetails(t['songId']) filename = '%s_%s_%s.mp3' % (_track['artistName'].replace(' ','_'),_track['albumName'].replace(' ','_'),_track['songName'].replace(' ','_')) print '[+] downloading song "%s [%s]" ...' % (_track['songName'],_track['artistName']) if dlTrack(int(t['songId']),filter(filename)): print '[i] saved to %s.' % filter(filename) else: print '[!] Failed to download song: %s' % _track['songName'] print '[+] Done.' else: print '[!] No songs found' else: print '[i] usage: %s [search|get|dl] [second arg]' print '[i]' print '[i] + you can look for songs:' print '[i]' print '[i] $ ijaw.py search Madonna like a virgin' print '[i] $ 12345 - Like a virgin [Madonna, ...]' print '[i]' print '[i] + and download a given song with its ID:' print '[i] $ ijaw.py get 12345' print '[i]' print '[i] + or download all tracks found:' print '[i]' print '[i] $ ijaw.py dl Madonna like a virgin' print '[i]' print '[i] + Have phun !'