-
Notifications
You must be signed in to change notification settings - Fork 0
/
SubIt.py
171 lines (141 loc) · 4.83 KB
/
SubIt.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#Subit
# * Version 1.2
# * 2009-01-11
# * URL: http://www.homeofthehip.com
# * Description: Subtitle downloader.
# * Author: Magnus Dunker
# * Modified by: S. Andrew Ning
# * Copyright: Copyright (c) 2009 Magnus Dunker. Use it anyway you like
#
#@Parameters
# -f The name of the avi file or directory. If -f is not specified subit will look in the current directory.
# -l A comma delimitered string specifying the language of the subtitles in prioritied order.
#
#Usage: SubIt.py -f "M:\MyAvis" -l dan,eng
import time
from array import array
import struct
import os
import urllib
import sys
from zipfile import *
from xmlrpclib import ServerProxy, Error
from urllib2 import Request, urlopen, URLError, HTTPError
from optparse import OptionParser
server = ServerProxy("http://api.opensubtitles.org/xml-rpc")
token=""
def SubIt():
filename=""
lang=""
movieFound=False
parser = OptionParser()
parser.add_option("-f", help="name of the file or directory to get subtitles for. If omitted SubIt will look for .avi files in the current directory", dest="filename")
parser.add_option("-l", help="comma delimitered string with languages. eg dan,eng. If omitted the default will be english", dest="languages")
(options, args) = parser.parse_args()
if options.filename:
filename = options.filename
if options.languages:
lang=options.languages
else:
lang="eng"
if filename=="" or os.path.isdir(filename) == True:
if(os.path.isdir(filename) == True):
directory = filename
else:
directory=os.getcwd()
for root, dirs, files in os.walk(directory):
for fname in files:
extension = os.path.splitext( fname )[1]
if extension==".avi":
movieFound=True
FindSubtitles(root +"\\"+ fname,lang)
else:
FindSubtitles(filename,lang)
movieFound=True
if not movieFound:
print "No movies found in '"+os.getcwd()+"'"
raw_input("Done... press enter ")
def FindSubtitles(videoname,lang):
print "Contacting www.opensubtitles.org ("+videoname+")"
filename = os.path.dirname(videoname) + "\\" +os.path.splitext(os.path.basename(videoname))[0]+ ".srt"
langs=lang.split(",")
data=GetSubtitles(videoname);
found=False
if data:
for l in langs:
for item in data:
if item['SubLanguageID']== l and not found:
print "Found", item['LanguageName'], "subtitle ..."
zipname=Download(item['ZipDownloadLink'],item['SubFileName'])
print "Extracting subtitle ",filename
Unzip(zipname,filename)
os.remove(zipname)
found=True
else:
print "No Subtitles found"
def GetSubtitles(moviepath ):
#print server.LogIn("","","","SubIt")['status']
try:
token=server.LogIn("","","","SubIt")['token']
except:
print "opensubtitles.org server is not online at the moment. please try again later."
exit(1);
moviebytesize = os.path.getsize(moviepath)
hash=Compute(moviepath)
movieInfo = {'sublanguageid' : 'eng','moviehash' : hash, 'moviebytesize' : moviebytesize}
movies=[movieInfo]
data=server.SearchSubtitles(token,movies)['data']
# if the hash fails, try searching by title of movie (assuming file is named after its title)
if (data == False):
basename = os.path.basename(moviepath)
name = os.path.splitext(basename)[0]
print "Could not find by hash ..."
print "Searching by name: \"" + name + "\""
movieInfo = {'sublanguageid' : 'eng','query' : name}
movies=[movieInfo]
data=server.SearchSubtitles(token,movies)['data']
server.LogOut()
return data
def Compute(name):
try:
longlongformat = 'q' # long long
bytesize = struct.calcsize(longlongformat)
f = file(name, "rb")
filesize = os.path.getsize(name)
hash = filesize
if filesize < 65536 * 2:
return "SizeError"
for x in range(65536/bytesize):
buffer = f.read(bytesize)
(l_value,)= struct.unpack(longlongformat, buffer)
hash += l_value
hash = hash & 0xFFFFFFFFFFFFFFFF #to remain as 64bit number
f.seek(max(0,filesize-65536),0)
for x in range(65536/bytesize):
buffer = f.read(bytesize)
(l_value,)= struct.unpack(longlongformat, buffer)
hash += l_value
hash = hash & 0xFFFFFFFFFFFFFFFF
f.close()
returnedhash = "%016x" % hash
return returnedhash
except(IOError):
return "IOError"
def Unzip(zipname,unzipname):
z = ZipFile(zipname)
for filename in z.namelist():
if os.path.splitext(os.path.basename(filename))[1] == ".srt":
outfile = file(unzipname, "w")
outfile.write(z.read(filename))
outfile.close()
def Download(url,filename):
req = Request(url)
f = urlopen(req)
print "downloading " + url
# Open our local file for writing
local_file = open(filename+".zip", "w" + "b")
#Write to our local file
local_file.write(f.read())
local_file.close()
return filename+".zip"
SubIt()