import os from enigma import eTimer, getDesktop from Components.ActionMap import ActionMap from Components.FileList import FileList from Components.Sources.List import List from Components.Sources.StaticText import StaticText from Components.Task import Task, Job, job_manager from Screens.Screen import Screen from Tools.Downloader import downloadWithProgress from Tools.Directories import fileExists from os import path class HLSDownloadJob(Job): def __init__(self, url, destfile, title,downloadStop): Job.__init__(self, title) AddHLSProcessTask(self, url, destfile, title, downloadStop) class AddHLSProcessTask(Task): def __init__(self, job, url, destfile, title,downloadStop): Task.__init__(self, job, title) self.job = job self.title = title cmdline = '/usr/bin/gst-launch-1.0 "%s" ! hlsdemux ! filesink location="%s"'%(url,destfile) self.setCmdline(cmdline) self.url = url self.destfile = destfile self.downloadStop = downloadStop self.job.currentbytes = 0 self.job.totalbytes = 0 #self.setProgress(100) self.ProgressTimer = eTimer() self.ProgressTimer.callback.append(self.ProgressUpdate) def ProgressUpdate(self): if not fileExists(self.destfile, 'r'): return self.job.currentbytes = path.getsize(self.destfile) progress = self.job.currentbytes/float(self.job.totalbytes) * 100 if self.job.totalbytes else 0 self.setProgress(progress) #self.setProgress(int((path.getsize(self.destfile)/float(self.totalbytes))*100)) self.ProgressTimer.start(5000, True) def prepare(self): self.job.totalbytes = -1 # TODO getsize(self.url) self.ProgressTimer.start(5000, True) def afterRun(self): #self.setProgress(100) self.ProgressTimer.stop() self.downloadStop(self.title) class downloadJob(Job): def __init__(self, url, outputfile, title, downloadStop): Job.__init__(self, title) downloadTask(self, url, outputfile, title, downloadStop) class downloadTask(Task): def __init__(self, job, url, outputfile, title, downloadStop): Task.__init__(self, job, _('Downloading')) self.job = job self.title = title self.url = url self.outputfile = outputfile self.downloadStop = downloadStop self.job.currentbytes = 0 self.job.totalbytes = -1 def run(self, callback): self.callback = callback self.download = downloadWithProgress(self.url, self.outputfile) self.download.addProgress(self.downloadProgress) self.download.start().addCallback(self.downloadFinished)\ .addErrback(self.downloadFailed) def downloadProgress(self, currentbytes, totalbytes): self.job.currentbytes = currentbytes self.job.totalbytes = totalbytes progress = self.job.currentbytes/float(self.job.totalbytes) * 100 self.setProgress(progress) def downloadFinished(self, result): Task.processFinished(self, 0) self.setProgress(self.end) self.downloadStop(self.title) def downloadFailed(self, failure_instance=None, error_message=''): print '[PlayStream] Video download failed' if error_message == '' and failure_instance is not None: error_message = failure_instance.getErrorMessage() print '[PlayStream]', str(error_message) Task.processFinished(self, 1) self.downloadStop("") class VideoDownloadList(Screen): screenWidth = getDesktop(0).size().width() if screenWidth and screenWidth == 1920: skin = """ {"template": [ MultiContentEntryText(pos=(15,1), size=(465,33), \ font=0, flags=RT_HALIGN_LEFT, text=1), # Title MultiContentEntryText(pos=(345,1), size=(225,33), \ font=0, flags=RT_HALIGN_RIGHT, text=2), # State MultiContentEntryProgress(pos=(585,6), size=(150,33), \ percent=-3), # Progress MultiContentEntryText(pos=(750,1), size=(120,33), \ font=0, flags=RT_HALIGN_LEFT, text=4), # Percentage ], "fonts": [gFont("Regular",30)], "itemHeight": 45} """ else: skin = """ {"template": [ MultiContentEntryText(pos=(10,1), size=(210,22), \ font=0, flags=RT_HALIGN_LEFT, text=1), # Title MultiContentEntryText(pos=(230,1), size=(150,22), \ font=0, flags=RT_HALIGN_RIGHT, text=2), # State MultiContentEntryProgress(pos=(390,4), size=(100,22), \ percent=-3), # Progress MultiContentEntryText(pos=(500,1), size=(80,22), \ font=0, flags=RT_HALIGN_LEFT, text=4), # Percentage ], "fonts": [gFont("Regular",20)], "itemHeight": 30} """ def __init__(self, session): Screen.__init__(self, session) self['key_red'] = StaticText(_('Exit')) self['list'] = List([]) self['actions'] = ActionMap(['SetupActions', 'ColorActions'], { 'cancel': self.close, 'ok': self.ok, 'red': self.close, 'blue': self.abort }, -2) self.onLayoutFinish.append(self.layoutFinished) self.onClose.append(self.cleanVariables) self.progressTimer = eTimer() self.progressTimer.callback.append(self.updateDownloadList) def layoutFinished(self): self.setTitle(_('Active video downloads')) self.updateDownloadList() def cleanVariables(self): del self.progressTimer def updateDownloadList(self): self.progressTimer.stop() downloadList = [] for job in job_manager.getPendingJobs(): progress = job.progress / float(job.end) * 100 currentbytes = job.currentbytes if "currentbytes" in dir(job) else 0 downloadList.append((job, job.name, job.getStatustext(), int(progress), "%.1fM"%(currentbytes/1024.0/1024.0) )) self['list'].updateList(downloadList) if downloadList: self.progressTimer.startLongTimer(2) def ok(self): current = self['list'].getCurrent() if current: from Screens.TaskView import JobView self.session.open(JobView, current[0]) def abort(self): current = self['list'].getCurrent() job = current[0] if job.status == job.NOT_STARTED: job_manager.active_jobs.remove(job) self.close(False) elif job.status == job.IN_PROGRESS: job.cancel() else: self.close(False) class VideoDirBrowser(Screen): def __init__(self, session, downloadDir): Screen.__init__(self, session) self.skinName = ['VideoDirBrowser', 'FileBrowser'] self['key_red'] = StaticText(_('Cancel')) self['key_green'] = StaticText(_('Use')) if not os.path.exists(downloadDir): downloadDir = '/' self.filelist = FileList(downloadDir, showFiles = False) self['filelist'] = self.filelist self['FilelistActions'] = ActionMap(['SetupActions', 'ColorActions'], { 'cancel': self.cancel, 'red': self.cancel, 'ok': self.ok, 'green': self.use }, -2) self.onLayoutFinish.append(self.layoutFinished) def layoutFinished(self): self.setTitle(_('Please select the download directory')) def ok(self): if self.filelist.canDescent(): self.filelist.descent() def use(self): currentDir = self['filelist'].getCurrentDirectory() dirName = self['filelist'].getFilename() if currentDir is None or \ (self.filelist.canDescent() and dirName and len(dirName) > len(currentDir)): self.close(dirName) def cancel(self): self.close(False)