subsies/main.py

124 lines
3.3 KiB
Python

#! /usr/bin/python2.7
def get_save_subtitles(fpath) :
import subliminal
from babelfish import Language
from datetime import timedelta
from os import system
print("Finding and saving subtitles for "+str(fpath))
vids = subliminal.scan_video(fpath)
subs = subliminal.download_best_subtitles([vids], {Language("eng")})
for v in [vids] :
subliminal.save_subtitles(v, subs[v])
system("chmod -R 777 {}".format(v.name[:v.name.rindex("/")]))
import threading
class Downloader(threading.Thread) :
def __init__(self, in_q, rate) :
threading.Thread.__init__(self)
self.q = in_q
self.rate = rate
def run(self) :
@RateLimited(self.rate)
def doit(arg) :
try :
get_save_subtitles(arg)
except Exception as e :
print("Could not save subtitles for "+arg+", "+str(e))
while True :
job = self.q.get()
if job is None :
return
doit(job)
class FileWatcher(threading.Thread) :
def __init__(self, root, out_q) :
threading.Thread.__init__(self)
self.q = out_q
self.root = root
def run(self) :
import os
for dirpath, _, fnames in os.walk(self.root) :
fnames = sorted(fnames)
if len(fnames) > 150 :
continue
for fname in fnames :
fname = os.path.join(dirpath, fname)
if not self.isVideoExt(fname.split(".")[-1]) :
continue
if not self.noSubYet(".".join(fname.split(".")[:-1])) :
continue
if self.isLink(fname) :
continue
self.q.put(fname)
self.q.put(None)
def isVideoExt(self, ext) :
return ext in ["mp4", "avi", "mkv"]
def noSubYet(self, basename) :
from os import path
return not (
path.isfile(basename+".srt") or
path.isfile(basename+".en.srt") or
path.isfile(basename+".en.ttml") or
path.isfile(basename+".ttml")
)
def isLink(self, fpath) :
from os import path
return path.islink(fpath)
job_queue = None
def get_job_queue() :
global job_queue
if job_queue is None :
import Queue as queue
job_queue = queue.Queue()
return job_queue
last = 0.0
def RateLimited(opsPerSec) :
import time
minInterval = 1.0 / float(opsPerSec)
def dec(func) :
def limitedFunc(*args, **kwargs) :
global last
elapsed = time.clock() - last
left = minInterval - elapsed
if left > 0 :
time.sleep(left)
ret = func(*args, **kwargs)
last = time.clock()
return ret
return limitedFunc
return dec
def get_args() :
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--root", type=str, default="/volume1/video/TV") #required=True)
parser.add_argument("--rate", type=float, default=1)
return parser.parse_args()
def main() :
args = get_args()
FileWatcher(args.root, get_job_queue()).run()
Downloader(get_job_queue(), args.rate).run()
return
threads = []
threads.append(FileWatcher(args.root, get_job_queue()))
threads.append(Downloader(get_job_queue(), args.rate))
for t in threads :
t.start()
for t in threads :
t.join()
if __name__ == "__main__" :
main()