예제 #1
0
def viewmap():
		for snu in  lastunseen.listunseen(retlist=True):

				slist = functions.getSeasons(snu[1])
				s = slist.keys()
				s.sort()
				ssn = lastunseen.lastunseen_ssn(snu[1])
				sys.stdout.write("% 30s  " %  ssn[0])
				for k in s:
						sys.stdout.write("|")
						for e in slist[k]:
								if slist[k].index(e) == ssn[2]-1 and ssn[1] == k:
										sys.stdout.write("+")
								else:
										sys.stdout.write("_")
				sys.stdout.write("|")
				sys.stdout.write("\n")
예제 #2
0
def listunseen():
		for snu in  lastunseen.listunseen(retlist=True):
				unseen = 0
				# names of episodes grouped by seasons {numOfSeason: [list, of, names]}
				slist = functions.getSeasons(snu[1])

				#nseasosns = s[-1]

				# last watched [ SeriesName, lastWatchedSeason, lastWatchedEpisode ]
				ssn = lastunseen.lastunseen_ssn(snu[1])

				for k,v in slist.items():
						if k < ssn[1]:
								pass
						elif k == ssn[1]:
								unseen += len(v) - ssn[2] + 1
						elif k > ssn[1]:
								unseen += len(v)

				print "% 20s\t% 3d" % (ssn[0], unseen)
예제 #3
0
def mplay(argv, latest=None, queue=None, t_name=None, offline=None):
    if not latest:
        if not t_name:
            ctime = []
            def wfunction(*argv):
                for f in argv[2]:
                    if os.path.isdir(f): continue
                    if os.path.splitext(f)[1] != '.mp4': continue
                    fpath=os.path.join(argv[1],f)
                    ctime.append((fpath,os.stat(fpath).st_ctime))

            def sort_cmp(a,b):
                if a[1] > b[1]: return 1
                elif a[1] == b[1]: return 0
                else: return -1
            os.path.walk(config.wrkdir, wfunction, None)
            ctime.sort(cmp=sort_cmp)
            try:
                latest = ctime[-1][0]
            except IndexError:
                print "There is no fetched episodes"
                sys.exit(1)
        else:
            t_dir = os.path.join(config.wrkdir, t_name)
            series = filter(lambda a: re.match(".*\.mp4",a), os.listdir(t_dir))
            series.sort()
            latest = os.path.join(t_dir,series[0])


    srt = os.path.splitext(latest)[0]+'.srt'

    try:
        metadata = metaWrapper.load_saved_meta(os.path.splitext(latest)[0]+'.meta')
    except IOError:
        print "Seems fetcher is not ready yet"
        return None

    args = [
            "mpv",
            latest,
            "-sub-file",
            srt,
            '-term-status-msg',
            "POSITION: |${=time-pos}|"
            ]
    args.extend(argv[1:])
    if metadata.has_key("lastpos"):
        if metadata["lastpos"] < 0:
            metadata["lastpos"] = 0
        args.extend(["-start", str(metadata["lastpos"])])

    devnull=open(os.devnull, "w")
    tmp = tempfile.NamedTemporaryFile()
    if queue: queue.put_nowait({"tmpfile": tmp.name})
    """
    tee = subprocess.Popen(["tee", tmp.name], stdin=subprocess.PIPE,
            stdout=devnull
            )
"""
    #p = Popen(args, stderr=tmp, stdout=devnull, close_fds=True)
    p = Popen(args, stderr=tmp, stdout=devnull)
    if queue: queue.put_nowait({"pid": p.pid})
    pid, sts = os.waitpid(p.pid, 0)
    tmp.flush()
    tmp.seek(0)
    quit_position=[0]
    l = tmp.readlines()
    if len(l) > 0:
        l = l[-1].strip()
        match = re.match("POSITION: \|(.*)\|", l)
        if match:
            quit_position = match.groups()
        """
    for l in tmp.readlines():
        if len(l.split(u'\033[J\r')) > 1:
            match = re.match("POSITION:\s|(.*)|", l.split(u'\033[J\r')[-2])
    """
    tmp.close()

    fd = open(os.path.splitext(latest)[0]+'.meta', "w+")
    metadata["lastpos"]=float(quit_position[0]) - 5
    fd.write(json.dumps(metadata))
    fd.close()


    if float(quit_position[0])/float(metadata["duration"]) > 0.98:
        response = metaWrapper.watchEpisode(metadata["eid"], offline=offline)
        if response == {'page': ''}:
            print '\n\nEpisode has been watched'
            print 'Cleanup...'
            for e in ('.meta','.mp4', '.srt', '.log'):
                try:
                    os.remove(os.path.splitext(latest)[0]+e)
                except OSError: pass
            if queue: queue.put({"cleaned_up":True})
            if not offline:
                print listunseen()
    if queue: queue.put({"pos":float(quit_position[0])})
    #tee.stdin.close()
    return float(quit_position[0])
예제 #4
0
def main(argv):
		if not os.path.isdir(config.wrkdir): os.mkdir(config.wrkdir)
		os.chdir(config.wrkdir)
		quality=config.quality
		playargs=[]
		play=False
		offline=False
		offlineplay=False
		proxy=False
		if "-lq" in argv:
				quality = "default"
				argv.pop(argv.index("-lq"))
		if "-hq" in argv:
				quality = "hq"
				argv.pop(argv.index("-hq"))
		if "-proxy" in argv:
				proxy = True
				argv.pop(argv.index("-proxy"))
		if len(argv) > 1 and argv[1] == 'unseen':
				print listunseen()
				sys.exit(0)
		if "-sub_lang" in argv:
				ix = argv.index("-sub_lang")
				argv.pop(ix)
				config.sub_lang = argv.pop(ix)
		if "play" in argv:
				play=True
				playindex=argv.index("play")
				for i in range(playindex, len(argv)):
						playargs.append(argv.pop(playindex))
				playargs.pop(0)
		if "offline" in argv:
				offline=True
				offindex = argv.index("offline")
				offnum = 0
				if len(argv) > 3:
						offnum = argv[offindex+1]
						argv.pop(offindex)
				argv.pop(offindex)
		if "offlineplay" in argv:
				offlineplay=True
				playindex=argv.index("offlineplay")
				for i in range(playindex, len(argv)):
						playargs.append(argv.pop(playindex))
				playargs.pop(0)

		if "viewmap" in argv:
				from viewmap import viewmap
				viewmap()
				sys.exit(0)

		if "fullunseen" in argv:
				import viewmap
				viewmap.listunseen()
				sys.exit(0)

		if "compactunseen" in argv:
				for e in listunseen(retlist=True):
						print e[1]
				sys.exit(0)

		if len(argv) == 1:
				turboplay.mplay(playargs)
				sys.exit(0)

				tr = filter(lambda a: a[0]==3, listunseen(retlist=True))
				r = Random()
				t_name = r.choice(tr)[1]

		if len(argv) == 2:
				selfname, t_name = argv

		else: usage(argv[0])
		if not os.path.isdir(os.path.join(config.wrkdir,t_name)): os.mkdir(os.path.join(config.wrkdir,t_name))

		play_th = threading.Thread(target=lambda a: a)
		fetch_th = threading.Thread(target=lambda a: a)
		play_queue = Queue.Queue()
		fetch_queue = Queue.Queue()
		mplayer_pid = None

		logfd = sys.stdout

		if not offlineplay:
				try:
						f = open(config.offline_store)
						d = pickle.load(f)
						f.close()
				except IOError:
						d = []
				td = list(d)
				for e in td:
						r = watchEpisode(e["eid"])
						if r == {'page': ''}:
								d.pop(d.index(e))
				f = open(config.offline_store,"w+")
				pickle.dump(d,f)
				f.close()
		if play:
				fetch_done = False
				metadata_fetch_done = False
				sub_fetch_done = False
				pos = nprobes = average = asize = 0
				tmpfilename = None

				while True:
						"""
						if play_th.is_alive() and mplayer_pid and tmpfilename:
								hangmon(tmpfilename, mplayer_pid) """

						if not metadata_fetch_done:
								try:
										metadata, file_base = get_metadata(t_name, quality)
										quality = metadata["fetched_quality"]
										metadata_fetch_done = True
										print "Got metadata" # metadata
								except NoMoreSeries:
										print "No more series"
										sys.exit(0)

						if not sub_fetch_done:
								try:
										if metadata_fetch_done:
												fetch_sub(metadata["subtitles"]["sources"][config.sub_lang], file_base+".srt")
												print "Got subtitles"
								except KeyError:
										print "Subtitles not found"
								sub_fetch_done = True

						if not fetch_th.is_alive() and not fetch_done:
								if metadata_fetch_done:
										fetch_th = threading.Thread(target=pfetcher, args=(metadata, file_base,
												quality),
												kwargs={"silent":False, "queue" : fetch_queue})
										fetch_th.daemon = True
										fetch_th.start()
										#time.sleep(config.wait_time*10)

						if not fetch_queue.empty():
								fetch_done = fetch_queue.get()

						if not play_queue.empty():
								obj = play_queue.get()
								if obj.has_key("pos"): pos = obj["pos"]
								if obj.has_key("tmpfile"): tmpfilename = obj["tmpfile"]
								if obj.has_key("pid"): mplayer_pid = obj["pid"]
								if obj.has_key("cleaned_up"):
										fetch_done = False
										sub_fetch_done = False
										metadata_fetch_done = False
										continue

						if not play_th.is_alive() and os.path.exists(file_base+".mp4") and os.stat(file_base+".mp4").st_size > 0:
								play_th = threading.Thread(target=turboplay.mplay, args=(playargs,),
												kwargs={"latest": file_base+".mp4",
														"queue":play_queue})
								play_th.start()
								print "Playing: \n%s Season %s Episode %s" % (t_name,
										metadata["season"], metadata["number"])
						time.sleep(config.wait_time)

		elif offline:
				offset = 0
				while offnum > offset or offnum == 0:
						metadata, file_base = get_metadata(t_name, quality, offset=offset)
						print "Fetching for offline: \n%s Season %s Episode %s" % (t_name,
								metadata["season"], metadata["number"])
						try:
								fetch_sub(metadata["subtitles"]["sources"][config.sub_lang], file_base+".srt")
						except KeyError:
								print "Subtitles not found"
						pfetcher(metadata, file_base, quality)
						offset += 1
						#print t_name, metadata["season"], metadata["number"]
					
		elif offlineplay:
				while True:
						turboplay.mplay(playargs, t_name=t_name, offline=True)
		else:
				metadata, file_base = get_metadata(t_name, quality)
				print "Got metadata" # metadata

				try:
						fetch_sub(metadata["subtitles"]["sources"][config.sub_lang], file_base+".srt")
						print "Got subtitles"
				except KeyError:
						print "Subtitles not found"
				pfetcher(metadata, file_base, quality)