updated on Thu Jan 26 16:09:46 UTC 2012
[aur-mirror.git] / napiopensub / napi.py
bloba664688f59661de324f8b6893a1498c3ba027eb4
1 #!/usr/bin/python
2 # vim: filencoding=utf-8 foldmethod=indent
3 import gettext
4 _ = gettext.gettext
5 import locale
6 locale.setlocale( locale.LC_ALL )
7 gettext.bindtextdomain( 'napi', '/usr/share/locale/' )
8 gettext.textdomain( 'napi' )
10 import md5
11 import sys
12 import urllib
13 import os
14 import shutil
15 import commands
16 from struct import *
17 from xmlrpclib import ServerProxy, Error
19 loc = locale.getdefaultlocale()
21 def write2zenity(msg, msg_type='info'):
22 'zenity message sink'
23 os.system('zenity --%s --text="%s" --title "Napiprojekt" &' % (msg_type, msg))
25 def get_file(msg):
26 'zenity "file-input" dialog'
27 return commands.getoutput('zenity --file-selection --multiple --separator="|" --title "text2utf"')
29 def write2stdout(msg, msg_type='info'):
30 'stdout message sink'
31 print '%s: %s' % (msg_type, msg)
33 def subconvert(file):
34 os.system('text2utf \'%s\'' % file)
36 def extract(src, dst):
37 rozszerzenie = src[src.rfind('.')+1:]
38 if (rozszerzenie == '7z'):
39 if (os.system('/usr/bin/7z x -y -so -piBlm8NTigvru0Jr0 \'%s\' 2>/dev/null >\'%s\'' % (src, dst) )):
40 os.remove(dst)
41 return False
42 else:
43 return True
44 if (rozszerzenie == 'gz'):
45 if (os.system('cat \'%s\' | gunzip > \'%s\'' % (src, dst) )):
46 os.remove(dst)
47 return False
48 else:
49 return True
51 def downfile(url, name):
52 try:
53 open(name,'w').write(urllib.urlopen(url).read())
54 except IOError, e:
55 printout(_('Downloading error'), 'error')
56 print>>sys.stderr, e
57 sys.exit(2)
59 class printing:
60 def __init__(self):
61 self.zenity=0
62 self.store=0
63 self.storemsginfo=[]
64 self.storemsgerror=[]
65 def printnow(self, msg, msg_type="info"):
66 if (self.zenity==0):
67 write2stdout(msg, msg_type)
68 else:
69 write2zenity(msg, msg_type)
70 def pr(self, msg, msg_type="info"):
71 if (self.store==0):
72 self.printnow(msg, msg_type)
73 else:
74 if (msg_type=="info"):
75 self.storemsginfo.append(msg)
76 elif (msg_type=="error"):
77 self.storemsgerror.append(msg)
78 def printstored(self):
79 if (self.store==1):
80 if (len(self.storemsginfo)>0):
81 self.printnow('\n'.join(self.storemsginfo), "info")
82 if (len(self.storemsgerror)>0):
83 self.printnow('\n'.join(self.storemsgerror), "error")
84 self.store=0
86 pr=printing()
87 def printout (msg, msg_type='info'):
88 pr.pr(msg, msg_type)
90 if 'zenity' in sys.argv[1:]:
91 pr.zenity=1
93 mname, filenames = '', [s for s in sys.argv[1:] if s != 'zenity']
94 if not filenames:
95 if (pr.zenity==1):
96 filenames = get_file(_('Indicate the movie, that you`re looking the subtitles for.')).split("|")
97 if not filenames[0]:
98 sys.exit(2)
99 else:
100 printout(_('Indicate the movie, that you`re looking the subtitles for.'), 'error')
101 sys.exit(2)
102 if (len(filenames)>1):
103 pr.store=1
104 for i in range(len(filenames)):
105 mname = filenames.pop(0)
106 if not os.path.isfile(mname):
107 printout( _('File:')+" %s " % (mname)+_('not exist!'), 'error')
108 continue
110 filesize = os.path.getsize(mname)
111 if filesize < 65536 * 2:
112 printout(_('Chosed file is too small to be movie!')+" %sMB" % (filesize/(1024*1024) ) )
113 continue
115 fname = mname[:mname.rfind('.')+1]+'txt'
117 sukces=0
120 #NAPIPROJECT
122 if (sukces != 1)and(loc[0]=="pl_PL"):
123 def f(z):
124 'foobar hash function? ;-)'
125 idx = [ 0xe, 0x3, 0x6, 0x8, 0x2 ]
126 mul = [ 2, 2, 5, 4, 3 ]
127 add = [ 0, 0xd, 0x10, 0xb, 0x5 ]
128 b = []
129 for i in xrange(len(idx)):
130 a = add[i]
131 m = mul[i]
132 i = idx[i]
134 t = a + int(z[i], 16)
135 v = int(z[t:t+2], 16)
136 b.append( ('%x' % (v*m))[-1] )
138 return ''.join(b)
140 d = md5.new();
141 d.update(open(mname).read(10485760))
142 url = 'http://napiprojekt.pl/unit_napisy/dl.php?l=PL&f=%s&t=%s&v=other&kolejka=false&nick=&pass=&napios=%s'
143 url = url % (d.hexdigest(), f(d.hexdigest()), os.name)
144 downfile(url, 'napisy.7z')
146 if (extract('napisy.7z', '%s.wyp' % fname)==True):
147 sukces=1
148 pobranoZ="Napiproject"
149 os.remove('napisy.7z')
150 #/NAPIPROJECT
155 #OPENSUB
157 if (sukces != 1):
158 def hashFile(name):
159 try:
160 longlongformat = 'LL' # signed long, unsigned long
161 bytesize = calcsize(longlongformat)
163 f = open(name, "rb")
165 hash = filesize
167 for x in range(65536/bytesize):
168 buffer = f.read(bytesize)
169 (l2, l1)= unpack(longlongformat, buffer)
170 l_value = (long(l1) << 32) | long(l2)
171 hash += l_value
172 hash = hash & 0xFFFFFFFFFFFFFFFF #to remain as 64bit number
175 f.seek(max(0,filesize-65536),0)
176 for x in range(65536/bytesize):
177 buffer = f.read(bytesize)
178 (l2, l1) = unpack(longlongformat, buffer)
179 l_value = (long(l1) << 32) | long(l2)
180 hash += l_value
181 hash = hash & 0xFFFFFFFFFFFFFFFF
183 f.close()
184 returnedhash = "%016x" % hash
185 return returnedhash
187 except(IOError):
188 printout(_('Downloading error'), 'error')
189 print>>sys.stderr, e
190 sys.exit(2)
191 server = ServerProxy("http://www.opensubtitles.org/xml-rpc")
192 myhash = hashFile(mname)
193 size = os.path.getsize(mname)
194 session = server.LogIn("","","pl","python")
195 token = session["token"]
196 if (loc[0]=="pl_PL"):
197 opensubtitles_lang='pol'
198 else:
199 opensubtitles_lang='eng'
200 searchlist = [{'sublanguageid':opensubtitles_lang,'moviehash':myhash,'moviebytesize':str(size)}]
201 moviesList = server.SearchSubtitles(token, searchlist)
202 if moviesList['data']:
203 url = moviesList['data'][0]['SubDownloadLink']
204 downfile(url, 'napisy.gz')
205 if (extract('napisy.gz', '%s.wyp' % fname)==True):
206 sukces=1
207 pobranoZ="Opensubtitles"
208 os.remove('napisy.gz')
209 #/OPENSUB
211 if (sukces==1):
212 printout(_('Downloaded subtitles for movie:')+' %s ' % (os.path.basename(fname))+_('from')+' %s.' % (pobranoZ) )
213 subconvert('%s.wyp' % fname)
214 shutil.move('%s.wyp' % fname, fname)
215 else:
216 printout(_('Did not find subscriptions for movie:')+' %s' % os.path.basename(mname), 'error')
217 pr.printstored()