Advertisement
Guest User

shoutfactorytv scraper.py for Kodi 18 Leia

a guest
Jul 28th, 2023
73
0
86 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.96 KB | Source Code | 0 0
  1. # -*- coding: utf-8 -*-
  2. # Shout Factory TV Kodi Video Addon
  3. #
  4. from t1mlib import t1mAddon
  5. import json
  6. import re
  7. import os
  8. import datetime
  9. import urllib
  10. import urllib2
  11. import xbmc
  12. import xbmcplugin
  13. import xbmcgui
  14. import HTMLParser
  15. import sys
  16.  
  17. h = HTMLParser.HTMLParser()
  18. qp  = urllib.quote_plus
  19. uqp = urllib.unquote_plus
  20. UTF8     = 'utf-8'
  21.  
  22.  
  23. class myAddon(t1mAddon):
  24.  
  25.   def getAddonMenu(self,url,ilist):
  26.       ilist = self.addMenuItem('Film','GC', ilist, '/film', self.addonIcon, self.addonFanart, {} , isFolder=True)
  27.       ilist = self.addMenuItem('TV','GC', ilist, '/tv', self.addonIcon, self.addonFanart, {} , isFolder=True)
  28.       return(ilist)
  29.  
  30.   def getAddonCats(self,url,ilist):
  31.       html = self.getRequest('https://shout-tv.com'+url)
  32.       html = re.compile('<div class="dropdown">.+?a href="'+url+'"(.+?)</div>\s*</div>', re.DOTALL).search(html).group(1)
  33.       cats = re.compile('<a href="(.+?)">(.+?)<', re.DOTALL).findall(html)
  34.       if url =='/film':
  35.           mode = 'GM'
  36.       else:
  37.           mode = 'GS'
  38.       for url, name in cats:
  39.           ilist = self.addMenuItem(name, mode, ilist, url, self.addonIcon, self.addonFanart, {} , isFolder=True)
  40.       return(ilist)
  41.  
  42.   def getAddonEpisodes(self,url,ilist, getFileData = False):
  43.       html = self.getRequest('https://shout-tv.com%s' % (url))
  44.       html = re.compile('<div class="tabs-area(.+?)<div class="container add">', re.DOTALL).search(html).group(1)
  45.       epis=re.compile('<a href="(.+?)".+?alt="(.+?)".+?src="(.+?)".+?Season:(.+?)\n.+?Episode:(.+?)\n.+?</li',re.DOTALL).findall(html)
  46.       for url, name, thumb, season, episode in epis:
  47.               url = url.rsplit('/',1)[1]
  48.               infoList = {}
  49.               name = re.sub(r'[^\x00-\x7F]+','', name) # Strip non-ASCII chars
  50.               name = h.unescape(name)
  51.               infoList['Title'] = name
  52.               infoList['TVShowTitle'] = xbmc.getInfoLabel('ListItem.TVShowTitle')
  53.               season = season.strip(' ,')
  54.               if season.isdigit():
  55.                   infoList['Season'] = int(season)
  56.               episode = episode.strip()
  57.               if episode.isdigit():
  58.                   infoList['Episode'] = int(episode)
  59.               infoList['mediatype'] = 'episode'
  60.               if not getFileData:
  61.                   contextMenu = [('Add To Library','XBMC.RunPlugin(%s?mode=DF&url=AM%s)' % (sys.argv[0], url))]
  62.                   ilist = self.addMenuItem(name,'GV', ilist, url, thumb, self.addonFanart, infoList, isFolder=False, cm=contextMenu)
  63.               else:
  64.                   ilist.append((infoList.get('Season',''), infoList.get('Episode',''), url))
  65.       return(ilist)
  66.  
  67.   def getAddonMovies(self,url,ilist):
  68.       html  = self.getRequest('https://shout-tv.com%s' % (url))
  69.       movies=re.compile('<div class="img-holder">.+?href="(.+?)".+?alt="(.+?)".+?src="(.+?)"',re.DOTALL).findall(html)
  70.       movies = sorted(movies, key=lambda x: x[1])
  71.       for url, name, thumb in movies:
  72.               url = url.rsplit('/',1)[1]
  73.               infoList = {}
  74.               name = h.unescape(name).replace('?','')
  75.               infoList['Title'] = name
  76.               infoList['mediatype'] = 'movie'
  77.               contextMenu = [('Add To Library','XBMC.RunPlugin(%s?mode=DF&url=AM%s)' % (sys.argv[0], url))]
  78.               ilist = self.addMenuItem(name,'GV', ilist, url, thumb, self.addonFanart, infoList, isFolder=False, cm=contextMenu)
  79.       return(ilist)
  80.  
  81.   def getAddonShows(self,url,ilist):
  82.       html = self.getRequest('https://shout-tv.com%s' % (url))
  83.       shows=re.compile('<div class="img-holder">.+?href="(.+?)".+?alt="(.+?)".+?src="(.+?)"',re.DOTALL).findall(html)
  84.       shows = sorted(shows, key=lambda x: x[1])
  85.       for url, name, thumb in shows:
  86.               infoList = {}
  87.               name = h.unescape(name)
  88.               infoList['Title'] = name
  89.               infoList['TVShowTitle'] = name
  90.               infoList['mediatype'] = 'tvshow'
  91.               contextMenu = [('Add To Library','XBMC.RunPlugin(%s?mode=DF&url=AL%s)' % (sys.argv[0], url))]
  92.               ilist = self.addMenuItem(name,'GE', ilist, url, thumb, self.addonFanart, infoList , isFolder=True, cm=contextMenu)
  93.       return(ilist)
  94.  
  95.   def doFunction(self, url):
  96.       func = url[0:2]
  97.       url  = url[2:]
  98.       if func == 'AL':
  99.           name = xbmc.getInfoLabel('ListItem.Title').replace('?','')
  100.           profile = self.addon.getAddonInfo('profile').decode(UTF8)
  101.           moviesDir = xbmc.translatePath(os.path.join(profile,'TV Shows'))
  102.           movieDir = xbmc.translatePath(os.path.join(moviesDir, name))
  103.           if not os.path.isdir(movieDir):
  104.               os.makedirs(movieDir)
  105.           ilist = []
  106.           ilist = self.getAddonEpisodes(url, ilist, getFileData = True)
  107.           for season, episode, url in ilist:
  108.               se = 'S%sE%s' % (str(season), str(episode))
  109.               xurl = '%s?mode=GV&url=%s' % (sys.argv[0], qp(url))
  110.               strmFile = xbmc.translatePath(os.path.join(movieDir, se+'.strm'))
  111.               with open(strmFile, 'w') as outfile:
  112.                   outfile.write(xurl)        
  113.       elif func == 'AM':
  114.           name  = xbmc.getInfoLabel('ListItem.Title').replace('?','')
  115.           profile = self.addon.getAddonInfo('profile').decode(UTF8)
  116.           moviesDir  = xbmc.translatePath(os.path.join(profile,'Movies'))
  117.           movieDir  = xbmc.translatePath(os.path.join(moviesDir, name))
  118.           if not os.path.isdir(movieDir):
  119.               os.makedirs(movieDir)
  120.           strmFile = xbmc.translatePath(os.path.join(movieDir, name+'.strm'))
  121.           with open(strmFile, 'w') as outfile:
  122.               outfile.write('%s?mode=GV&url=%s' %(sys.argv[0], url))
  123.       json_cmd = '{"jsonrpc":"2.0","method":"VideoLibrary.Scan", "params": {"directory":"%s/"},"id":1}' % movieDir.replace('\\','/')
  124.       jsonRespond = xbmc.executeJSONRPC(json_cmd)
  125.  
  126.  
  127.   def getAddonVideo(self,url):
  128.       if not url.startswith('https'):
  129.           url = 'https://player.zype.com/manifest/%s.m3u8?api_key=3PASB80DgKOdJoEdFmyaWw' % url
  130.       liz = xbmcgui.ListItem(path = url)
  131.       infoList ={}
  132.       infoList['mediatype'] = xbmc.getInfoLabel('ListItem.DBTYPE')
  133.       infoList['Title'] = xbmc.getInfoLabel('ListItem.Title')
  134.       infoList['TVShowTitle'] = xbmc.getInfoLabel('ListItem.TVShowTitle')
  135.       infoList['Year'] = xbmc.getInfoLabel('ListItem.Year')
  136.       infoList['Premiered'] = xbmc.getInfoLabel('Premiered')
  137.       infoList['Plot'] = xbmc.getInfoLabel('ListItem.Plot')
  138.       infoList['Studio'] = xbmc.getInfoLabel('ListItem.Studio')
  139.       infoList['Genre'] = xbmc.getInfoLabel('ListItem.Genre')
  140.       infoList['Duration'] = xbmc.getInfoLabel('ListItem.Duration')
  141.       infoList['MPAA'] = xbmc.getInfoLabel('ListItem.Mpaa')
  142.       infoList['Aired'] = xbmc.getInfoLabel('ListItem.Aired')
  143.       infoList['Season'] = xbmc.getInfoLabel('ListItem.Season')
  144.       infoList['Episode'] = xbmc.getInfoLabel('ListItem.Episode')
  145.       liz.setInfo('video', infoList)
  146.       xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, liz)
  147.  
  148.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement