Changeset 7246 for ipk


Ignore:
Timestamp:
Apr 20, 2011, 6:48:47 PM (15 years ago)
Author:
madie
Message:

[ipk] update mediathek to v2.9

Location:
ipk/source
Files:
4 edited
2 moved

Legend:

Unmodified
Added
Removed
  • ipk/source/mediacenter_mediathek_2_9/CONTROL/control

    r7149 r7246  
    11Package: enigma2-plugin-mediacenter-multimediathek
    2 Version: 2.8
     2Version: 2.9
    33Architecture: sh4
    44OE: MultiMediathek
  • ipk/source/mediacenter_mediathek_2_9/usr/lib/enigma2/python/Plugins/Extensions/MultiMediathek/plugin.py

    r7146 r7246  
    33# Coded by Homey (c) 2011
    44#
    5 # Version: 2.8.2
     5# Version: 2.9
    66# Support: www.i-have-a-dreambox.com
    77#####################################################
     
    6161config.plugins.multimediathek.showadultcontent = ConfigYesNo(default=False)
    6262config.plugins.multimediathek.showsecretcontent = ConfigYesNo(default=False)
    63 config.plugins.multimediathek.version = NoSave(ConfigText(default="282"))
     63config.plugins.multimediathek.version = NoSave(ConfigText(default="290"))
    6464
    6565default = config.plugins.multimediathek.storagepath.value + "/mediathek/movies"
     
    7575class downloadJob(Job):
    7676        def __init__(self, toolbox, cmdline, filename, filetitle):
    77                 Job.__init__(self, _("Download Movie"))
     77                Job.__init__(self, "Download: %s" % filetitle)
    7878                self.filename = filename
    7979                self.toolbox = toolbox
    8080                self.retrycount = 0
    81                 downloadTask(self, cmdline, filename, filetitle)
     81                downloadTask(self, cmdline, filename)
    8282
    8383        def retry(self):
     
    8989                self.abort()
    9090                os_system("rm -f %s" % self.filename)
    91                
     91
    9292class downloadTask(Task):
    9393        ERROR_CORRUPT_FILE, ERROR_RTMP_ReadPacket, ERROR_SEGFAULT, ERROR_SERVER, ERROR_UNKNOWN = range(5)
    94         def __init__(self, job, cmdline, filename, filetitle):
    95                 Task.__init__(self, job, filetitle)
     94        def __init__(self, job, cmdline, filename):
     95                Task.__init__(self, job, _("Downloading ..."))
    9696                self.postconditions.append(downloadTaskPostcondition())
    9797                self.setCmdline(cmdline)
     
    100100                self.error = None
    101101                self.lasterrormsg = None
    102                
     102
    103103        def processOutput(self, data):
    104104                try:
     
    120120        def processOutputLine(self, line):
    121121                line = line[:-1]
    122                 #print "[MultiMediathek DownloadTask STATUS MSG] %s" % line
    123122                self.lasterrormsg = line
    124123                if line.startswith("ERROR:"):
     
    135134                elif line.find("Segmentation fault") != -1:
    136135                        self.error = self.ERROR_SEGFAULT
    137                        
     136
    138137        def afterRun(self):
    139138                pass
     
    182181
    183182        def doEofInternal(self, playing):
    184                 self.leavePlayerConfirmed(True)
     183                currPlay = self.session.nav.getCurrentService()
     184                message = currPlay.info().getInfoString(iServiceInformation.sUser+12)
     185                if message.find('Flash demuxer not available') != -1 or message.find('(AVI) demuxer not available') != -1:
     186                        self.session.openWithCallback(self.GSTplugincallback, MessageBox, _("Your Dreambox can't decode this video stream!\n%s\nDo you want to download and install it now?") % message, MessageBox.TYPE_YESNO)
     187                elif message.find('GStreamer plugin') != -1 and message.find('not available') != -1:
     188                        self.__evPluginError()
     189                else:
     190                        self.leavePlayerConfirmed(True)
    185191
    186192        def showMovies(self):
     
    207213                else:
    208214                        self.session.open(MessageBox, _("Your Dreambox can't decode this video stream!\n%s") % message, type=MessageBox.TYPE_INFO, timeout=20)
     215
     216        def GSTplugincallback(self, answer):
     217                if answer is True:
     218                        self.container=eConsoleAppContainer()
     219                        self.container.appClosed.append(self.finishedPluginInstall)
     220                        self.container.execute("opkg update && opkg install gst-plugin-avi && opkg install gst-plugin-flv && opkg install gst-plugin-rtsp")
     221                else:
     222                        self.close()
     223
     224        def finishedPluginInstall(self,retval):
     225                self.session.openWithCallback(self.restartGUI, MessageBox, _("Missing GStreamer-Plugins were installed!\nDo you want to restart Enigma2 GUI now?"), MessageBox.TYPE_YESNO)
     226
     227        def restartGUI(self, answer):
     228                if answer is True:
     229                        self.session.open(TryQuitMainloop, 3)
    209230
    210231        def VLCcallback(self, answer):
     
    322343                # Get FrameBuffer Scale for ePicLoad()
    323344                sc = AVSwitch().getFramebufferScale()
    324                
     345
    325346                # Init Thumb PicLoad
    326347                self.picload = ePicLoad()
     
    395416
    396417        def finishedPluginUpdate(self,retval):
    397                 self.session.openWithCallback(self.restartGUI, MessageBox,_("Mediathek-Plugin successfully updated!\nDo you want to restart Enigma2 GUI now?"), MessageBox.TYPE_YESNO)
     418                self.session.openWithCallback(self.restartGUI, MessageBox, _("Mediathek-Plugin successfully updated!\nDo you want to restart Enigma2 GUI now?"), MessageBox.TYPE_YESNO)
    398419
    399420        def restartGUI(self, answer):
     
    409430                        if config.plugins.multimediathek.showsecretcontent.value:
    410431                                feedurl = feedurl + "&showsecret=1"
    411                
     432
    412433                if '-->' in feedurl:
    413434                        # Request to download external page
     
    422443                # We send the received page directly to my webserver and parse it there ...
    423444                getPage(url=self.postpageurl, method='POST', headers={'Content-Type':'application/x-www-form-urlencoded'}, postdata=urlencode({'pagedata' : html})).addCallback(self.gotxmlfeed).addErrback(self.getxmlfeedError)
    424                
     445
    425446        def getxmlfeedError(self, error=""):
    426447                self["pageinfo"].setText("Error downloading XML Feed!\n\n" + str(error))
    427448                print error
    428                
     449
    429450        def gotxmlfeed(self, page=""):
    430451                print page
     
    525546                        if self.thumbcount+1 < len(self.Thumbnaillist):
    526547                                self.getThumbnail()
    527                
     548
    528549        def showThumbPixmap(self, picInfo=None):
    529550                ptr = self.picload.getData()
     
    608629
    609630        def key_menu(self):
    610                 if self.feedtitle == "Startseite":
    611                         self.session.openWithCallback(self.loadFrame, MultiMediathek_Settings)
    612                 elif self.itemlist:
     631                if self.itemlist:
    613632                        self.session.openWithCallback(self.loadFrame, MultiMediathek_MenuOptions, self.itemlist[self.index])
    614633
     
    734753                # Get FrameBuffer Scale for ePicLoad()
    735754                sc = AVSwitch().getFramebufferScale()
    736                
     755
    737756                # Init ePicLoad
    738757                self.picload = ePicLoad()
    739758                self.picload.PictureData.get().append(self.showPosterPixmap)
    740759                self.picload.setPara((270, 350, sc[0], sc[1], config.plugins.multimediathek.imagecache.value, int(config.plugins.multimediathek.imagescaling.value), "#00000000"))
    741                
     760
    742761                self.onFirstExecBegin.append(self.GetMovieInfo)
    743762
     
    756775        def keyBlue(self):
    757776                if self.movieinfo is not None:
    758                         os_system("echo 'movie:::%s:::%s:::%s\n' >> /etc/enigma2/multimediathek.bookmarks" % (self.movieinfo[0], self.url, self.movieinfo[3]))
     777                        os_system("echo 'movie:::%s:::%s:::%s' >> /etc/enigma2/multimediathek.bookmarks" % (self.movieinfo[0], self.url, self.movieinfo[3]))
    759778                        self.session.open(MessageBox, _("Bookmark added!"), MessageBox.TYPE_INFO, timeout=5)
    760779
     
    775794                # We send the received page directly to my webserver and parse it there ...
    776795                getPage(url=self.postpageurl, method='POST', headers={'Content-Type':'application/x-www-form-urlencoded'}, postdata=urlencode({'pagedata' : html})).addCallback(self.GotMovieInfo).addErrback(self.error)
    777        
     796
    778797        def GotMovieInfo(self, html):
    779798                self.movieinfo = html.splitlines()
     
    792811                except Exception, error:
    793812                        print "[MultiMediathek] Getting UserAgent String failed. Using default ..."
    794                
     813
    795814                # Download Image
    796815                downloadPage(self.movieinfo[3], self.imagefolder+"/poster.jpg", agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.2) Gecko/2008091620 Firefox/3.0.2").addCallback(self.downloadPosterCallback)
     
    873892                else:
    874893                        self.session.open(MessageBox, _("Sorry, no supported videos found here."), MessageBox.TYPE_ERROR, timeout=10)
    875                        
     894
    876895        def movieSelectCallback(self, movieinfo):
    877896                self.selmovieinfo = movieinfo
     
    884903                                getPage(getpageurl, agent="Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)").addCallback(self.ForwardExternalMovieList).addErrback(self.error)
    885904                                return
    886                        
     905
    887906                        if self.action == "cachedplayback":
    888907                                self.session.open(PlayMovie, movieinfo, self.movieinfo[0], self.useragent)
     
    923942
    924943        def saveMovie(self, title, url, filename, fileid):
    925                 if '(VLC)' in title and VLCSUPPORT:
    926                         try:
    927                                 if vlcServerConfig.getDefaultServer() is None:
    928                                         self.session.open(MessageBox, _("No Default Server configured in VLC Settings"), MessageBox.TYPE_ERROR)
    929                                 else:
    930                                         url = vlcServerConfig.getDefaultServer().playFile(url, 0x44, 0x45)
    931                         except Exception, error:
    932                                 self.session.open(MessageBox,("VLC Plugin Error: %s") % error, MessageBox.TYPE_ERROR)
    933 
    934944                if self.movieinfo[0]:
    935945                        if fileid > 1:
     
    944954                        else:
    945955                                useragentcmd = ""
    946                                
     956
    947957                        JobManager.AddJob(downloadJob(self, "wget %s -c '%s' -O '%s/%s'" % (useragentcmd, url, self.moviefolder, filename), self.moviefolder+"/"+filename, self.movieinfo[0]))
     958                        self.createMetaFile(filename)
    948959                        self.LastJobView()
    949960                elif url[0:4] == "rtmp":
    950961                        JobManager.AddJob(downloadJob(self, "rtmpdump -r '%s' -o '%s/%s' -e" % (url, self.moviefolder, filename), self.moviefolder+"/"+filename, self.movieinfo[0]))
     962                        self.createMetaFile(filename)
    951963                        self.LastJobView()
    952964                else:
     
    961973                        self.session.open(JobView, currentjob)
    962974
     975        def createMetaFile(self, filename):
     976                serviceref = eServiceReference(0x1001, 0, self.moviefolder + filename)
     977                metafile = open("%s/%s.meta" % (self.moviefolder, filename), "w")
     978                metafile.write("%s\n%s\n%s\n%i\n" % (serviceref.toString(), self.movieinfo[0].replace("\n", ""), self.movieinfo[2].replace("\n", ""), time()))
     979                metafile.close()
     980
    963981        def error(self, error):
    964982                self.session.open(MessageBox, _("Unexpected Error:\n%s") % (error), MessageBox.TYPE_ERROR)
     
    973991class PlayMovie(Screen):
    974992        skin = """
    975                 <screen position="center,center" size="400,240" title="Caching Video ..." >
    976                         <widget source="label_filename" transparent="1" render="Label" zPosition="2" position="10,10" size="380,20" font="Regular;19" />
    977                         <widget source="label_destination" transparent="1" render="Label" zPosition="2" position="10,35" size="380,20" font="Regular;19" />
    978                         <widget source="label_speed" transparent="1" render="Label" zPosition="2" position="10,60" size="380,20" font="Regular;19" />
    979                         <widget source="label_timeleft" transparent="1" render="Label" zPosition="2" position="10,85" size="380,20" font="Regular;19" />
    980                         <widget source="label_progress" transparent="1" render="Label" zPosition="2" position="10,110" size="380,20" font="Regular;19" />
    981                         <widget name="activityslider" position="10,150" size="380,30" zPosition="3" transparent="0" />
    982                         <widget name="key_green" position="50,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
    983                         <widget name="key_red" position="200,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
    984                         <ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/green.png" position="50,200" size="140,40" alphatest="on" />
    985                         <ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/red.png" position="200,200" size="140,40" alphatest="on" />
     993                <screen position="center,center" size="450,240" title="Caching Video ..." >
     994                        <widget source="label_filename" transparent="1" render="Label" zPosition="2" position="10,10" size="430,21" font="Regular;19" />
     995                        <widget source="label_destination" transparent="1" render="Label" zPosition="2" position="10,35" size="430,21" font="Regular;19" />
     996                        <widget source="label_speed" transparent="1" render="Label" zPosition="2" position="10,60" size="430,21" font="Regular;19" />
     997                        <widget source="label_timeleft" transparent="1" render="Label" zPosition="2" position="10,85" size="430,21" font="Regular;19" />
     998                        <widget source="label_progress" transparent="1" render="Label" zPosition="2" position="10,110" size="430,21" font="Regular;19" />
     999                        <widget name="activityslider" position="10,150" size="430,30" zPosition="3" transparent="0" />
     1000                        <widget name="key_red" position="10,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
     1001                        <widget name="key_green" position="155,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
     1002                        <widget name="key_blue" position="300,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
     1003                        <ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/red.png" position="10,200" size="140,40" alphatest="on" />
     1004                        <ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/green.png" position="155,200" size="140,40" alphatest="on" />
     1005                        <ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/blue.png" position="300,200" size="140,40" alphatest="on" />
    9861006                </screen>"""
    9871007
     
    9991019
    10001020                self.streamactive = False
     1021                self.isVisible = True
    10011022
    10021023                self.container=eConsoleAppContainer()
     
    10291050                self["key_green"] = Button(_("Play now"))
    10301051                self["key_red"] = Button(_("Cancel"))
     1052                self["key_blue"] = Button(_("Show/Hide"))
    10311053
    10321054                self["label_filename"] = StaticText("File: %s" % (self.filename))
     
    10411063                        "ok": self.okbuttonClick,
    10421064                        "red": self.exit,
    1043                         "green": self.playfile
     1065                        "green": self.playfile,
     1066                        "blue": self.visibility
    10441067                }, -1)
    10451068
     
    10571080
    10581081        def okbuttonClick(self):
    1059                 self.StatusTimer.start(5000, True)
    1060                 self.UpdateStatus()
     1082                if self.isVisible == False:
     1083                        self.visibility()
    10611084
    10621085        def UpdateStatus(self):
     
    11301153        def copyfinished(self,retval):
    11311154                self.streamactive = False
     1155                self.UpdateStatus()
    11321156                self["label_progress"].setText("Progress: 100%")
    11331157                self["activityslider"].setValue(100)
     
    11441168
    11451169        def MoviePlayerCallback(self, response=None):
     1170                if self.isVisible == False:
     1171                        self.visibility()
    11461172                self.UpdateStatus()
    11471173                if response is not None and VLCSUPPORT:
     
    11641190                return retstr
    11651191
     1192        def visibility(self):
     1193                if self.isVisible == True:
     1194                        self.isVisible = False
     1195                        self.hide()
     1196                else:
     1197                        self.isVisible = True
     1198                        self.show()
     1199
    11661200        def exit(self, retval=None):
     1201                if self.isVisible == False:
     1202                        self.visibility()
     1203                        return
     1204
    11671205                self.container.kill()
    11681206                self.BgFileEraser.erase(self.destination + self.filename)
     
    12191257                                        tmpfile = open(bookmarkfile, "r")
    12201258                                        for line in tmpfile:
    1221                                                 if self.movieinfo[5] not in line:
    1222                                                         tmpdata = tmpdata + line + "\n"
    1223 
     1259                                                if self.movieinfo[5] not in line and line != "\n":
     1260                                                        tmpdata = tmpdata + line
    12241261                                        tmpfile.close()
    12251262                                        os_system("echo '%s' > %s" % (tmpdata,bookmarkfile))
     
    12471284                Screen.__init__(self, session)
    12481285                self.session = session
    1249                
     1286
    12501287                self.skin = """
    1251                         <screen name="MediathekTasksScreen" position="center,center" size="700,550" title="Mediathek - Active Downloads">
    1252                                 <widget source="tasklist" render="Listbox" position="30,120" size="640,370" zPosition="7" scrollbarMode="showOnDemand" transparent="1" >
     1288                        <screen name="MediathekTasksScreen" position="center,center" size="700,550" title="Video Download List">
     1289                                <widget source="movielist" render="Listbox" position="10,50" size="680,450" zPosition="7" scrollbarMode="showOnDemand" transparent="1" >
    12531290                                        <convert type="TemplatedMultiContent">
    12541291                                                {"template": [
    1255                                                                 MultiContentEntryText(pos = (0, 1), size = (200, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the name
    1256                                                                 MultiContentEntryText(pos = (210, 1), size = (150, 24), font=1, flags = RT_HALIGN_RIGHT, text = 2), # index 2 is the state
    1257                                                                 MultiContentEntryProgress(pos = (370, 1), size = (100, 24), percent = -3), # index 3 should be progress
    1258                                                                 MultiContentEntryText(pos = (480, 1), size = (100, 24), font=1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 is the percentage
     1292                                                                MultiContentEntryText(pos = (0, 1), size = (310, 28), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the name
     1293                                                                MultiContentEntryText(pos = (320, 1), size = (150, 28), font=1, flags = RT_HALIGN_RIGHT, text = 2), # index 2 is the state
     1294                                                                MultiContentEntryProgress(pos = (480, 1), size = (100, 28), percent = -3), # index 3 should be progress
     1295                                                                MultiContentEntryText(pos = (590, 1), size = (60, 28), font=1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 is the percentage
    12591296                                                        ],
    1260                                                 "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
    1261                                                 "itemHeight": 25
     1297                                                "fonts": [gFont("Regular", 26),gFont("Regular", 22)],
     1298                                                "itemHeight": 29
    12621299                                                }
    12631300                                        </convert>
    12641301                                </widget>
    1265                                 <ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
    1266                                 <widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
    12671302                        </screen>"""
    1268                
    1269                 self["shortcuts"] = ActionMap(["SetupActions", "ColorActions"],
     1303
     1304                self["shortcuts"] = ActionMap(["OkCancelActions"],
    12701305                {
    12711306                        "ok": self.keyOK,
    1272                         "cancel": self.keyClose,
    1273                         "red": self.keyClose
     1307                        "cancel": self.keyClose
    12741308                }, -1)
    12751309
    1276                 self["tasklist"] = List([])
     1310                self["movielist"] = List([])
    12771311                self["key_red"] = Button(_("Close"))
    1278                
     1312
    12791313                self.Timer = eTimer()
    12801314                self.Timer.callback.append(self.TimerFire)
     
    12821316                self.onLayoutFinish.append(self.layoutFinished)
    12831317                self.onClose.append(self.__onClose)
    1284                
     1318
    12851319        def __onClose(self):
    12861320                del self.Timer
     
    12911325        def TimerFire(self):
    12921326                self.Timer.stop()
    1293                 self.rebuildTaskList()
    1294        
    1295         def rebuildTaskList(self):
    1296                 self.tasklist = []
     1327                self.rebuildMovieList()
     1328
     1329        def rebuildMovieList(self):
     1330                self.movielist = []
     1331
     1332                self.getTaskList()
     1333                self.getMovieList()
     1334
     1335                self['movielist'].setList(self.movielist)
     1336                self['movielist'].updateList(self.movielist)
     1337
     1338
     1339        def getTaskList(self):
    12971340                for job in JobManager.getPendingJobs():
    1298                         self.tasklist.append((job, job.name, job.getStatustext(), int(100*job.progress/float(job.end)) ,str(100*job.progress/float(job.end)) + "%" ))
    1299                 self['tasklist'].setList(self.tasklist)
    1300                 self['tasklist'].updateList(self.tasklist)
    1301                 self.Timer.startLongTimer(2)
     1341                        self.movielist.append((job, job.name, job.getStatustext(), int(100*job.progress/float(job.end)) ,str(100*job.progress/float(job.end)) + "%" ))
     1342
     1343                if len(self.movielist) >= 1:
     1344                        self.Timer.startLongTimer(10)
     1345
     1346        def getMovieList(self):
     1347                filelist = os_listdir(config.plugins.multimediathek.moviedir.value)
     1348                if filelist is not None:
     1349                        filelist.sort()
     1350                        for filename in filelist:
     1351                                if os_path.isfile(config.plugins.multimediathek.moviedir.value + "/" + filename) and filename.endswith(".meta") is False:
     1352                                        self.movielist.append(("movie", filename, _("Finished"), 100, "100%"))
    13021353
    13031354        def keyOK(self):
    1304                 current = self["tasklist"].getCurrent()
     1355                current = self["movielist"].getCurrent()
    13051356                if current:
    1306                         job = current[0]
    1307                         self.session.openWithCallback(self.JobViewCB, JobView, job)
    1308        
     1357                        if current[0] == "movie":
     1358                                sref = eServiceReference(0x1001, 0, config.plugins.multimediathek.moviedir.value + "/" + current[1])
     1359                                sref.setName(current[1])
     1360                                self.session.open(MediathekMoviePlayer, sref)
     1361                        else:
     1362                                job = current[0]
     1363                                self.session.openWithCallback(self.JobViewCB, JobView, job)
     1364
    13091365        def JobViewCB(self, why):
    13101366                pass
     
    13551411                self.cfglist.append(getConfigListEntry(_("Thumbnail Scaler:"), config.plugins.multimediathek.imagescaler))
    13561412                self.cfglist.append(getConfigListEntry(_("Show Adult Content:"), config.plugins.multimediathek.showadultcontent))
    1357                 #self.cfglist.append(getConfigListEntry(_("Show Secret Content:"), config.plugins.multimediathek.showsecretcontent))
     1413                self.cfglist.append(getConfigListEntry(_("Show Secret Content:"), config.plugins.multimediathek.showsecretcontent))
    13581414                self.cfglist.append(getConfigListEntry(_("Download Directory:"), config.plugins.multimediathek.moviedir))
    13591415                self.cfglist.append(getConfigListEntry(_("Cache Folder:"), config.plugins.multimediathek.storagepath))
  • ipk/source/swapmediacenter_mediathek_2_9/CONTROL/control

    r7149 r7246  
    11Package: enigma2-plugin-swapmediacenter-multimediathek
    2 Version: 2.8
     2Version: 2.9
    33Architecture: sh4
    44OE: MultiMediathek
  • ipk/source/swapmediacenter_mediathek_2_9/var/swap/extensions/MultiMediathek/plugin.py

    r7146 r7246  
    33# Coded by Homey (c) 2011
    44#
    5 # Version: 2.8.2
     5# Version: 2.9
    66# Support: www.i-have-a-dreambox.com
    77#####################################################
     
    6161config.plugins.multimediathek.showadultcontent = ConfigYesNo(default=False)
    6262config.plugins.multimediathek.showsecretcontent = ConfigYesNo(default=False)
    63 config.plugins.multimediathek.version = NoSave(ConfigText(default="282"))
     63config.plugins.multimediathek.version = NoSave(ConfigText(default="290"))
    6464
    6565default = config.plugins.multimediathek.storagepath.value + "/mediathek/movies"
     
    7575class downloadJob(Job):
    7676        def __init__(self, toolbox, cmdline, filename, filetitle):
    77                 Job.__init__(self, _("Download Movie"))
     77                Job.__init__(self, "Download: %s" % filetitle)
    7878                self.filename = filename
    7979                self.toolbox = toolbox
    8080                self.retrycount = 0
    81                 downloadTask(self, cmdline, filename, filetitle)
     81                downloadTask(self, cmdline, filename)
    8282
    8383        def retry(self):
     
    8989                self.abort()
    9090                os_system("rm -f %s" % self.filename)
    91                
     91
    9292class downloadTask(Task):
    9393        ERROR_CORRUPT_FILE, ERROR_RTMP_ReadPacket, ERROR_SEGFAULT, ERROR_SERVER, ERROR_UNKNOWN = range(5)
    94         def __init__(self, job, cmdline, filename, filetitle):
    95                 Task.__init__(self, job, filetitle)
     94        def __init__(self, job, cmdline, filename):
     95                Task.__init__(self, job, _("Downloading ..."))
    9696                self.postconditions.append(downloadTaskPostcondition())
    9797                self.setCmdline(cmdline)
     
    100100                self.error = None
    101101                self.lasterrormsg = None
    102                
     102
    103103        def processOutput(self, data):
    104104                try:
     
    120120        def processOutputLine(self, line):
    121121                line = line[:-1]
    122                 #print "[MultiMediathek DownloadTask STATUS MSG] %s" % line
    123122                self.lasterrormsg = line
    124123                if line.startswith("ERROR:"):
     
    135134                elif line.find("Segmentation fault") != -1:
    136135                        self.error = self.ERROR_SEGFAULT
    137                        
     136
    138137        def afterRun(self):
    139138                pass
     
    182181
    183182        def doEofInternal(self, playing):
    184                 self.leavePlayerConfirmed(True)
     183                currPlay = self.session.nav.getCurrentService()
     184                message = currPlay.info().getInfoString(iServiceInformation.sUser+12)
     185                if message.find('Flash demuxer not available') != -1 or message.find('(AVI) demuxer not available') != -1:
     186                        self.session.openWithCallback(self.GSTplugincallback, MessageBox, _("Your Dreambox can't decode this video stream!\n%s\nDo you want to download and install it now?") % message, MessageBox.TYPE_YESNO)
     187                elif message.find('GStreamer plugin') != -1 and message.find('not available') != -1:
     188                        self.__evPluginError()
     189                else:
     190                        self.leavePlayerConfirmed(True)
    185191
    186192        def showMovies(self):
     
    207213                else:
    208214                        self.session.open(MessageBox, _("Your Dreambox can't decode this video stream!\n%s") % message, type=MessageBox.TYPE_INFO, timeout=20)
     215
     216        def GSTplugincallback(self, answer):
     217                if answer is True:
     218                        self.container=eConsoleAppContainer()
     219                        self.container.appClosed.append(self.finishedPluginInstall)
     220                        self.container.execute("opkg update && opkg install gst-plugin-avi && opkg install gst-plugin-flv && opkg install gst-plugin-rtsp")
     221                else:
     222                        self.close()
     223
     224        def finishedPluginInstall(self,retval):
     225                self.session.openWithCallback(self.restartGUI, MessageBox, _("Missing GStreamer-Plugins were installed!\nDo you want to restart Enigma2 GUI now?"), MessageBox.TYPE_YESNO)
     226
     227        def restartGUI(self, answer):
     228                if answer is True:
     229                        self.session.open(TryQuitMainloop, 3)
    209230
    210231        def VLCcallback(self, answer):
     
    322343                # Get FrameBuffer Scale for ePicLoad()
    323344                sc = AVSwitch().getFramebufferScale()
    324                
     345
    325346                # Init Thumb PicLoad
    326347                self.picload = ePicLoad()
     
    395416
    396417        def finishedPluginUpdate(self,retval):
    397                 self.session.openWithCallback(self.restartGUI, MessageBox,_("Mediathek-Plugin successfully updated!\nDo you want to restart Enigma2 GUI now?"), MessageBox.TYPE_YESNO)
     418                self.session.openWithCallback(self.restartGUI, MessageBox, _("Mediathek-Plugin successfully updated!\nDo you want to restart Enigma2 GUI now?"), MessageBox.TYPE_YESNO)
    398419
    399420        def restartGUI(self, answer):
     
    409430                        if config.plugins.multimediathek.showsecretcontent.value:
    410431                                feedurl = feedurl + "&showsecret=1"
    411                
     432
    412433                if '-->' in feedurl:
    413434                        # Request to download external page
     
    422443                # We send the received page directly to my webserver and parse it there ...
    423444                getPage(url=self.postpageurl, method='POST', headers={'Content-Type':'application/x-www-form-urlencoded'}, postdata=urlencode({'pagedata' : html})).addCallback(self.gotxmlfeed).addErrback(self.getxmlfeedError)
    424                
     445
    425446        def getxmlfeedError(self, error=""):
    426447                self["pageinfo"].setText("Error downloading XML Feed!\n\n" + str(error))
    427448                print error
    428                
     449
    429450        def gotxmlfeed(self, page=""):
    430451                print page
     
    525546                        if self.thumbcount+1 < len(self.Thumbnaillist):
    526547                                self.getThumbnail()
    527                
     548
    528549        def showThumbPixmap(self, picInfo=None):
    529550                ptr = self.picload.getData()
     
    608629
    609630        def key_menu(self):
    610                 if self.feedtitle == "Startseite":
    611                         self.session.openWithCallback(self.loadFrame, MultiMediathek_Settings)
    612                 elif self.itemlist:
     631                if self.itemlist:
    613632                        self.session.openWithCallback(self.loadFrame, MultiMediathek_MenuOptions, self.itemlist[self.index])
    614633
     
    734753                # Get FrameBuffer Scale for ePicLoad()
    735754                sc = AVSwitch().getFramebufferScale()
    736                
     755
    737756                # Init ePicLoad
    738757                self.picload = ePicLoad()
    739758                self.picload.PictureData.get().append(self.showPosterPixmap)
    740759                self.picload.setPara((270, 350, sc[0], sc[1], config.plugins.multimediathek.imagecache.value, int(config.plugins.multimediathek.imagescaling.value), "#00000000"))
    741                
     760
    742761                self.onFirstExecBegin.append(self.GetMovieInfo)
    743762
     
    756775        def keyBlue(self):
    757776                if self.movieinfo is not None:
    758                         os_system("echo 'movie:::%s:::%s:::%s\n' >> /etc/enigma2/multimediathek.bookmarks" % (self.movieinfo[0], self.url, self.movieinfo[3]))
     777                        os_system("echo 'movie:::%s:::%s:::%s' >> /etc/enigma2/multimediathek.bookmarks" % (self.movieinfo[0], self.url, self.movieinfo[3]))
    759778                        self.session.open(MessageBox, _("Bookmark added!"), MessageBox.TYPE_INFO, timeout=5)
    760779
     
    775794                # We send the received page directly to my webserver and parse it there ...
    776795                getPage(url=self.postpageurl, method='POST', headers={'Content-Type':'application/x-www-form-urlencoded'}, postdata=urlencode({'pagedata' : html})).addCallback(self.GotMovieInfo).addErrback(self.error)
    777        
     796
    778797        def GotMovieInfo(self, html):
    779798                self.movieinfo = html.splitlines()
     
    792811                except Exception, error:
    793812                        print "[MultiMediathek] Getting UserAgent String failed. Using default ..."
    794                
     813
    795814                # Download Image
    796815                downloadPage(self.movieinfo[3], self.imagefolder+"/poster.jpg", agent="Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.2) Gecko/2008091620 Firefox/3.0.2").addCallback(self.downloadPosterCallback)
     
    873892                else:
    874893                        self.session.open(MessageBox, _("Sorry, no supported videos found here."), MessageBox.TYPE_ERROR, timeout=10)
    875                        
     894
    876895        def movieSelectCallback(self, movieinfo):
    877896                self.selmovieinfo = movieinfo
     
    884903                                getPage(getpageurl, agent="Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)").addCallback(self.ForwardExternalMovieList).addErrback(self.error)
    885904                                return
    886                        
     905
    887906                        if self.action == "cachedplayback":
    888907                                self.session.open(PlayMovie, movieinfo, self.movieinfo[0], self.useragent)
     
    923942
    924943        def saveMovie(self, title, url, filename, fileid):
    925                 if '(VLC)' in title and VLCSUPPORT:
    926                         try:
    927                                 if vlcServerConfig.getDefaultServer() is None:
    928                                         self.session.open(MessageBox, _("No Default Server configured in VLC Settings"), MessageBox.TYPE_ERROR)
    929                                 else:
    930                                         url = vlcServerConfig.getDefaultServer().playFile(url, 0x44, 0x45)
    931                         except Exception, error:
    932                                 self.session.open(MessageBox,("VLC Plugin Error: %s") % error, MessageBox.TYPE_ERROR)
    933 
    934944                if self.movieinfo[0]:
    935945                        if fileid > 1:
     
    944954                        else:
    945955                                useragentcmd = ""
    946                                
     956
    947957                        JobManager.AddJob(downloadJob(self, "wget %s -c '%s' -O '%s/%s'" % (useragentcmd, url, self.moviefolder, filename), self.moviefolder+"/"+filename, self.movieinfo[0]))
     958                        self.createMetaFile(filename)
    948959                        self.LastJobView()
    949960                elif url[0:4] == "rtmp":
    950961                        JobManager.AddJob(downloadJob(self, "rtmpdump -r '%s' -o '%s/%s' -e" % (url, self.moviefolder, filename), self.moviefolder+"/"+filename, self.movieinfo[0]))
     962                        self.createMetaFile(filename)
    951963                        self.LastJobView()
    952964                else:
     
    961973                        self.session.open(JobView, currentjob)
    962974
     975        def createMetaFile(self, filename):
     976                serviceref = eServiceReference(0x1001, 0, self.moviefolder + filename)
     977                metafile = open("%s/%s.meta" % (self.moviefolder, filename), "w")
     978                metafile.write("%s\n%s\n%s\n%i\n" % (serviceref.toString(), self.movieinfo[0].replace("\n", ""), self.movieinfo[2].replace("\n", ""), time()))
     979                metafile.close()
     980
    963981        def error(self, error):
    964982                self.session.open(MessageBox, _("Unexpected Error:\n%s") % (error), MessageBox.TYPE_ERROR)
     
    973991class PlayMovie(Screen):
    974992        skin = """
    975                 <screen position="center,center" size="400,240" title="Caching Video ..." >
    976                         <widget source="label_filename" transparent="1" render="Label" zPosition="2" position="10,10" size="380,20" font="Regular;19" />
    977                         <widget source="label_destination" transparent="1" render="Label" zPosition="2" position="10,35" size="380,20" font="Regular;19" />
    978                         <widget source="label_speed" transparent="1" render="Label" zPosition="2" position="10,60" size="380,20" font="Regular;19" />
    979                         <widget source="label_timeleft" transparent="1" render="Label" zPosition="2" position="10,85" size="380,20" font="Regular;19" />
    980                         <widget source="label_progress" transparent="1" render="Label" zPosition="2" position="10,110" size="380,20" font="Regular;19" />
    981                         <widget name="activityslider" position="10,150" size="380,30" zPosition="3" transparent="0" />
    982                         <widget name="key_green" position="50,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
    983                         <widget name="key_red" position="200,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#9f1313" transparent="1" />
    984                         <ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/green.png" position="50,200" size="140,40" alphatest="on" />
    985                         <ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/red.png" position="200,200" size="140,40" alphatest="on" />
     993                <screen position="center,center" size="450,240" title="Caching Video ..." >
     994                        <widget source="label_filename" transparent="1" render="Label" zPosition="2" position="10,10" size="430,21" font="Regular;19" />
     995                        <widget source="label_destination" transparent="1" render="Label" zPosition="2" position="10,35" size="430,21" font="Regular;19" />
     996                        <widget source="label_speed" transparent="1" render="Label" zPosition="2" position="10,60" size="430,21" font="Regular;19" />
     997                        <widget source="label_timeleft" transparent="1" render="Label" zPosition="2" position="10,85" size="430,21" font="Regular;19" />
     998                        <widget source="label_progress" transparent="1" render="Label" zPosition="2" position="10,110" size="430,21" font="Regular;19" />
     999                        <widget name="activityslider" position="10,150" size="430,30" zPosition="3" transparent="0" />
     1000                        <widget name="key_red" position="10,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
     1001                        <widget name="key_green" position="155,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
     1002                        <widget name="key_blue" position="300,200" zPosition="1" size="140,40" font="Regular;20" halign="center" valign="center" backgroundColor="#1f771f" transparent="1" />
     1003                        <ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/red.png" position="10,200" size="140,40" alphatest="on" />
     1004                        <ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/green.png" position="155,200" size="140,40" alphatest="on" />
     1005                        <ePixmap pixmap="/usr/share/enigma2/skin_default/buttons/blue.png" position="300,200" size="140,40" alphatest="on" />
    9861006                </screen>"""
    9871007
     
    9991019
    10001020                self.streamactive = False
     1021                self.isVisible = True
    10011022
    10021023                self.container=eConsoleAppContainer()
     
    10291050                self["key_green"] = Button(_("Play now"))
    10301051                self["key_red"] = Button(_("Cancel"))
     1052                self["key_blue"] = Button(_("Show/Hide"))
    10311053
    10321054                self["label_filename"] = StaticText("File: %s" % (self.filename))
     
    10411063                        "ok": self.okbuttonClick,
    10421064                        "red": self.exit,
    1043                         "green": self.playfile
     1065                        "green": self.playfile,
     1066                        "blue": self.visibility
    10441067                }, -1)
    10451068
     
    10571080
    10581081        def okbuttonClick(self):
    1059                 self.StatusTimer.start(5000, True)
    1060                 self.UpdateStatus()
     1082                if self.isVisible == False:
     1083                        self.visibility()
    10611084
    10621085        def UpdateStatus(self):
     
    11301153        def copyfinished(self,retval):
    11311154                self.streamactive = False
     1155                self.UpdateStatus()
    11321156                self["label_progress"].setText("Progress: 100%")
    11331157                self["activityslider"].setValue(100)
     
    11441168
    11451169        def MoviePlayerCallback(self, response=None):
     1170                if self.isVisible == False:
     1171                        self.visibility()
    11461172                self.UpdateStatus()
    11471173                if response is not None and VLCSUPPORT:
     
    11641190                return retstr
    11651191
     1192        def visibility(self):
     1193                if self.isVisible == True:
     1194                        self.isVisible = False
     1195                        self.hide()
     1196                else:
     1197                        self.isVisible = True
     1198                        self.show()
     1199
    11661200        def exit(self, retval=None):
     1201                if self.isVisible == False:
     1202                        self.visibility()
     1203                        return
     1204
    11671205                self.container.kill()
    11681206                self.BgFileEraser.erase(self.destination + self.filename)
     
    12191257                                        tmpfile = open(bookmarkfile, "r")
    12201258                                        for line in tmpfile:
    1221                                                 if self.movieinfo[5] not in line:
    1222                                                         tmpdata = tmpdata + line + "\n"
    1223 
     1259                                                if self.movieinfo[5] not in line and line != "\n":
     1260                                                        tmpdata = tmpdata + line
    12241261                                        tmpfile.close()
    12251262                                        os_system("echo '%s' > %s" % (tmpdata,bookmarkfile))
     
    12471284                Screen.__init__(self, session)
    12481285                self.session = session
    1249                
     1286
    12501287                self.skin = """
    1251                         <screen name="MediathekTasksScreen" position="center,center" size="700,550" title="Mediathek - Active Downloads">
    1252                                 <widget source="tasklist" render="Listbox" position="30,120" size="640,370" zPosition="7" scrollbarMode="showOnDemand" transparent="1" >
     1288                        <screen name="MediathekTasksScreen" position="center,center" size="700,550" title="Video Download List">
     1289                                <widget source="movielist" render="Listbox" position="10,50" size="680,450" zPosition="7" scrollbarMode="showOnDemand" transparent="1" >
    12531290                                        <convert type="TemplatedMultiContent">
    12541291                                                {"template": [
    1255                                                                 MultiContentEntryText(pos = (0, 1), size = (200, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the name
    1256                                                                 MultiContentEntryText(pos = (210, 1), size = (150, 24), font=1, flags = RT_HALIGN_RIGHT, text = 2), # index 2 is the state
    1257                                                                 MultiContentEntryProgress(pos = (370, 1), size = (100, 24), percent = -3), # index 3 should be progress
    1258                                                                 MultiContentEntryText(pos = (480, 1), size = (100, 24), font=1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 is the percentage
     1292                                                                MultiContentEntryText(pos = (0, 1), size = (310, 28), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the name
     1293                                                                MultiContentEntryText(pos = (320, 1), size = (150, 28), font=1, flags = RT_HALIGN_RIGHT, text = 2), # index 2 is the state
     1294                                                                MultiContentEntryProgress(pos = (480, 1), size = (100, 28), percent = -3), # index 3 should be progress
     1295                                                                MultiContentEntryText(pos = (590, 1), size = (60, 28), font=1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 is the percentage
    12591296                                                        ],
    1260                                                 "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
    1261                                                 "itemHeight": 25
     1297                                                "fonts": [gFont("Regular", 26),gFont("Regular", 22)],
     1298                                                "itemHeight": 29
    12621299                                                }
    12631300                                        </convert>
    12641301                                </widget>
    1265                                 <ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
    1266                                 <widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
    12671302                        </screen>"""
    1268                
    1269                 self["shortcuts"] = ActionMap(["SetupActions", "ColorActions"],
     1303
     1304                self["shortcuts"] = ActionMap(["OkCancelActions"],
    12701305                {
    12711306                        "ok": self.keyOK,
    1272                         "cancel": self.keyClose,
    1273                         "red": self.keyClose
     1307                        "cancel": self.keyClose
    12741308                }, -1)
    12751309
    1276                 self["tasklist"] = List([])
     1310                self["movielist"] = List([])
    12771311                self["key_red"] = Button(_("Close"))
    1278                
     1312
    12791313                self.Timer = eTimer()
    12801314                self.Timer.callback.append(self.TimerFire)
     
    12821316                self.onLayoutFinish.append(self.layoutFinished)
    12831317                self.onClose.append(self.__onClose)
    1284                
     1318
    12851319        def __onClose(self):
    12861320                del self.Timer
     
    12911325        def TimerFire(self):
    12921326                self.Timer.stop()
    1293                 self.rebuildTaskList()
    1294        
    1295         def rebuildTaskList(self):
    1296                 self.tasklist = []
     1327                self.rebuildMovieList()
     1328
     1329        def rebuildMovieList(self):
     1330                self.movielist = []
     1331
     1332                self.getTaskList()
     1333                self.getMovieList()
     1334
     1335                self['movielist'].setList(self.movielist)
     1336                self['movielist'].updateList(self.movielist)
     1337
     1338
     1339        def getTaskList(self):
    12971340                for job in JobManager.getPendingJobs():
    1298                         self.tasklist.append((job, job.name, job.getStatustext(), int(100*job.progress/float(job.end)) ,str(100*job.progress/float(job.end)) + "%" ))
    1299                 self['tasklist'].setList(self.tasklist)
    1300                 self['tasklist'].updateList(self.tasklist)
    1301                 self.Timer.startLongTimer(2)
     1341                        self.movielist.append((job, job.name, job.getStatustext(), int(100*job.progress/float(job.end)) ,str(100*job.progress/float(job.end)) + "%" ))
     1342
     1343                if len(self.movielist) >= 1:
     1344                        self.Timer.startLongTimer(10)
     1345
     1346        def getMovieList(self):
     1347                filelist = os_listdir(config.plugins.multimediathek.moviedir.value)
     1348                if filelist is not None:
     1349                        filelist.sort()
     1350                        for filename in filelist:
     1351                                if os_path.isfile(config.plugins.multimediathek.moviedir.value + "/" + filename) and filename.endswith(".meta") is False:
     1352                                        self.movielist.append(("movie", filename, _("Finished"), 100, "100%"))
    13021353
    13031354        def keyOK(self):
    1304                 current = self["tasklist"].getCurrent()
     1355                current = self["movielist"].getCurrent()
    13051356                if current:
    1306                         job = current[0]
    1307                         self.session.openWithCallback(self.JobViewCB, JobView, job)
    1308        
     1357                        if current[0] == "movie":
     1358                                sref = eServiceReference(0x1001, 0, config.plugins.multimediathek.moviedir.value + "/" + current[1])
     1359                                sref.setName(current[1])
     1360                                self.session.open(MediathekMoviePlayer, sref)
     1361                        else:
     1362                                job = current[0]
     1363                                self.session.openWithCallback(self.JobViewCB, JobView, job)
     1364
    13091365        def JobViewCB(self, why):
    13101366                pass
     
    13551411                self.cfglist.append(getConfigListEntry(_("Thumbnail Scaler:"), config.plugins.multimediathek.imagescaler))
    13561412                self.cfglist.append(getConfigListEntry(_("Show Adult Content:"), config.plugins.multimediathek.showadultcontent))
    1357                 #self.cfglist.append(getConfigListEntry(_("Show Secret Content:"), config.plugins.multimediathek.showsecretcontent))
     1413                self.cfglist.append(getConfigListEntry(_("Show Secret Content:"), config.plugins.multimediathek.showsecretcontent))
    13581414                self.cfglist.append(getConfigListEntry(_("Download Directory:"), config.plugins.multimediathek.moviedir))
    13591415                self.cfglist.append(getConfigListEntry(_("Cache Folder:"), config.plugins.multimediathek.storagepath))
Note: See TracChangeset for help on using the changeset viewer.