124 lines
3.3 KiB
Python
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()
|