PageRenderTime 43ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/IPTVPlayer/libs/skylinewebcamscom.py

https://gitlab.com/zatoshi/iptvplayer-for-e2
Python | 206 lines | 180 code | 9 blank | 17 comment | 2 complexity | 513f256a8b5d770012491bfee7fc81c5 MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. ###################################################
  3. # LOCAL import
  4. ###################################################
  5. from Plugins.Extensions.IPTVPlayer.components.iptvplayerinit import TranslateTXT as _
  6. from Plugins.Extensions.IPTVPlayer.tools.iptvtools import printDBG, printExc, remove_html_markup, GetCookieDir, byteify
  7. from Plugins.Extensions.IPTVPlayer.tools.iptvtypes import strwithmeta
  8. from Plugins.Extensions.IPTVPlayer.libs.pCommon import common
  9. from Plugins.Extensions.IPTVPlayer.libs.urlparser import urlparser
  10. from Plugins.Extensions.IPTVPlayer.libs.urlparserhelper import getDirectM3U8Playlist
  11. from Plugins.Extensions.IPTVPlayer.components.iptvplayerinit import SetIPTVPlayerLastHostError
  12. from Plugins.Extensions.IPTVPlayer.components.ihost import CBaseHostClass
  13. ###################################################
  14. ###################################################
  15. # FOREIGN import
  16. ###################################################
  17. from Components.config import config, ConfigSelection, ConfigYesNo, ConfigText, getConfigListEntry
  18. import re
  19. import urllib
  20. import random
  21. import string
  22. try: import json
  23. except: import simplejson as json
  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. config.plugins.iptvplayer.skylinewebcams_lang = ConfigSelection(default = "en", choices = [("en", _("en")), ("it", _("it")), ("es", _("es")), ("de", _("de")), ("fr", _("fr")),
  35. ("el", _("el")), ("hr", _("hr")), ("sl", _("sl")), ("zh", _("zh"))])
  36. def GetConfigList():
  37. optionList = []
  38. optionList.append(getConfigListEntry(_("Language:"), config.plugins.iptvplayer.skylinewebcams_lang))
  39. return optionList
  40. ###################################################
  41. class WkylinewebcamsComApi:
  42. MAIN_URL = 'https://www.skylinewebcams.com/'
  43. def __init__(self):
  44. self.COOKIE_FILE = GetCookieDir('skylinewebcamscom.cookie')
  45. self.cm = common()
  46. self.up = urlparser()
  47. self.http_params = {}
  48. self.http_params.update({'save_cookie': True, 'load_cookie': True, 'cookiefile': self.COOKIE_FILE})
  49. self.cacheList = {}
  50. self.mainMenuCache = {}
  51. self.lang = config.plugins.iptvplayer.skylinewebcams_lang.value
  52. def getFullUrl(self, url):
  53. if url == '':
  54. return ''
  55. if url.startswith('//'):
  56. return 'http:' + url
  57. if url.startswith('http'):
  58. return url
  59. elif url.startswith('/'):
  60. url = url[1:]
  61. return self.MAIN_URL + url
  62. def cleanHtmlStr(self, str):
  63. return CBaseHostClass.cleanHtmlStr(str)
  64. def getMainMenu(self, cItem):
  65. printDBG("WkylinewebcamsCom.getMainMenu")
  66. STATIC_TAB = [{'title':_('NEW'), 'url':self.getFullUrl('/skyline/morewebcams.php?w=new&l='+self.lang), 'cat':'list_cams2'},
  67. {'title':_('NEARBY CAMS'), 'url':self.getFullUrl('/skyline/morewebcams.php?w=you&l='+self.lang), 'cat':'list_cams2'},
  68. {'title':_('TOP live cams'), 'url':self.getFullUrl(self.lang+'/top-live-cams.html'), 'cat':'list_cams'},
  69. ]
  70. list = []
  71. sts, data = self.cm.getPage(cItem['url'])
  72. if not sts: return list
  73. data = self.cm.ph.getDataBeetwenMarkers(data, 'id="main-menu', ' lang')[1]
  74. data = self.cm.ph.getAllItemsBeetwenMarkers(data, '<li class="dropdown">', '</ul>')
  75. for idx in range(2):
  76. if idx >= len(data): continue
  77. catData = data[idx]
  78. catData = catData.split('<ul ')
  79. if len(catData) < 2: continue
  80. catTitle = self.cleanHtmlStr(catData[0])
  81. catUrl = self.cm.ph.getSearchGroups(catData[0], '''<a[^>]*?href="([^"]+?)"''', 1, True)[0]
  82. catData = self.cm.ph.getAllItemsBeetwenMarkers(catData[-1], '<a ', '</a>')
  83. tab = []
  84. for item in catData:
  85. url = self.cm.ph.getSearchGroups(item, '''href="([^"]+?)"''', 1, True)[0]
  86. title = self.cleanHtmlStr(item)
  87. if url != '' and title != '':
  88. tab.append({'url':self.getFullUrl(url), 'title':title, 'cat':'list_cams'}) #explore_item
  89. if len(tab):
  90. tab.insert(0, {'url':self.getFullUrl(catUrl), 'title':_('All'), 'cat':'list_cams'})
  91. self.mainMenuCache[idx] = tab
  92. params = dict(cItem)
  93. params.update({'title':catTitle, 'cat':'list_main_category', 'idx':idx})
  94. list.append(params)
  95. for item in STATIC_TAB:
  96. params = dict(cItem)
  97. params.update(item)
  98. list.insert(0, params)
  99. return list
  100. def listCams2(self, cItem):
  101. printDBG("WkylinewebcamsCom.listCams2")
  102. list = []
  103. sts, data = self.cm.getPage(cItem['url'])
  104. if not sts: return list
  105. data = self.cm.ph.getAllItemsBeetwenMarkers(data, '<a ', '</a>')
  106. for item in data:
  107. url = self.cm.ph.getSearchGroups(item, '''href="([^"]+?)"''', 1, True)[0]
  108. icon = self.cm.ph.getSearchGroups(item, '''src="([^"]+?)"''', 1, True)[0]
  109. if not url.startswith('http'): continue
  110. title = self.cleanHtmlStr(item)
  111. params = dict(cItem)
  112. params.update({'title':title, 'url':self.getFullUrl(url), 'icon':self.getFullUrl(icon), 'type':'video'})
  113. list.append(params)
  114. return list
  115. def listCams(self, cItem):
  116. printDBG("WkylinewebcamsCom.listCams")
  117. list = []
  118. sts, data = self.cm.getPage(cItem['url'])
  119. if not sts: return list
  120. data = self.cm.ph.getAllItemsBeetwenMarkers(data, '<li class="webcam">', '</li>')
  121. for item in data:
  122. url = self.cm.ph.getSearchGroups(item, '''href="([^"]+?)"''', 1, True)[0]
  123. icon = self.cm.ph.getSearchGroups(item, '''"([^"]+?\.jpg)"''', 1, True)[0]
  124. if '' == url: continue
  125. title = self.cleanHtmlStr(self.cm.ph.getSearchGroups(item, '''alt="([^"]+?)"''', 1, True)[0])
  126. desc = self.cleanHtmlStr(item)
  127. params = dict(cItem)
  128. params.update({'title':title, 'url':self.getFullUrl(url), 'icon':self.getFullUrl(icon), 'desc':desc, 'type':'video'})
  129. list.append(params)
  130. return list
  131. def exploreItem(self, cItem):
  132. printDBG("WkylinewebcamsCom.exploreItem")
  133. list = []
  134. sts, data = self.cm.getPage(cItem['url'])
  135. if not sts: return list
  136. data = self.cm.ph.getAllItemsBeetwenMarkers(data, '<li class="webcam">', '</li>')
  137. for item in data:
  138. url = self.cm.ph.getSearchGroups(item, '''href="([^"]+?)"''', 1, True)[0]
  139. icon = self.cm.ph.getSearchGroups(item, '''"([^"]+?\.jpg)"''', 1, True)[0]
  140. if '' == url: continue
  141. title = self.cleanHtmlStr(self.cm.ph.getSearchGroups(item, '''alt="([^"]+?)"''', 1, True)[0])
  142. desc = self.cleanHtmlStr(item)
  143. params = dict(cItem)
  144. params.update({'title':title, 'url':self.getFullUrl(url), 'icon':self.getFullUrl(icon), 'desc':desc, 'type':'video'})
  145. list.append(params)
  146. return list
  147. def getChannelsList(self, cItem):
  148. printDBG("WkylinewebcamsCom.getChannelsList")
  149. list = []
  150. cat = cItem.get('cat', None)
  151. lang = config.plugins.iptvplayer.skylinewebcams_lang.value
  152. self.lang = lang
  153. if None == cat:
  154. cItem = dict(cItem)
  155. cItem['url'] = self.MAIN_URL + lang + '.html'
  156. return self.getMainMenu(cItem)
  157. elif 'list_main_category' == cat:
  158. tab = self.mainMenuCache.get(cItem['idx'], [])
  159. for item in tab:
  160. params = dict(cItem)
  161. params.update(item)
  162. list.append(params)
  163. elif 'list_cams2' == cat:
  164. return self.listCams2(cItem)
  165. elif 'list_cams' == cat:
  166. return self.listCams(cItem)
  167. elif 'explore_item' == cat:
  168. return self.exploreItem(cItem)
  169. return list
  170. def getVideoLink(self, cItem):
  171. printDBG("WkylinewebcamsCom.getVideoLink")
  172. urlsTab = []
  173. sts, data = self.cm.getPage(cItem['url'])
  174. if not sts: return urlsTab
  175. url = self.cm.ph.getSearchGroups(data, '''['"](http[^"^']+?m3u8[^"^']*?)["']''', 1, True)[0]
  176. if url.startswith('http'):
  177. urlsTab = getDirectM3U8Playlist(url)
  178. data = self.cm.ph.getSearchGroups(data, '''href=['"]([^"^']+?/timelapse\.php[^"^']*?)['"][^>]+?title=['"]([^'^"]+?)['"]''', 2, True)
  179. name = data[1]
  180. url = self.getFullUrl(data[0].replace('&amp;', '&'))
  181. if not url.startswith('http'): return urlsTab
  182. sts, data = self.cm.getPage(url)
  183. if not sts: return urlsTab
  184. url = self.cm.ph.getSearchGroups(data, '''url:['"]([^"^']+?)["']''', 1, True)[0]
  185. if '://' in url:
  186. urlsTab.append({'name':name, 'url':url})
  187. return urlsTab