/[projects]/misc/xbmc/plugin.video.todic/default.py
ViewVC logotype

Diff of /misc/xbmc/plugin.video.todic/default.py

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3244 by torben, Mon Feb 18 17:38:13 2019 UTC revision 3261 by torben, Fri Feb 19 21:39:29 2021 UTC
# Line 3  Line 3 
3    
4  '''  '''
5      Todic plugin for XBMC      Todic plugin for XBMC
6      Version 1.7.1      Version 1.9.0
7  '''  '''
8    
9  import sys  import sys
# Line 13  import os Line 13  import os
13  import xbmc  import xbmc
14  import xbmcaddon  import xbmcaddon
15  import xbmcgui  import xbmcgui
16    import xbmcvfs
17  import xbmcplugin  import xbmcplugin
18  import urllib  import urllib
19  import urllib2  import urllib.request
20    
21  # import pprint  # import pprint
22    
# Line 27  __key__ = __addon__.getSetting('xbmckey' Line 28  __key__ = __addon__.getSetting('xbmckey'
28  __entrypoint__ = __addon__.getSetting('entrypoint').lower()  __entrypoint__ = __addon__.getSetting('entrypoint').lower()
29  __backend__ = "https://todic.dk/xbmc.php?xbmckey=" + __key__  __backend__ = "https://todic.dk/xbmc.php?xbmckey=" + __key__
30    
31    
32  if __entrypoint__ == "alternative":  if __entrypoint__ == "alternative":
33          __backend__ = "https://alt.todic.dk/xbmc.php?xbmckey=" + __key__      __backend__ = "https://alt.todic.dk/xbmc.php?xbmckey=" + __key__
34    
35  if __entrypoint__ == "testing":  if __entrypoint__ == "testing":
36          __backend__ = "https://todic.dk/xbmc-beta.php?xbmckey=" + __key__      __backend__ = "https://todic.dk/xbmc-beta.php?xbmckey=" + __key__
           
 print "[Todic] entrypoint: " + __entrypoint__  
 print "[Todic] backend: " + __backend__  
37    
38    print( "[Todic] entrypoint: " + __entrypoint__ )
39    print( "[Todic] backend: " + __backend__ )
40    print( "[Todic] version: " + __addon__.getAddonInfo('version') )
41    
42  fanartImage = os.path.join(__addon__.getAddonInfo('path'), 'movie_bg_blur.jpg')  fanartImage = os.path.join(__addon__.getAddonInfo('path'), 'movie_bg_blur.jpg')
43  datapath = xbmc.translatePath(  datapath = xbmcvfs.translatePath(
44      'special://profile/addon_data/plugin.video.todic/')      'special://profile/addon_data/plugin.video.todic/')
45    
46  ADDON_PATH = __addon__.getAddonInfo('path')  ADDON_PATH = __addon__.getAddonInfo('path')
# Line 57  class TodicMovieDialog(xbmcgui.WindowXML Line 59  class TodicMovieDialog(xbmcgui.WindowXML
59          self.position = 0          self.position = 0
60    
61      def onClick(self, controlId):      def onClick(self, controlId):
62          print "[Todic] MovieDialog OnClick: " + str(controlId)          print( "[Todic] MovieDialog OnClick: " + str(controlId) )
63    
64          if (controlId == 50):          if (controlId == 50):
65              self.close()              self.close()
# Line 72  class TodicMovieDialog(xbmcgui.WindowXML Line 74  class TodicMovieDialog(xbmcgui.WindowXML
74    
75      def onInit(self):      def onInit(self):
76    
77          print "[Todic] MovieDialog onInit"          print( "[Todic] MovieDialog onInit" )
78          self.getControl(1).setLabel(self.name)          self.getControl(1).setLabel(self.name)
79          self.getControl(2).setLabel(self.moviegroups)          self.getControl(2).setLabel(self.moviegroups)
80          self.getControl(3).setLabel(self.description)          self.getControl(3).setLabel(self.description)
# Line 93  class TodicMovieDialog(xbmcgui.WindowXML Line 95  class TodicMovieDialog(xbmcgui.WindowXML
95          #self.getControl(40).setWidth(int(self.starwidth))          #self.getControl(40).setWidth(int(self.starwidth))
96    
97      def setDetailsDoc(self, detailsDoc):      def setDetailsDoc(self, detailsDoc):
98          print "[Todic] MovieDialog setDetailsDoc:"          print( "[Todic] MovieDialog setDetailsDoc:")
99          self.imdbrating = getText(detailsDoc.getElementsByTagName("imdbrating"))          self.imdbrating = getText(detailsDoc.getElementsByTagName("imdbrating"))
100          self.moviegroups = getText(detailsDoc.getElementsByTagName("moviegroups"))          self.moviegroups = getText(detailsDoc.getElementsByTagName("moviegroups"))
101          self.playlength = getText(detailsDoc.getElementsByTagName("playlength"))          self.playlength = getText(detailsDoc.getElementsByTagName("playlength"))
# Line 119  class TodicPlayer(xbmc.Player): Line 121  class TodicPlayer(xbmc.Player):
121          self.started = False          self.started = False
122          self.playingPosition = 0.0          self.playingPosition = 0.0
123          self.lastReport = 0          self.lastReport = 0
124          print "[TodicPlayer] init"          print( "[TodicPlayer] init")
125    
126      def onPlayBackStarted(self):      def onPlayBackStarted(self):
127          self.started = True          self.started = True
128          print "[TodicPlayer] : started"          print( "[TodicPlayer] : started")
129    
130      #When user presses stop, we report back the the position registered in the last call to self.tick()      #When user presses stop, we report back the the position registered in the last call to self.tick()
131      def onPlayBackStopped(self):      def onPlayBackStopped(self):
132          self.stopped = True          self.stopped = True
133          print "[TodicPlayer] : stopped"          print( "[TodicPlayer] : stopped")
134          self.reportPlaytime("stopped")          self.reportPlaytime("stopped")
135    
136      def onPlayBackPaused(self):      def onPlayBackPaused(self):
137          print "[TodicPlayer] : paused"          print( "[TodicPlayer] : paused")
138          self.reportPlaytime("paused")          self.reportPlaytime("paused")
139    
140      def onPlayBackResumed(self):      def onPlayBackResumed(self):
141          print "[TodicPlayer] : resumed"          print( "[TodicPlayer] : resumed")
142          self.reportPlaytime("resumed")          self.reportPlaytime("resumed")
143    
144    
145      def onPlayBackEnded(self):      def onPlayBackEnded(self):
146          self.stopped = True          self.stopped = True
147          print "[TodicPlayer] : ended"          print( "[TodicPlayer] : ended")
148          self.reportPlaytime("ended")          self.reportPlaytime("ended")
149    
150      def tick(self):      def tick(self):
151          #print "[Todic] Tick: " + str( self.isPlaying() )          #print( "[Todic] Tick: " + str( self.isPlaying() ) )
152          if ( self.isPlaying() ):          if ( self.isPlaying() ):
153              tmpTime = self.getTime():              tmpTime = self.getTime()
154    
155              #only report time if it has changed in the mean time              #only report time if it has changed in the mean time
156              if tmpTime != self.playingPosition:              if tmpTime != self.playingPosition:
157                  self.playingPosition = tmpTime                  self.playingPosition = tmpTime
158                  now = time()                  now = time()
159                  #print "[Todic] tick " + str(now) + " " + str(self.lastReport) + " : " +str(now - self.lastReport)                  #print( "[Todic] tick " + str(now) + " " + str(self.lastReport) + " : " +str(now - self.lastReport) )
160                  if ( (now - self.lastReport) > 60.0):                  if ( (now - self.lastReport) > 60.0):
161                      self.lastReport = now                      self.lastReport = now
162                      self.reportPlaytime("playing")                      self.reportPlaytime("playing")
# Line 162  class TodicPlayer(xbmc.Player): Line 164  class TodicPlayer(xbmc.Player):
164      def reportPlaytime(self, subaction):      def reportPlaytime(self, subaction):
165          if (self.playingPosition > 60):          if (self.playingPosition > 60):
166              url = __backend__ + "&action=playbacktime&subaction=" + subaction + "&time=" + str( self.playingPosition )              url = __backend__ + "&action=playbacktime&subaction=" + subaction + "&time=" + str( self.playingPosition )
167              print "[Todic] reportPlaytime:" + url              print( "[Todic] reportPlaytime:" + url)
168              open_url_safe(url)              open_url_safe(url)
169    
170    
# Line 196  def SaveFile(path, data): Line 198  def SaveFile(path, data):
198    
199    
200  def open_url(url):  def open_url(url):
201      req = urllib2.Request(url)      with urllib.request.urlopen(url) as response:
202      content = urllib2.urlopen(req)          data = response.read()
203      data = content.read()          return data
     content.close()  
     return data  
204    
205    
206  # wraps open url in a catch-all exception handler  # wraps open url in a catch-all exception handler
# Line 209  def open_url_safe(url): Line 209  def open_url_safe(url):
209      try:      try:
210          return open_url(url)          return open_url(url)
211      except:      except:
212          print "[Todic] Some error during open_url call to ", url          print( "[Todic] Some error during open_url call to ", url)
213    
214    
215    
216  def rootMenu():  def rootMenu():
217        kodi_ver = xbmc.getInfoLabel('System.BuildVersion')
218        plugin_ver = __addon__.getAddonInfo('version')
219        msgurl = __backend__ + "&action=messages&kodi=" + urllib.parse.quote(kodi_ver) + "&todicplugin=" + urllib.parse.quote(plugin_ver)
220    
221      msg = open_url(__backend__ + "&action=messages")      msg = open_url(msgurl)
222      msg = msg.strip()      msg = msg.strip()
223    
224      if msg != "":      if msg != "":
# Line 225  def rootMenu(): Line 228  def rootMenu():
228      buildList(__backend__, "", False)  # call default list      buildList(__backend__, "", False)  # call default list
229    
230      # Adde xtra items to root menu      # Adde xtra items to root menu
231      listitem = xbmcgui.ListItem(      listitem = xbmcgui.ListItem(label="Søg Film ...")
232          label="Søg Film ...", iconImage='DefaultFolder.png', thumbnailImage='DefaultFolder.png')      listitem.setArt( { 'icon':'DefaultFolder.png', 'thumb':'DefaultFolder.png'} )
233      listitem.setProperty('Fanart_Image', fanartImage)      listitem.setProperty('Fanart_Image', fanartImage)
234    
235      u = sys.argv[0] + "?mode=10&name="      u = sys.argv[0] + "?mode=10&name="
# Line 234  def rootMenu(): Line 237  def rootMenu():
237          handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=True)          handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=True)
238    
239      # add search series      # add search series
240      listitem = xbmcgui.ListItem(      listitem = xbmcgui.ListItem(label="Søg Serier ...")
241          label="Søg Serier ...", iconImage='DefaultFolder.png', thumbnailImage='DefaultFolder.png')      listitem.setArt( { 'icon':'DefaultFolder.png', 'thumb':'DefaultFolder.png'} )
242      listitem.setProperty('Fanart_Image', fanartImage)      listitem.setProperty('Fanart_Image', fanartImage)
243    
244      u = sys.argv[0] + "?mode=11&name="      u = sys.argv[0] + "?mode=11&name="
# Line 246  def rootMenu(): Line 249  def rootMenu():
249    
250    
251  def buildList(url, title, endlist=True):  def buildList(url, title, endlist=True):
252      print '[Todic]:' + str(url)      print( '[Todic::buildList]:' + str(url) )
253    
254      link = open_url(url)      link = open_url(url)
255      doc = parseString(link)      doc = parseString(link)
256      ty = doc.getElementsByTagName("meta")[0].getAttribute("type")      ty = doc.getElementsByTagName("meta")[0].getAttribute("type")
257      print '[Todic]' + str(ty)      print( '[Todic]' + str(ty))
258    
259      if ty == 'clipList':      if ty == 'clipList':
260          mode = '50'          mode = '50'
# Line 276  def buildList(url, title, endlist=True): Line 279  def buildList(url, title, endlist=True):
279    
280  # print "name:" + name  # print "name:" + name
281  #               print "url:" + url  #               print "url:" + url
282  #               print "thumb:" + thumb  #               print "thumb:" + thumbi
283          listitem = xbmcgui.ListItem(          listitem = xbmcgui.ListItem(label=name, label2='test')
284              label=name, label2='test', iconImage='DefaultFolder.png', thumbnailImage=thumb)          listitem.setArt( {'icon': 'DefaultFolder.png'} )
285          listitem.setProperty('Fanart_Image', fanartImage)          listitem.setProperty('Fanart_Image', fanartImage)
286            listitem.addContextMenuItems([('Refresh', 'Container.Refresh')])
287            listitem.setArt( {'thumb': thumb} )
288    
289          if mode == '50':          if mode == '50':
290              infoLabels = {}              infoLabels = {}
291              infoLabels['title'] = name              infoLabels['title'] = name
292              infoLabels['playcount'] = playcount              infoLabels['playcount'] = playcount
293    #            if playcount > 0:
294    #                listitem.setArt( {'thumb': thumb} ) #not pretty - but at least we can show a different icon for unwatched/watched in kodi18  
295              listitem.setInfo('video', infoLabels)              listitem.setInfo('video', infoLabels)
296    
297          name = name.encode('UTF-8')          name = name.encode('UTF-8')
298    
299          u = sys.argv[0] + "?mode=" + urllib.quote(mode) + "&name=" + urllib.quote(          u = sys.argv[0] + "?mode=" + urllib.parse.quote(mode) + "&name=" + urllib.parse.quote(name) + "&url=" + urllib.parse.quote(url)
             name) + "&url=" + urllib.quote(url)  
300          xbmcplugin.addDirectoryItem(          xbmcplugin.addDirectoryItem(
301              handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=folder, totalItems=l)              handle=int(sys.argv[1]), url=u, listitem=listitem, isFolder=folder, totalItems=l)
302    
# Line 305  def play_video(url, name): Line 312  def play_video(url, name):
312          param1 = parse_parameter_string(url)          param1 = parse_parameter_string(url)
313          clipkey = param1["clipkey"]          clipkey = param1["clipkey"]
314    
315          print "[Todic] ClipKey:" + clipkey          print( "[Todic] ClipKey:" + clipkey)
316          detailurl = __backend__ + "&action=clipdetails&clipkey=" + clipkey          detailurl = __backend__ + "&action=clipdetails&clipkey=" + clipkey
317          print "[Todic] detailURL = " + detailurl          print( "[Todic] detailURL = " + detailurl)
318    
319          xml = open_url(detailurl)          xml = open_url(detailurl)
320    
# Line 315  def play_video(url, name): Line 322  def play_video(url, name):
322          savedPosition = int( getText(clipDetailsDoc.getElementsByTagName("position")) )          savedPosition = int( getText(clipDetailsDoc.getElementsByTagName("position")) )
323          description = getText(clipDetailsDoc.getElementsByTagName("description"))          description = getText(clipDetailsDoc.getElementsByTagName("description"))
324      except:      except:
325          print "[Todic] Unexpected error:", sys.exc_info()[0]          print( "[Todic] Unexpected error:", sys.exc_info()[0] )
326    
327      if (description == None or description == ""):      if (description == None or description == ""):
328          if (savedPosition > 0):          if (savedPosition > 0):
# Line 339  def play_video(url, name): Line 346  def play_video(url, name):
346    
347  def play_real_video(url, name, position):  def play_real_video(url, name, position):
348      xml = open_url(url)      xml = open_url(url)
349      print '[Todic] url: ' + str(url)      print( '[Todic] url: ' + str(url) )
350      print '[Todic] xml: ' + xml      print( '[Todic] xml: ' + str(xml) )
351      print '[Todic] pos: ' + str(position)      print( '[Todic] pos: ' + str(position) )
352    
353      doc = parseString(xml)      doc = parseString(xml)
354      url = getText(doc.getElementsByTagName("url"))      url = getText(doc.getElementsByTagName("url"))
355    
356      subtitleurl = getText(doc.getElementsByTagName("subtitles"))      subtitleurl = getText(doc.getElementsByTagName("subtitles"))
     subtitlesfile = os.path.join(datapath, 'temp.srt')  
357    
     # if old srt file exists delete it first  
     if os.path.isfile(subtitlesfile):  
         os.unlink(subtitlesfile)  
358    
359      print '[Todic] subs: ' + str(subtitleurl)      print( '[Todic] subs: ' + str(subtitleurl) )
     if len(subtitleurl) > 0:  
         subtitles = open_url(subtitleurl)  
         SaveFile(subtitlesfile, subtitles)  
         print '[Todic] downloaded subtitles'  
360    
361      image = xbmc.getInfoImage('ListItem.Thumb')      image = xbmc.getInfoImage('ListItem.Thumb')
362      listitem = xbmcgui.ListItem(      listitem = xbmcgui.ListItem(label=name)
363          label=name, iconImage='DefaultVideo.png', thumbnailImage=image)      listitem.setArt( {'icon': 'DefaultVideo.png', 'thumb':image} )
364      listitem.setInfo(type="Video", infoLabels={"Title": name})      listitem.setInfo(type="Video", infoLabels={"Title": name})
     listitem.setProperty('ResumeTime', '300')  
     listitem.setProperty('TotalTime', '3000')  
   
     player = TodicPlayer()  
     player.play(str(url), listitem)  
   
     # kan ikke loade subtitles hvis foerend playeren koerer  
     count = 0  
     while not xbmc.Player().isPlaying():  
         xbmc.sleep(250)  
         count += 1  
         if count > 10:  
             break  
   
365    
366        listitem.setProperty('StartOffset', str(position) )
367    
368      if xbmc.Player().isPlaying():      if len(subtitleurl) > 0:
369          if os.path.isfile(subtitlesfile):          listitem.setSubtitles([subtitleurl])
             player.setSubtitles(subtitlesfile)  
             print '[Todic] started subtitles'  
         else:  
             player.showSubtitles(False)  
   
   
         if (position > 0):  
             while (player.getTotalTime() == 0.0): #Vent indtil vi har beregnet hvor langt klippet er  
                 xbmc.sleep(250)  
370    
371              print "[Todic] totalTime " +  str( player.getTotalTime() )      player = TodicPlayer()
372              player.seekTime(position)      player.play(str(url), listitem)
373    
374    
375      #Holder python kørernde indtil at det bliver bedt om at stoppe      #Holder python kørernde indtil at det bliver bedt om at stoppe
376      while (not xbmc.abortRequested):      kodiMonitor = xbmc.Monitor()
377        
378        
379        while (not kodiMonitor.abortRequested()):
380          player.tick()          player.tick()
381          xbmc.sleep(500)          kodiMonitor.waitForAbort( 1 )
382    
383    
384    
# Line 407  def search(): Line 387  def search():
387    
388      if (search != None and search != ""):      if (search != None and search != ""):
389          url = __backend__ + "&action=search&search=" + \          url = __backend__ + "&action=search&search=" + \
390              urllib.quote_plus(search)              urllib.parse.quote(search)
391    
392          # print "[Todic] Search start: " + search          # print "[Todic] Search start: " + search
393          # print "[Todic] Search url: " + url          # print "[Todic] Search url: " + url
# Line 420  def searchSeries(): Line 400  def searchSeries():
400    
401      if (search != None and search != ""):      if (search != None and search != ""):
402          url = __backend__ + "&action=searchseries&search=" + \          url = __backend__ + "&action=searchseries&search=" + \
403              urllib.quote_plus(search)              urllib.parse.quote(search)
404    
405          # print "[Todic] Search start: " + search          # print "[Todic] Search start: " + search
406          # print "[Todic] Search url: " + url          # print "[Todic] Search url: " + url
# Line 431  def searchSeries(): Line 411  def searchSeries():
411  #=================================== Tool Box =======================================  #=================================== Tool Box =======================================
412  # shows a more userfriendly notification  # shows a more userfriendly notification
413  def showMessage(heading, message):  def showMessage(heading, message):
414        print( "[Todic::showMessage] " + message)
415        print( message )
416      duration = 15 * 1000      duration = 15 * 1000
417      xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' %      xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' %
418                          (heading, message, duration))                          (heading, message, duration))
# Line 484  mode = None Line 466  mode = None
466  #print params  #print params
467    
468  try:  try:
469      url = urllib.unquote_plus(params["url"])      url = urllib.parse.unquote(params["url"])
470  except:  except:
471      pass      pass
472  try:  try:
473      name = urllib.unquote_plus(params["name"])      name = urllib.parse.unquote(params["name"])
474  except:  except:
475      pass      pass
476  try:  try:
# Line 498  except: Line 480  except:
480    
481    
482    
   
483  try:  try:
484      open_url("http://todic.dk")      open_url("https://todic.dk")
485  except:  except:
486      showMessage("Fejl", "Kunne ikke forbinde til todic.dk")      showMessage("Fejl", "Kunne ikke forbinde til todic.dk")
487      exit()      exit()

Legend:
Removed from v.3244  
changed lines
  Added in v.3261

  ViewVC Help
Powered by ViewVC 1.1.20