PageRenderTime 28ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/IPTVPlayer/hosts/hostkreskoweczki.py

https://gitlab.com/Ghoz/iptvplayer-for-e2
Python | 318 lines | 286 code | 15 blank | 17 comment | 4 complexity | 2519f3e24ceface1ec1c98890680d46c MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. ###################################################
  3. # LOCAL import
  4. ###################################################
  5. from Plugins.Extensions.IPTVPlayer.components.iptvplayerinit import TranslateTXT as _, SetIPTVPlayerLastHostError
  6. from Plugins.Extensions.IPTVPlayer.components.ihost import CHostBase, CBaseHostClass, CDisplayListItem, RetHost, CUrlItem, ArticleContent
  7. from Plugins.Extensions.IPTVPlayer.tools.iptvtools import printDBG, printExc, CSearchHistoryHelper, GetDefaultLang, remove_html_markup, GetLogoDir, GetCookieDir, byteify
  8. from Plugins.Extensions.IPTVPlayer.libs.pCommon import common, CParsingHelper
  9. import Plugins.Extensions.IPTVPlayer.libs.urlparser as urlparser
  10. from Plugins.Extensions.IPTVPlayer.libs.youtube_dl.utils import clean_html
  11. from Plugins.Extensions.IPTVPlayer.tools.iptvtypes import strwithmeta
  12. ###################################################
  13. ###################################################
  14. # FOREIGN import
  15. ###################################################
  16. from datetime import timedelta
  17. import time
  18. import re
  19. import urllib
  20. import unicodedata
  21. import base64
  22. try: import json
  23. except Exception: import simplejson as json
  24. from Components.config import config, ConfigSelection, ConfigYesNo, ConfigText, getConfigListEntry
  25. ###################################################
  26. ###################################################
  27. # E2 GUI COMMPONENTS
  28. ###################################################
  29. from Plugins.Extensions.IPTVPlayer.components.asynccall import MainSessionWrapper
  30. from Screens.MessageBox import MessageBox
  31. ###################################################
  32. ###################################################
  33. # Config options for HOST
  34. ###################################################
  35. def GetConfigList():
  36. optionList = []
  37. return optionList
  38. ###################################################
  39. def gettytul():
  40. return 'http://kreskoweczki.pl/'
  41. class KreskoweczkiPL(CBaseHostClass):
  42. def __init__(self):
  43. CBaseHostClass.__init__(self, {'history':' KreskoweczkiPL.tv', 'cookie':'kreskoweczkipl.cookie'})
  44. self.defaultParams = {'use_cookie': True, 'load_cookie': True, 'save_cookie': True, 'cookiefile': self.COOKIE_FILE}
  45. self.abcCache = {}
  46. self.HEADER = {'User-Agent': 'Mozilla/5.0', 'Accept': 'text/html'}
  47. self.AJAX_HEADER = dict(self.HEADER)
  48. self.AJAX_HEADER.update( {'X-Requested-With': 'XMLHttpRequest'} )
  49. self.MAIN_URL = 'http://www.kreskoweczki.pl/'
  50. self.SEARCH_URL = self.MAIN_URL + 'search.php?keywords='
  51. self.DEFAULT_ICON = "http://www.kreskoweczki.pl/uploads/custom-logo.png"
  52. self.MAIN_CAT_TAB = [{'icon':self.DEFAULT_ICON, 'category':'list_abc', 'title': 'Alfabetycznie', 'url':self.MAIN_URL + 'index.html'},
  53. {'icon':self.DEFAULT_ICON, 'category':'list_items', 'title': 'Ostatnio dodane', 'url':self.MAIN_URL + 'index.html'},
  54. {'icon':self.DEFAULT_ICON, 'category':'list_items', 'title': 'Anime', 'url':self.MAIN_URL + 'typ/anime/'},
  55. {'icon':self.DEFAULT_ICON, 'category':'list_items', 'title': 'Bajki', 'url':self.MAIN_URL + 'typ/toon/'},
  56. {'icon':self.DEFAULT_ICON, 'category':'list_items', 'title': 'Seriale', 'url':self.MAIN_URL + 'typ/serial/'},
  57. {'icon':self.DEFAULT_ICON, 'category':'list_items', 'title': 'PozostaƂe', 'url':self.MAIN_URL + 'typ/pozostale/'},
  58. {'icon':self.DEFAULT_ICON, 'category':'search', 'title': _('Search'), 'search_item':True},
  59. {'icon':self.DEFAULT_ICON, 'category':'search_history', 'title': _('Search history')} ]
  60. def listABC(self, cItem, category):
  61. printDBG("KreskoweczkiPL.listABC")
  62. sts, data = self.cm.getPage(cItem['url'])
  63. if not sts: return
  64. data = self.cm.ph.getDataBeetwenMarkers(data, '<ul class="category-list one-quarter">', '</ul>')[1]
  65. data = self.cm.ph.getAllItemsBeetwenMarkers(data, '<li', '</li>')
  66. for item in data:
  67. title = self.cleanHtmlStr(item)
  68. url = self.getFullUrl( self.cm.ph.getSearchGroups(item, '''href=['"]([^'^"]+?)['"]''')[0] )
  69. params = dict(cItem)
  70. params.update({'category':category, 'title':title, 'url':url})
  71. self.addDir(params)
  72. def listTitles(self, cItem, nextCategory):
  73. printDBG("KreskoweczkiPL.listTitles")
  74. subCat = cItem.get('sub_cat', '')
  75. tab = self.abcCache.get(subCat, [])
  76. params = dict(cItem)
  77. params['category'] = nextCategory
  78. self.listsTab(tab, params)
  79. def listItems(self, cItem):
  80. printDBG("KreskoweczkiPL.listItems")
  81. url = cItem['url']
  82. page = cItem.get('page', 1)
  83. if page > 1:
  84. if '?' in url:
  85. url += '&page=%d' % page
  86. else:
  87. url += '?page=%d' % page
  88. sts, data = self.cm.getPage(url)
  89. if not sts: return
  90. #nextPage = self.cm.ph.getDataBeetwenMarkers(data, '<div class="loop-nav-inner">', '</div>', False)[1]
  91. if 'page,{0}/'.format(page+1) in data:
  92. nextPage = True
  93. else:
  94. nextPage = False
  95. video = True
  96. m1 = '<div class="pm-li-video"'
  97. if m1 not in data:
  98. m1 = '<a class="category-item"'
  99. video = False
  100. data = self.cm.ph.getAllItemsBeetwenMarkers(data, m1, '</li>')
  101. for item in data:
  102. # icon
  103. icon = self.cm.ph.getSearchGroups(item, '''url\(['"]([^'^"]+?)['"]''')[0]
  104. if icon == '': icon = cItem.get('icon', '')
  105. # url
  106. url = self.cm.ph.getSearchGroups(item, '''href=['"]([^'^"]+?)['"]''')[0]
  107. if url == '': continue
  108. #title
  109. title = self.cm.ph.getDataBeetwenMarkers(item, '<div class="category-name"', '</div>')[1]
  110. if title == '': title = self.cm.ph.getSearchGroups(item, '''title=['"]([^'^"]+?)['"]''')[0]
  111. if title == '': title = self.cm.ph.getDataBeetwenMarkers(item, '<a ', '</a>')[1]
  112. title = self.cm.ph.getDataBeetwenMarkers(item, '<span class="pm-category-name', '</span>')[1] + ' ' + title
  113. params = dict(cItem)
  114. params.update({'page':1, 'title':self.cleanHtmlStr(title), 'url':self.getFullUrl(url), 'icon':self.getFullUrl(icon)})
  115. if video:
  116. params.update({'desc':self.cleanHtmlStr(item)})
  117. self.addVideo(params)
  118. else:
  119. params.update({'desc':self.cleanHtmlStr(item.replace('</b>', '[/br]'))})
  120. self.addDir(params)
  121. if nextPage:
  122. params = dict(cItem)
  123. params.update({'title':_('Next page'), 'page':page+1})
  124. self.addDir(params)
  125. def getLinksForVideo(self, cItem):
  126. printDBG("KreskoweczkiPL.getLinksForVideo [%s]" % cItem)
  127. urlTab = []
  128. vid = self.cm.ph.getSearchGroups(cItem['url'], '''kreskowka/([0-9]+?)/''')[0]
  129. if '' == vid: return []
  130. HEADER = dict(self.HEADER)
  131. HEADER['Referer'] = cItem['url']
  132. post_data = {'vid' : vid}
  133. sts, data = self.cm.getPage('http://www.kreskoweczki.pl/fullscreen/', {'header': HEADER}, post_data)
  134. if not sts: return []
  135. data = self.cm.ph.getAllItemsBeetwenMarkers(data, '<iframe', '</iframe>', caseSensitive=False)
  136. for item in data:
  137. videoUrl = self.getFullUrl(self.cm.ph.getSearchGroups(item, 'src="([^"]+?)"', ignoreCase=True)[0])
  138. if 1 != self.up.checkHostSupport(videoUrl): continue
  139. urlTab.append({'name':self.up.getHostName(videoUrl), 'url':videoUrl.replace('&amp;', '&'), 'need_resolve':1})
  140. return urlTab
  141. sts, videoData = self.cm.ph.getDataBeetwenMarkers(data, 'Loader.skipBanners', 'Loader.skipBanners', False)
  142. if sts:
  143. videoUrl = self.cm.ph.getSearchGroups(videoData, '''Loader.loadFlashFile."([^"]+?)"''')[0]
  144. if '' == videoUrl:
  145. videoUrl = self.cm.ph.getSearchGroups(videoData, '''src="(.+?)"''')[0]
  146. if 'src=' in videoUrl:
  147. videoUrl = self.cm.ph.getSearchGroups(videoUrl, '''src="(.+?)"''')[0]
  148. videoData = self.cm.ph.getSearchGroups(videoUrl, "/embed/proxy[^.]+?.php")
  149. if '' != videoData:
  150. sts, data = self.cm.getPage(videoUrl)
  151. if not sts: return []
  152. videoUrl = self.cm.ph.getSearchGroups(data, '''url: "[^?^"]+?\?url=([^"]+?)"''')[0]
  153. if videoUrl.split('?')[0].endswith('.m3u8'):
  154. urlTab = getDirectM3U8Playlist(videoUrl)
  155. for idx in len(urlTab):
  156. urlTab[idx]['need_resolve'] = 0
  157. else:
  158. if videoUrl.startswith('//'):
  159. videoUrl = 'http:' + videoUrl
  160. urlTab.append({'name':self.up.getHostName(videoUrl), 'url':videoUrl.replace('&amp;', '&'), 'need_resolve':1})
  161. return urlTab
  162. def getVideoLinks(self, videoUrl):
  163. printDBG("KreskoweczkiPL.getVideoLinks [%s]" % videoUrl)
  164. urlTab = []
  165. if videoUrl.startswith('http'):
  166. urlTab.extend( self.up.getVideoLinkExt(videoUrl) )
  167. return urlTab
  168. def listSearchResult(self, cItem, searchPattern, searchType):
  169. printDBG("KreskoweczkiPL.listSearchResult cItem[%s], searchPattern[%s] searchType[%s]" % (cItem, searchPattern, searchType))
  170. cItem = dict(cItem)
  171. cItem['url'] = self.SEARCH_URL + urllib.quote(searchPattern)
  172. self.listItems(cItem)
  173. def getFavouriteData(self, cItem):
  174. return str(cItem['url'])
  175. def getLinksForFavourite(self, fav_data):
  176. return self.getLinksForVideo({'url':fav_data})
  177. def handleService(self, index, refresh = 0, searchPattern = '', searchType = ''):
  178. printDBG('handleService start')
  179. CBaseHostClass.handleService(self, index, refresh, searchPattern, searchType)
  180. name = self.currItem.get("name", '')
  181. category = self.currItem.get("category", '')
  182. mode = self.currItem.get("mode", '')
  183. filter = self.currItem.get("filter", '')
  184. printDBG( "handleService: |||||||||||||||||||||||||||||||||||| name[%s], category[%s] " % (name, category) )
  185. self.currList = []
  186. #MAIN MENU
  187. if name == None:
  188. self.listsTab(self.MAIN_CAT_TAB, {'name':'category'})
  189. elif category == 'list_abc':
  190. self.listABC(self.currItem, 'list_items')
  191. elif category == 'list_titles':
  192. self.listTitles(self.currItem, 'list_items')
  193. elif category == 'list_items':
  194. self.listItems(self.currItem)
  195. #SEARCH
  196. elif category in ["search", "search_next_page"]:
  197. cItem = dict(self.currItem)
  198. cItem.update({'search_item':False, 'name':'category'})
  199. self.listSearchResult(cItem, searchPattern, searchType)
  200. #HISTORIA SEARCH
  201. elif category == "search_history":
  202. self.listsHistory({'name':'history', 'category': 'search'}, 'desc', _("Type: "))
  203. else:
  204. printExc()
  205. CBaseHostClass.endHandleService(self, index, refresh)
  206. class IPTVHost(CHostBase):
  207. def __init__(self):
  208. # for now we must disable favourites due to problem with links extraction for types other than movie
  209. CHostBase.__init__(self, KreskoweczkiPL(), True, favouriteTypes=[CDisplayListItem.TYPE_VIDEO, CDisplayListItem.TYPE_AUDIO])
  210. def getLinksForVideo(self, Index = 0, selItem = None):
  211. retCode = RetHost.ERROR
  212. retlist = []
  213. if not self.isValidIndex(Index): return RetHost(retCode, value=retlist)
  214. urlList = self.host.getLinksForVideo(self.host.currList[Index])
  215. for item in urlList:
  216. retlist.append(CUrlItem(item["name"], item["url"], item['need_resolve']))
  217. return RetHost(RetHost.OK, value = retlist)
  218. # end getLinksForVideo
  219. def getResolvedURL(self, url):
  220. # resolve url to get direct url to video file
  221. retlist = []
  222. urlList = self.host.getVideoLinks(url)
  223. for item in urlList:
  224. need_resolve = 0
  225. retlist.append(CUrlItem(item["name"], item["url"], need_resolve))
  226. return RetHost(RetHost.OK, value = retlist)
  227. def converItem(self, cItem):
  228. hostList = []
  229. searchTypesOptions = [] # ustawione alfabetycznie
  230. #searchTypesOptions.append((_("Movies"), "movie"))
  231. #searchTypesOptions.append((_("TV Shows"), "tv_shows"))
  232. hostLinks = []
  233. type = CDisplayListItem.TYPE_UNKNOWN
  234. possibleTypesOfSearch = None
  235. if 'category' == cItem['type']:
  236. if cItem.get('search_item', False):
  237. type = CDisplayListItem.TYPE_SEARCH
  238. possibleTypesOfSearch = searchTypesOptions
  239. else:
  240. type = CDisplayListItem.TYPE_CATEGORY
  241. elif cItem['type'] == 'video':
  242. type = CDisplayListItem.TYPE_VIDEO
  243. elif 'more' == cItem['type']:
  244. type = CDisplayListItem.TYPE_MORE
  245. elif 'audio' == cItem['type']:
  246. type = CDisplayListItem.TYPE_AUDIO
  247. if type in [CDisplayListItem.TYPE_AUDIO, CDisplayListItem.TYPE_VIDEO]:
  248. url = cItem.get('url', '')
  249. if '' != url:
  250. hostLinks.append(CUrlItem("Link", url, 1))
  251. title = cItem.get('title', '')
  252. description = cItem.get('desc', '')
  253. icon = cItem.get('icon', '')
  254. return CDisplayListItem(name = title,
  255. description = description,
  256. type = type,
  257. urlItems = hostLinks,
  258. urlSeparateRequest = 1,
  259. iconimage = icon,
  260. possibleTypesOfSearch = possibleTypesOfSearch)
  261. # end converItem