/IPTVPlayer/hosts/hostsovdub.py

https://gitlab.com/zatoshi/iptvplayer-for-e2 · Python · 323 lines · 251 code · 50 blank · 22 comment · 52 complexity · 2c0984c858b69a7f77eb37096282ad85 MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. #
  3. #-*- Coded by gorr
  4. #
  5. ###################################################
  6. # LOCAL import
  7. ###################################################
  8. from Plugins.Extensions.IPTVPlayer.components.iptvplayerinit import TranslateTXT as _, SetIPTVPlayerLastHostError
  9. from Plugins.Extensions.IPTVPlayer.components.ihost import CHostBase, CBaseHostClass, CDisplayListItem, RetHost, \
  10. CUrlItem, ArticleContent
  11. from Plugins.Extensions.IPTVPlayer.tools.iptvtools import printDBG, printExc, CSearchHistoryHelper, remove_html_markup, \
  12. GetLogoDir, GetCookieDir, byteify
  13. from Plugins.Extensions.IPTVPlayer.libs.pCommon import common, CParsingHelper
  14. import Plugins.Extensions.IPTVPlayer.libs.urlparser as urlparser
  15. from Plugins.Extensions.IPTVPlayer.libs.youtube_dl.utils import clean_html
  16. from Plugins.Extensions.IPTVPlayer.tools.iptvtypes import strwithmeta
  17. ###################################################
  18. ###################################################
  19. # FOREIGN import
  20. ###################################################
  21. import re
  22. import urllib
  23. from Components.config import config, ConfigSelection, ConfigYesNo, ConfigText, getConfigListEntry
  24. ###################################################
  25. ###################################################
  26. # E2 GUI COMMPONENTS
  27. ###################################################
  28. from Plugins.Extensions.IPTVPlayer.components.asynccall import MainSessionWrapper
  29. from Screens.MessageBox import MessageBox
  30. ###################################################
  31. ###################################################
  32. # Config options for HOST
  33. ###################################################
  34. def GetConfigList():
  35. optionList = []
  36. return optionList
  37. def gettytul():
  38. return 'SovDub'
  39. class Sovdub(CBaseHostClass):
  40. MAIN_URL = 'http://sovdub.ru/'
  41. DEFAULT_ICON_URL = 'http://sovdub.ru/templates/simplefilms/images/logo.png'
  42. SRCH_URL = MAIN_URL + '?do=search&mode=advanced&subaction=search&story='
  43. MAIN_CAT_TAB = [{'category': 'genres', 'title': _('Genres'), 'url': MAIN_URL, 'icon': DEFAULT_ICON_URL},
  44. {'category': 'countries', 'title': _('Countries'), 'url': MAIN_URL, 'icon': DEFAULT_ICON_URL},
  45. {'category': 'search', 'title': _('Search'), 'icon': DEFAULT_ICON_URL, 'search_item': True},
  46. {'category': 'search_history', 'title': _('Search history'), 'icon': DEFAULT_ICON_URL}]
  47. def __init__(self):
  48. CBaseHostClass.__init__(self, {'history': 'Sovdub', 'cookie': 'Sovdub.cookie'})
  49. def _getFullUrl(self, url):
  50. mainUrl = self.MAIN_URL
  51. if 0 < len(url) and not url.startswith('http'):
  52. if url.startswith('/'):
  53. url = url[1:]
  54. url = mainUrl + url
  55. if not mainUrl.startswith('https://'):
  56. url = url.replace('https://', 'http://')
  57. return url
  58. def getPage(self, url, params={}, post_data=None):
  59. sts, data = self.cm.getPage(url, params, post_data)
  60. if sts: data = data.decode('windows-1251').encode('utf-8')
  61. return sts, data
  62. def listsTab(self, tab, cItem, type='dir'):
  63. printDBG("Sovdub.listsTab")
  64. for item in tab:
  65. params = dict(cItem)
  66. params.update(item)
  67. params['name'] = 'category'
  68. if type == 'dir':
  69. self.addDir(params)
  70. else: self.addVideo(params)
  71. def listGenres(self, cItem, category):
  72. printDBG("Sovdub.listGenres")
  73. sts, data = self.getPage(cItem['url'])
  74. if not sts: return
  75. catData = self.cm.ph.getDataBeetwenMarkers(data, '<div class="right-menu">', '</div>', False)[1]
  76. catData = re.compile('href="([^"]+?)">([^<]+?)</a>').findall(catData)
  77. for item in catData:
  78. params = dict(cItem)
  79. params.update({'category': category, 'title': item[1], 'url': item[0]})
  80. self.addDir(params)
  81. def listCountries(self, cItem, category):
  82. printDBG("Sovdub.listCountries")
  83. sts, data = self.getPage(cItem['url'])
  84. if not sts: return
  85. canData = self.cm.ph.getDataBeetwenMarkers(data, '()\n//-->', '</div>', False)[1]
  86. canData = re.compile('href="([^"]+?)">([^<]+?)</a>').findall(canData)
  87. for item in canData:
  88. params = dict(cItem)
  89. params.update({'category': category, 'title': item[1], 'url': item[0]})
  90. self.addDir(params)
  91. def listItems(self, cItem, category):
  92. printDBG("Sovdub.listItems")
  93. url = cItem['url']
  94. if '?' in url:
  95. post = url.split('?')
  96. url = post[0]
  97. post = post[1]
  98. else:
  99. post = ''
  100. page = cItem.get('page', 1)
  101. if page > 1:
  102. url += 'page/%d/' % page
  103. if post != '':
  104. url += '?' + post
  105. post_data = cItem.get('post_data', None)
  106. sts, data = self.getPage(url, {}, post_data)
  107. if not sts: return
  108. if ('/page/%d/' % (page + 1)) in data:
  109. nextPage = True
  110. else: nextPage = False
  111. m1 = '</div></div>'
  112. if ('<div class="navigation">') in data:
  113. m1 = '<div class="navigation">'
  114. data = self.cm.ph.getDataBeetwenMarkers(data, "<div id='dle-content'>", m1, False)[1]
  115. data = re.compile('src="(.*jpg)".*alt="(.*)" />*\s.*<a href="(.*?)"></a></div>').findall(data)
  116. for item in data:
  117. title = item[1]
  118. icon = item[0]
  119. url = item[2]
  120. printDBG(icon)
  121. params = dict(cItem)
  122. params.update({'category': category, 'title': item[1], 'icon': item[0], 'desc': item[1], 'url': item[2]})
  123. self.addDir(params)
  124. if nextPage:
  125. params = dict(cItem)
  126. params.update({'title': _('Next page'), 'page': cItem.get('page', 1)+1})
  127. self.addDir(params)
  128. def listContent(self, cItem):
  129. printDBG("Sovdub.listContent")
  130. sts, data = self.getPage(cItem['url'])
  131. if not sts: return
  132. desc = self.cm.ph.getDataBeetwenMarkers(data, '<div class="full-news-content">', '</a></div>', False)[1]
  133. desc = self.cleanHtmlStr(desc).replace(' ', '')
  134. url = self.cm.ph.getSearchGroups(data, '''<iframe[^>]+?src=["']([^"^']+?)['"]''', 1, True)[0]
  135. url = url.replace('amp;', '')
  136. if url.startswith('http'):
  137. params = dict(cItem)
  138. params['desc'] = desc
  139. params['url'] = url
  140. params.update({'desc': desc, 'url': url})
  141. self.addVideo(params)
  142. def listSearchResult(self, cItem, searchPattern, searchType):
  143. try: searchPattern = searchPattern.decode('utf-8').encode('cp1251', 'ignore')
  144. except: searchPattern = ''
  145. searchPattern = urllib.quote_plus(searchPattern)
  146. cItem = dict(cItem)
  147. cItem['url'] = self.SRCH_URL + urllib.quote_plus(searchPattern)
  148. cItem['post_data'] = {'do': 'search', 'subaction': 'search', 'x': 0, 'y': 0, 'story': searchPattern}
  149. self.listItems(cItem, 'list_items')
  150. def getLinksForVideo(self, cItem):
  151. printDBG("Sovdub.getLinksForVideo [%s]" % cItem)
  152. urlTab = []
  153. urlTab.append({'name': 'Main url', 'url': cItem['url'], 'need_resolve': 1})
  154. return urlTab
  155. def getVideoLinks(self, videoUrl):
  156. printDBG("Sovdub.getVideoLinks [%s]" % videoUrl)
  157. urlTab = []
  158. if 'publicvideohost.org' in videoUrl:
  159. sts, data = self.getPage(videoUrl)
  160. if not sts: return []
  161. url = self.cm.ph.getSearchGroups(data, 'file: "(.*?)"')[0]
  162. urlTab.append({'name': 'Main url', 'url': url, 'need_resolve': 0})
  163. else:
  164. urlTab = self.up.getVideoLinkExt(videoUrl)
  165. return urlTab
  166. def getFavouriteData(self, cItem):
  167. return cItem['url']
  168. def getLinksForFavourite(self, fav_data):
  169. return self.getLinksForVideo({'url': fav_data})
  170. def handleService(self, index, refresh = 0, searchPattern = '', searchType = ''):
  171. printDBG('handleService start')
  172. CBaseHostClass.handleService(self, index, refresh, searchPattern, searchType)
  173. name = self.currItem.get("name", '')
  174. category = self.currItem.get("category", '')
  175. printDBG("handleService: |||||||||||||||||||||||||||||||||||| name[%s], category[%s] " % (name, category))
  176. self.currList = []
  177. #MAIN MENU
  178. if name == None:
  179. self.listsTab(self.MAIN_CAT_TAB, {'name': 'category'})
  180. elif category == 'genres':
  181. self.listGenres(self.currItem, 'list_items')
  182. elif category == 'countries':
  183. self.listCountries(self.currItem, 'list_items')
  184. elif category == 'list_items':
  185. self.listItems(self.currItem, 'list_content')
  186. elif category == 'list_content':
  187. self.listContent(self.currItem)
  188. #SEARCH
  189. elif category in ["search", "search_next_page"]:
  190. cItem = dict(self.currItem)
  191. cItem.update({'search_item': False, 'name': 'category'})
  192. self.listSearchResult(cItem, searchPattern, searchType)
  193. #HISTORIA SEARCH
  194. elif category == "search_history":
  195. self.listsHistory({'name': 'history', 'category': 'search'}, 'desc', _("Type: "))
  196. else:
  197. printExc()
  198. CBaseHostClass.endHandleService(self, index, refresh)
  199. class IPTVHost(CHostBase):
  200. def __init__(self):
  201. CHostBase.__init__(self, Sovdub(), True, [CDisplayListItem.TYPE_VIDEO, CDisplayListItem.TYPE_AUDIO])
  202. def getLogoPath(self):
  203. return RetHost(RetHost.OK, value = [GetLogoDir('sovdublogo.png')])
  204. def getLinksForVideo(self, Index = 0, selItem = None):
  205. retCode = RetHost.ERROR
  206. retlist = []
  207. if not self.isValidIndex(Index): return RetHost(retCode, value=retlist)
  208. urlList = self.host.getLinksForVideo(self.host.currList[Index])
  209. for item in urlList:
  210. retlist.append(CUrlItem(item["name"], item["url"], item['need_resolve']))
  211. return RetHost(RetHost.OK, value = retlist)
  212. def getResolvedURL(self, url):
  213. retlist = []
  214. urlList = self.host.getVideoLinks(url)
  215. for item in urlList:
  216. need_resolve = 0
  217. retlist.append(CUrlItem(item["name"], item["url"], need_resolve))
  218. return RetHost(RetHost.OK, value = retlist)
  219. def converItem(self, cItem):
  220. hostList = []
  221. searchTypesOptions = []
  222. hostLinks = []
  223. type = CDisplayListItem.TYPE_UNKNOWN
  224. possibleTypesOfSearch = None
  225. if cItem['type'] == 'category':
  226. if cItem.get('search_item', False):
  227. type = CDisplayListItem.TYPE_SEARCH
  228. possibleTypesOfSearch = searchTypesOptions
  229. else:
  230. type = CDisplayListItem.TYPE_CATEGORY
  231. elif cItem['type'] == 'video':
  232. type = CDisplayListItem.TYPE_VIDEO
  233. elif cItem['type'] == 'more':
  234. type = CDisplayListItem.TYPE_MORE
  235. elif cItem['type'] == 'audio':
  236. type = CDisplayListItem.TYPE_AUDIO
  237. if type in [CDisplayListItem.TYPE_AUDIO, CDisplayListItem.TYPE_VIDEO]:
  238. url = cItem.get('url', '')
  239. if '' != url:
  240. hostLinks.append(CUrlItem("Link", url, 1))
  241. title = cItem.get('title', '')
  242. description = cItem.get('desc', '')
  243. icon = cItem.get('icon', '')
  244. return CDisplayListItem(name = title,
  245. description = description,
  246. type = type,
  247. urlItems = hostLinks,
  248. urlSeparateRequest = 1,
  249. iconimage = icon,
  250. possibleTypesOfSearch = possibleTypesOfSearch)
  251. def getSearchItemInx(self):
  252. try:
  253. list = self.host.getCurrList()
  254. for i in range(len(list)):
  255. if list[i]['category'] == 'search':
  256. return i
  257. except:
  258. printDBG('getSearchItemInx EXCEPTION')
  259. return -1
  260. def setSearchPattern(self):
  261. try:
  262. list = self.host.getCurrList()
  263. if 'history' == list[self.currIndex]['name']:
  264. pattern = list[self.currIndex]['title']
  265. search_type = list[self.currIndex]['search_type']
  266. self.host.history.addHistoryItem(pattern, search_type)
  267. self.searchPattern = pattern
  268. self.searchType = search_type
  269. except:
  270. printDBG('setSearchPattern EXCEPTION')
  271. self.searchPattern = ''
  272. self.searchType = ''
  273. return