Advertisement
Guest User

JTV default.py

a guest
Jan 31st, 2014
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 27.95 KB | None | 0 0
  1. ## Credit to Stacked for the original plugin.
  2. ## Thanks to toastcutter for save passwords patch
  3.  
  4. import urllib
  5. import urllib2
  6. import os
  7. from urlparse import urlparse, parse_qs
  8.  
  9. import StorageServer
  10. import json
  11.  
  12. import xbmcplugin
  13. import xbmcgui
  14. import xbmcaddon
  15. import xbmcvfs
  16.  
  17. addon = xbmcaddon.Addon()
  18. addon_id = addon.getAddonInfo('id')
  19. addon_version = addon.getAddonInfo('version')
  20. addon_profile = xbmc.translatePath(addon.getAddonInfo('profile')).encode('utf-8')
  21. addon_path = xbmc.translatePath(addon.getAddonInfo('path')).encode('utf-8')
  22. addon_icon = addon.getAddonInfo('icon')
  23. addon_fanart = addon.getAddonInfo('fanart')
  24. j_nick = addon.getSetting('nickname')
  25. j_pass = addon.getSetting('password')
  26. cache = StorageServer.StorageServer("Jtv_Archives", 24)
  27. search_queries = os.path.join(addon_profile, 'search_queries')
  28. passwords_file = os.path.join(addon_profile, 'passwords')
  29. blacklist_file = os.path.join(addon_profile, 'blacklist')
  30. favorites_file = os.path.join(addon_profile, 'favorites')
  31. api_url = 'http://api.justin.tv/api'
  32. def tfalse(r,d=False): ## Get True / False
  33. if (r.lower()=='true' ) or (r.lower()=='t') or (r.lower()=='y') or (r.lower()=='1') or (r.lower()=='yes'): return True
  34. elif (r.lower()=='false') or (r.lower()=='f') or (r.lower()=='n') or (r.lower()=='0') or (r.lower()=='no'): return False
  35. else: return d
  36. i_entries=addon.getSetting('num_of_channels')
  37. show_blacklisted=tfalse(addon.getSetting('show_blacklisted'))
  38.  
  39. languages = {
  40. 'Swedish': 'sv',
  41. 'Icelandic': 'is',
  42. 'Estonian': 'et',
  43. 'Vietnamese': 'vi',
  44. 'Romanian': 'ro',
  45. 'Slovenian': 'sl',
  46. 'Hindi': 'hi',
  47. 'Dutch': 'nl',
  48. 'Korean': 'ko',
  49. 'Danish': 'da',
  50. 'Indonesian': 'id',
  51. 'Hungarian': 'hu',
  52. 'Ukrainian': 'uk',
  53. 'Lithuanian': 'lt',
  54. 'French': 'fr',
  55. 'Catalan': 'ca',
  56. 'Russian': 'ru',
  57. 'Thai': 'th',
  58. 'Croatian': 'hr',
  59. '简体中文': 'zh-cn',
  60. 'Finnish': 'fi',
  61. 'Hebrew': 'he',
  62. 'Bulgarian': 'bg',
  63. 'Turkish': 'tr',
  64. 'Greek': 'el',
  65. 'Latvian': 'lv',
  66. 'English': 'en',
  67. 'PortugueseBrazil': 'pt-br',
  68. 'Italian': 'it',
  69. 'Portuguese': 'pt',
  70. 'ChineseTW': 'zh-tw',
  71. 'German': 'de',
  72. 'Japanese': 'ja',
  73. 'Norsk (Bokmål)': 'nb',
  74. 'Czech': 'cs',
  75. 'Slovak': 'sk',
  76. 'Spanish': 'es',
  77. 'Polish': 'pl',
  78. 'Arabic': 'ar',
  79. 'Tagalog': 'tl'
  80. }
  81.  
  82. try: from sqlite3 import dbapi2 as orm
  83. except: from pysqlite2 import dbapi2 as orm
  84. DB='sqlite'; DB_DIR=os.path.join(xbmc.translatePath("special://database"),'Textures13.db');
  85. if os.path.isfile(DB_DIR)==True: print "Texture Database Found: "+DB_DIR;
  86. else: print "Unable to locate Texture Database"
  87.  
  88. def unCacheAnImage(url):
  89. if os.path.isfile(DB_DIR)==True:
  90. db=orm.connect(DB_DIR);
  91. #g='Select cachedurl FROM texture WHERE url = "'+url+'";'; print g;
  92. #a=db.execute(g); print str(a);
  93. s='DELETE FROM texture WHERE url = "'+url+'";'; print s;
  94. db.execute(s);
  95. db.commit(); db.close();
  96.  
  97. def addon_log(string):
  98. try:
  99. log_message = string.encode('utf-8', 'ignore')
  100. except:
  101. log_message = 'addonException: addon_log: %s' %format_exc()
  102. xbmc.log("[%s-%s]: %s" %(addon_id, addon_version, log_message), level=xbmc.LOGNOTICE)
  103.  
  104.  
  105. def make_request(url, headers=None, get_url=False):
  106. addon_log('Request: '+url)
  107. if headers is None:
  108. headers = {
  109. 'User-agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0',
  110. 'Referer' : 'http://www.justin.tv/'
  111. }
  112. try:
  113. req = urllib2.Request(url,None,headers)
  114. response = urllib2.urlopen(req)
  115. if get_url:
  116. data = response.geturl()
  117. else:
  118. data = response.read()
  119. # addon_log(str(response.info()))
  120. response.close()
  121. return data
  122. except urllib2.URLError, e:
  123. data = None
  124. errorStr = str(e.read())
  125. addon_log('We failed to open "%s".' %url)
  126. if hasattr(e, 'reason'):
  127. addon_log('We failed to reach a server.')
  128. addon_log('Reason: %s' %e.reason)
  129. if hasattr(e, 'code'):
  130. addon_log('We failed with error code - %s.' %e.code)
  131.  
  132.  
  133. def get_lang_code(language):
  134. for i in LANGUAGES.items():
  135. if i[1] == language:
  136. lang_code = i[0]
  137. return lang_code
  138.  
  139.  
  140. def get_category_list():
  141. return make_request(api_url + '/category/list.json')
  142.  
  143.  
  144. def display_main_dir():
  145. all_icon = os.path.join(addon_path, 'resources', 'icons','all.png')
  146. fav_icon = os.path.join(addon_path, 'resources', 'icons','fav.png')
  147. jfav_icon = os.path.join(addon_path, 'resources', 'icons','jfav.png')
  148. search_icon = os.path.join(addon_path, 'resources', 'icons', 'search.png')
  149. if xbmcvfs.exists(favorites_file):
  150. favorites_list = open(favorites_file).read()
  151. if favorites_list:
  152. add_dir('Favorites', 'get_favorites', fav_icon, 'get_favorites')
  153. justin_user_name = addon.getSetting('j_user')
  154. if justin_user_name:
  155. add_dir('%s Favorites / Follows' %justin_user_name, justin_user_name, jfav_icon, 'get_justin_favorites')
  156. add_dir('All', '', all_icon, 'get_all')
  157. data = json.loads(cache.cacheFunction(get_category_list))
  158. for i in data.keys():
  159. if data[i]['name'] in ['Creativity', 'Poker']:
  160. item_icon = all_icon
  161. else:
  162. item_icon = os.path.join(addon_path, 'resources', 'icons', data[i]['icon'].split('/')[-1])
  163. add_dir(data[i]['name'], 'subcategory', item_icon, 'get_subcategories', {'category_id': i})
  164. add_dir('Enter Channel Name', 'get_channel', all_icon,'get_channel')
  165. add_dir('Search', 'get_search', search_icon, 'get_search')
  166. return end_of_dir()
  167.  
  168.  
  169. def display_subcategories(category_id, iconimage):
  170. data = json.loads(cache.cacheFunction(get_category_list))
  171. if len(data[category_id]['subcategories'].keys()) == 1:
  172. sub_category = data[category_id]['subcategories'].keys()[0]
  173. return get_channels(sub_category, category_id)
  174. if len(data[category_id]['subcategories'].keys()) > 1:
  175. add_dir('All', '', iconimage, 'get_channels', {'category_id': category_id})
  176. items = data[category_id]['subcategories']
  177. for i in items.keys():
  178. info = {'category_id': category_id, 'sub_category': i}
  179. add_dir(items[i]['name'], 'display_channels', iconimage, 'get_channels', info)
  180. return end_of_dir()
  181. return get_channels(None, category_id)
  182.  
  183.  
  184. def get_channels(sub_category, category_id, page=None):
  185. url = api_url + '/stream/list.json?'
  186. if category_id:
  187. url += 'category=%s' %category_id
  188. if sub_category:
  189. url +='&subcategory=%s' %sub_category
  190. if not addon.getSetting('lang') == "None":
  191. url += '&language=%s' %languages[addon.getSetting('lang')]
  192. if not addon.getSetting('lang1') == "None":
  193. url += ',%s' %languages[addon.getSetting('lang1')]
  194. if page is None:
  195. page = 1
  196. else:
  197. page = int(page)
  198. url += '&limit='+str(i_entries)+'&offset=%s' %((page -1) * int(i_entries))
  199. addon_log('LiveData URL: %s' %url)
  200. data = make_request(url)
  201. if data:
  202. return display_channels(data, sub_category, category_id, page)
  203.  
  204.  
  205. def display_channels(data, sub_category, category_id, page):
  206. data = json.loads(data)
  207. if not isinstance(data, list):
  208. addon_log('data type: %s' %type(data))
  209. data = [data]
  210. addon_log('json data: %s' %data)
  211. addon_log('Len Data: %s' %str(len(data)))
  212. addon_log('page: %s' %str(page))
  213. try:
  214. blacklist = json.loads(open(blacklist_file).read())
  215. except:
  216. blacklist = None
  217. desc_keys = [
  218. 'video_bitrate',
  219. 'video_codec',
  220. 'audio_codec',
  221. 'video_height',
  222. 'video_width',
  223. 'category',
  224. 'subcategory',
  225. 'up_time',
  226. 'geo',
  227. 'meta_game',
  228. 'language',
  229. 'stream_count',
  230. 'channel_view_count',
  231. 'featured',
  232. 'broadcast_part',
  233. 'name',
  234. 'stream_type'
  235. ]
  236. for i in data:
  237. if not i.has_key('channel'):
  238. addon_log('No channel data: %s' %i)
  239. info = {}
  240.  
  241. desc = ' | '.join(['%s: %s' %(k.replace('_', ' ').title(), i[k]) for
  242. k in desc_keys if i.has_key(k) and i[k]])
  243. if desc:
  244. info['plot'] = desc
  245. if i.has_key('channel'):
  246. if i['channel'].has_key('login') and i['channel']['login']:
  247. name = i['channel']['login']
  248. elif i.has_key('login') and i['login']:
  249. name = i['login']
  250. elif i.has_key('name') and i['name']:
  251. name = i['name'].split('user_')[-1]
  252. else:
  253. try:
  254. name = str(i['image_url_medium']).split('/')[-1].split('-')[0]
  255. except:
  256. addon_log('Name not found: %s' %i)
  257. continue
  258. if (blacklist) and (name in blacklist) and (show_blacklisted==False):
  259. addon_log('Channel: %s - Blacklisted' %name)
  260. continue
  261. if i.has_key('channel'):
  262. if (i['channel'].has_key('status') and i['channel']['status'] and
  263. i['channel']['status'] != 'Broadcasting LIVE on Justin.tv'):
  264. info['title'] = i['channel']['status']
  265. elif i['channel'].has_key('title') and i['channel']['title']:
  266. info['title'] = i['channel']['title']
  267. elif i.has_key('title') and i['title']:
  268. info['title'] = i['title']
  269. else:
  270. info['title'] = name
  271.  
  272. thumb = None
  273. fanart = None
  274. if addon.getSetting('fanart') == "true":
  275. if i.has_key('channel'):
  276. if i['channel'].has_key('image_url_huge') and i['channel']['image_url_huge']:
  277. fanart = i['channel']['image_url_huge']
  278. elif i.has_key('image_url_huge') and i['image_url_huge']:
  279. fanart = i['image_url_huge']
  280. info['fanart'] = fanart
  281. if addon.getSetting('use_channel_icon') == "0" and fanart:
  282. thumb = fanart
  283. if not thumb:
  284. if i.has_key('channel'):
  285. if i['channel'].has_key('screen_cap_url_large') and i['channel']['screen_cap_url_large']:
  286. thumb = i['channel']['screen_cap_url_large']
  287. elif i['channel'].has_key('image_url_large') and i['channel']['image_url_large']:
  288. thumb = i['channel']['image_url_large']
  289. elif i.has_key('image_url_large') and i['image_url_large']:
  290. thumb = i['image_url_large']
  291. if not thumb:
  292. addon_log('No Thumb')
  293. thumb = addon_icon
  294. if not fanart:
  295. addon_log('No Fanart')
  296. fanart = addon_fanart
  297. unCacheAnImage(thumb)
  298. add_dir(name, 'play_stream', thumb, 'set_resolved_url', info, get_stream_info(i))
  299.  
  300. if not category_id == 'search':
  301. page_num = None
  302. if len(data) == int(i_entries):
  303. if page:
  304. page_num = page + 1
  305. else:
  306. page_num = 1
  307. if page_num:
  308. info = {'category_id': category_id, 'sub_category': sub_category, 'page': page_num}
  309. next_png = os.path.join(addon_path, 'resources', 'icons','next.png')
  310. add_dir('Next Page', 'load_more_channels', next_png, 'get_channels', info)
  311. return end_of_dir(True)
  312.  
  313.  
  314. def get_stream_info(item_dict):
  315. stream_info = {'video_info': {}, 'audio_info': {}}
  316. if item_dict.has_key('video_codec') and item_dict['video_codec']:
  317. stream_info['video_info']['codec'] = item_dict['video_codec']
  318. if item_dict.has_key('video_height') and item_dict['video_height']:
  319. stream_info['video_info']['height'] = item_dict['video_height']
  320. if item_dict.has_key('video_width') and item_dict['video_width']:
  321. stream_info['video_info']['width'] = item_dict['video_width']
  322. if (item_dict.has_key('audio_codec') and
  323. item_dict['audio_codec'] and item_dict['audio_codec'] != '???'):
  324. stream_info['audio_info']['codec'] = item_dict['audio_codec']
  325. return stream_info
  326.  
  327.  
  328. def get_user_data(user_name):
  329. url = api_url + '/user/show/%s.json' %user_name
  330. data = make_request(url)
  331. if data and not data == '[]':
  332. addon_log('User Data: %s' %data)
  333. return data
  334.  
  335.  
  336. def get_user_favorites(justin_user_name):
  337. url = api_url + '/user/favorites/%s.json?limit=100' %justin_user_name
  338. if addon.getSetting('live_only') == "true":
  339. url += '&live=true'
  340. data = make_request(url)
  341. if data:
  342. return display_channels(data, '', '', None)
  343.  
  344.  
  345. def display_channel_archives(name, url=None):
  346. if url is None:
  347. url = api_url + '/channel/archives/%s.json' %name
  348. responce = make_request(url)
  349. next_png = os.path.join(addon_path, 'resources', 'icons','next.png')
  350. if responce and responce != '[]':
  351. data = json.loads(responce)
  352. for i in data:
  353. info = {}
  354. info['plot'] = ' | '.join(['%s: %s' %(k.replace('_', ' ').title(), i[k]) for
  355. k in i.keys() if i[k]])
  356. stream_url = i['video_file_url']
  357. thumb = i['image_url_medium']
  358. info['title'] = i['title'].encode('utf-8')
  359. if i.has_key('broadcast_part') and i['broadcast_part']:
  360. info['title'] += ' - Part: %s' %i['broadcast_part'].encode('utf-8')
  361. if i.has_key('length') and i['length']:
  362. info['duration'] = int(i['length']) / 60
  363. add_dir(info['title'], stream_url, thumb, 'set_archive_url', info, get_stream_info(i))
  364.  
  365. if len(data) == int(i_entries):
  366. if not 'offset=' in url:
  367. url = url + '?offset='+str(i_entries)
  368. else:
  369. offset = int(url.split('offset=')[1])
  370. url = url.split('?')[0]+'?offset=%s' %(offset + int(i_entries))
  371. add_dir('Next Page', url, next_png, 'get_channel_archives')
  372. return end_of_dir(True)
  373. else:
  374. notify('No archives found for channel: %s' %name)
  375.  
  376.  
  377. def notify(message):
  378. xbmc.executebuiltin("XBMC.Notification(Addon Notification,%s,5000,%s)"
  379. %(message, addon_icon))
  380.  
  381.  
  382. def resolve_url(channel_name, password=None):
  383. url = 'https://api.twitch.tv/api/channels/%s/access_token?as3=t' %channel_name
  384. data = json.loads(make_request(url))
  385. if not data:
  386. addon_log('No Data: api.twitch.tv')
  387. notify('Channel data not found')
  388. return
  389. token_data = json.loads(data['token'])
  390. for i in token_data:
  391. addon_log('%s: %s' %(i, token_data[i]))
  392.  
  393. private_code = 'null'
  394. if not token_data['private']['allowed_to_view']:
  395. if token_data['needed_info']:
  396. addon_log('needed_info: %s' %token_data['needed_info'])
  397. if 'private' in token_data['needed_info']:
  398. if not password:
  399. password = get_password(channel_name)
  400. private_code = urllib2.quote(password)
  401. params = [
  402. 'nauthsig=%s' %data['sig'],
  403. 'player=jtvweb',
  404. 'private_code=%s' %private_code,
  405. 'type=any',
  406. 'nauth=%s' %urllib2.quote(data['token']),
  407. 'allow_source=true',
  408. ]
  409. stream_url = 'http://usher.twitch.tv/select/%s.json?' %channel_name + '&'.join(params)
  410. return stream_url
  411.  
  412.  
  413. def set_resolved_url(resolved_url):
  414. success = False
  415. if resolved_url:
  416. success = True
  417. else:
  418. resolved_url = ''
  419. item = xbmcgui.ListItem(path=resolved_url)
  420. xbmcplugin.setResolvedUrl(int(sys.argv[1]), success, item)
  421.  
  422.  
  423. def loadPasswords():
  424. passwords = {}
  425. if addon.getSetting('save_passwords') == 'true':
  426. if xbmcvfs.exists(passwords_file):
  427. passwords = json.loads(open(passwords_file).read())
  428. return passwords
  429.  
  430.  
  431. def savePasswords(passwords):
  432. if addon.getSetting('save_passwords') == 'true':
  433. f = open(passwords_file, "w")
  434. f.write(json.dumps(passwords))
  435. f.close()
  436.  
  437.  
  438. def get_password(name):
  439. passwords = loadPasswords()
  440. password = ''
  441. if name in passwords:
  442. password = passwords[name]
  443. keyboard = xbmc.Keyboard(password,'Enter Password')
  444. keyboard.doModal()
  445. if (keyboard.isConfirmed() == False):
  446. return
  447. password = keyboard.getText()
  448. passwords[name] = password
  449. savePasswords(passwords)
  450. if len(password) == 0:
  451. return None
  452. else:
  453. return password
  454.  
  455.  
  456. def add_dir(name, url, iconimage, mode, info={}, stream_info={}):
  457. isfolder = True
  458. fanart = addon_fanart
  459. params = {'name': name, 'url': url, 'mode': mode, 'iconimage': iconimage}
  460. if info.has_key('category_id') and info['category_id']:
  461. params['category_id'] = info['category_id']
  462. if info.has_key('sub_category') and info['sub_category']:
  463. params['sub_category'] = info['sub_category']
  464. if info.has_key('page'):
  465. params['page'] = info['page']
  466. url = '%s?%s' %(sys.argv[0], urllib.urlencode(params))
  467. if info.has_key('title'):
  468. title = info['title']
  469. else:
  470. title = name
  471. listitem = xbmcgui.ListItem(title, iconImage=iconimage, thumbnailImage=iconimage)
  472. if stream_info:
  473. if stream_info['video_info'].keys():
  474. listitem.addStreamInfo('video', stream_info['video_info'])
  475. if stream_info['audio_info'].keys():
  476. listitem.addStreamInfo('audio', stream_info['audio_info'])
  477. if info.has_key('fanart') and info['fanart']:
  478. fanart = info['fanart']
  479. listitem.setProperty("Fanart_Image", fanart)
  480. context_menu = []
  481. if info.has_key('fav'):
  482. context_menu.append(
  483. ('Remove from Jtv Favorites',
  484. 'XBMC.RunPlugin(%s?mode=remove_fav&name=%s)'
  485. %(sys.argv[0], urllib.quote(name))))
  486. else:
  487. context_menu.append(
  488. ('Add to Jtv Favorites',
  489. 'XBMC.RunPlugin(%s?mode=add_favorite&params=%s&info=%s)'
  490. %(sys.argv[0], urllib.quote(json.dumps(params)),
  491. urllib.quote(json.dumps(info)))))
  492. if mode in ['resolve_url', 'set_resolved_url', 'set_archive_url']:
  493. isfolder = False
  494. listitem.setProperty('IsPlayable', 'true')
  495. listitem.setInfo('video', infoLabels=info)
  496. context_menu.append(
  497. ('Get Channel Archives',
  498. 'XBMC.Container.Update(%s?mode=get_channel_archives&name=%s)'
  499. %(sys.argv[0], urllib.quote(name))))
  500. context_menu.append(
  501. ('Run IrcChat',
  502. "RunScript(script.ircchat,"
  503. "run_irc=True&nickname=%s&username=%s&password=%s&host=%s&channel=%s)"
  504. %(j_nick, j_nick, j_pass, 'irc.twitch.tv', name)))
  505. context_menu.append(
  506. ('Blacklist Channel','XBMC.RunPlugin(%s?mode=blacklist_channel&name=%s)'
  507. %(sys.argv[0], urllib.quote(name))))
  508. if mode == 'search' and name == 'Previous Search Queries':
  509. context_menu.append(
  510. ('Remove',
  511. 'XBMC.Container.Update(%s?mode=remove_query&name=%s)'
  512. %(sys.argv[0], urllib.quote(name))))
  513. listitem.addContextMenuItems(context_menu)
  514. xbmcplugin.addDirectoryItem(int(sys.argv[1]), url, listitem, isfolder)
  515.  
  516.  
  517. def search(search_q, url=None):
  518. if search_q == 'Previous Search Queries':
  519. search_icon = os.path.join(addon_path, 'resources', 'icons', 'search.png')
  520. search_list = json.loads(open(search_queries).read())
  521. for i in search_list:
  522. addon_log('search type: %s' %type(i))
  523. if isinstance(i, list):
  524. # prior to 4.0 will return a list
  525. title = i[0]
  526. else:
  527. title = i
  528. add_dir(title, 'saved_search_query', search_icon, 'search')
  529. return end_of_dir()
  530.  
  531. elif search_q == 'New Search':
  532. keyboard = xbmc.Keyboard('','Search')
  533. keyboard.doModal()
  534. if (keyboard.isConfirmed() == False):
  535. return
  536. search_q = keyboard.getText()
  537. if len(search_q) == 0:
  538. return
  539. if addon.getSetting('save_search') == 'true':
  540. search_file = xbmcvfs.exists(search_queries)
  541. if not search_file:
  542. search_list = []
  543. else:
  544. search_list = json.loads(open(search_queries).read())
  545. search_list.append(search_q)
  546. a = open(search_queries, "w")
  547. a.write(json.dumps(search_list))
  548. a.close()
  549.  
  550. url = 'http://api.justin.tv/api/stream/search/%s.json' %urllib.quote(search_q)
  551. addon_log('Search URL: '+url)
  552. data = make_request(url)
  553. if data:
  554. return display_channels(data, sub_category, category_id, None)
  555. else:
  556. return notify('No Results for: %s' %search_q)
  557.  
  558.  
  559. def remove_search(name):
  560. search_list = json.loads(open(search_queries).read())
  561. for i in range(len(search_list)):
  562. if name in search_list[i]:
  563. del search_list[i]
  564. a = open(search_queries, "w")
  565. a.write(json.dumps(search_list))
  566. a.close()
  567. return xbmc.executebuiltin('Container.Refresh')
  568.  
  569.  
  570. def get_search():
  571. if addon.getSetting('save_search') == 'true':
  572. search_file = xbmcvfs.exists(search_queries)
  573. if search_file:
  574. search_icon = os.path.join(addon_path, 'resources', 'icons', 'search.png')
  575. add_dir('New Search', 'new_search', search_icon, 'search')
  576. add_dir('Previous Search Queries', 'previous_search', search_icon, 'search')
  577. return end_of_dir()
  578. else:
  579. return search('New Search')
  580.  
  581.  
  582. def get_channel(channel_name, play=False, password=None):
  583. if channel_name == 'Enter Channel Name':
  584. keyboard = xbmc.Keyboard('','Channel Name')
  585. keyboard.doModal()
  586. if (keyboard.isConfirmed() == False):
  587. return
  588. channel_name = keyboard.getText()
  589. if len(channel_name) == 0:
  590. return
  591.  
  592. user_data = get_user_data(channel_name)
  593. if not user_data:
  594. return notify('Did not find channel: %s' %channel_name)
  595.  
  596. url = api_url + '/stream/list.json?channel=%s' %channel_name
  597. data = make_request(url)
  598. if not data or data == '[]':
  599. display_channels(user_data, None, 'channel', None)
  600. dialog = xbmcgui.Dialog()
  601. ret = dialog.yesno('%s is a valid channel' %channel_name,
  602. 'The channel does not seem to be live\n',
  603. 'Do you want to check for archives?')
  604. if ret:
  605. return display_channel_archives(channel_name, password)
  606. else:
  607. if play == 'player':
  608. return xbmc.Player().play(resolve_url(channel_name, password))
  609. elif play:
  610. return set_resolved_url(resolve_url(channel_name, password))
  611. return display_channels(data, None, 'channel', None)
  612.  
  613.  
  614. def display_favorites():
  615. favorites_list = open(favorites_file).read()
  616. for i in json.loads(favorites_list):
  617. if isinstance(i[0], dict):
  618. i[1]['fav'] = True
  619. add_dir(i[0]['name'], i[0]['url'], i[0]['iconimage'], i[0]['mode'], i[1])
  620. else:
  621. # pre version 0.4 favorite
  622. info = {'title': i[2].encode('utf-8'), 'fav': True}
  623. add_dir(i[0], 'get_channel', i[1], 'get_channel', info)
  624. return end_of_dir(True)
  625.  
  626.  
  627. def add_favorite(params, info):
  628. info = json.loads(info)
  629. params = json.loads(params)
  630. if info.has_key('title'):
  631. title = info['title']
  632. else:
  633. title = params['name']
  634. keyboard = xbmc.Keyboard(title, 'Rename?')
  635. keyboard.doModal()
  636. if (keyboard.isConfirmed() == False):
  637. return
  638. title = keyboard.getText()
  639. if len(title) == 0:
  640. return
  641. info['title'] = title
  642. if xbmcvfs.exists(favorites_file):
  643. favorites_list = open(favorites_file).read()
  644. if favorites_list:
  645. fav_list = json.loads(favorites_list)
  646. else:
  647. fav_list = []
  648. else:
  649. fav_list = []
  650. fav_list.append((params, info))
  651. a = open(favorites_file, "w")
  652. a.write(json.dumps(fav_list))
  653. a.close()
  654.  
  655.  
  656. def remove_favorite(name):
  657. data = json.loads(favorites_list)
  658. for i in range(len(data)):
  659. if isinstance(data[i][0], dict):
  660. if name in data[i][0]['name']:
  661. del data[i]
  662. break
  663. elif name in data[i]:
  664. del data[i]
  665. break
  666. a = open(favorites_file, "w")
  667. a.write(json.dumps(data))
  668. a.close()
  669. return xbmc.executebuiltin('Container.Refresh')
  670.  
  671.  
  672. def blacklist_channel(name):
  673. blacklist_ = xbmcvfs.exists(blacklist_file)
  674. if not blacklist_:
  675. black_list = []
  676. else:
  677. black_list = json.loads(open(blacklist_file, "r").read())
  678. black_list.append(name)
  679. f = open(blacklist_file, "w")
  680. f.write(json.dumps(black_list))
  681. f.close
  682. return xbmc.executebuiltin('Container.Refresh')
  683.  
  684.  
  685. def get_params():
  686. p = parse_qs(sys.argv[2][1:])
  687. for i in p.keys():
  688. p[i] = p[i][0]
  689. return p
  690.  
  691.  
  692. def set_view_mode():
  693. view_modes = {
  694. '0': '502', # List
  695. '1': '51', # Big List
  696. '2': '500', # Thumbnails
  697. '3': '501', # Poster Wrap
  698. '4': '508', # Fanart
  699. '5': '504', # Media info
  700. '6': '503', # Media info 2
  701. '7': '515' # Media info 3
  702. }
  703. view_mode = addon.getSetting('view_mode')
  704. if view_mode == '8':
  705. return
  706. xbmc.executebuiltin('Container.SetViewMode(%s)' %view_modes[view_mode])
  707.  
  708.  
  709. def end_of_dir(set_content=False):
  710. xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_UNSORTED)
  711. xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_LABEL)
  712. if set_content:
  713. xbmcplugin.setContent(int(sys.argv[1]), 'movies')
  714. set_view_mode()
  715. xbmcplugin.endOfDirectory(int(sys.argv[1]))
  716.  
  717.  
  718. params = get_params()
  719. addon_log("params: %s" %params)
  720. try:
  721. mode = params['mode']
  722. except:
  723. mode = None
  724.  
  725. if mode == None:
  726. display_main_dir()
  727.  
  728. elif mode == 'get_all':
  729. get_channels(None, None)
  730.  
  731. elif mode == 'get_subcategories':
  732. display_subcategories(params['category_id'], params['iconimage'])
  733.  
  734. elif mode == 'get_channels':
  735. page = None
  736. sub_category = None
  737. if params.has_key('page'):
  738. page = params['page']
  739. if params.has_key('sub_category'):
  740. sub_category = params['sub_category']
  741. get_channels(sub_category, params['category_id'], page)
  742.  
  743. elif mode == 'set_resolved_url':
  744. set_resolved_url(resolve_url(params['name']))
  745. xbmc.sleep(3000)
  746. if addon.getSetting('run_chat') == 'true':
  747. xbmc.executebuiltin(
  748. "RunScript(script.ircchat,"
  749. "run_irc=True&nickname=%s&username=%s&password=%s&host=%s&channel=%s)"
  750. %(j_nick, j_nick, j_pass, 'irc.twitch.tv', params['name']))
  751.  
  752. elif mode == 'get_search':
  753. get_search()
  754.  
  755. elif mode == 'get_channel':
  756. play = False
  757. if params.has_key('play') and params['play']:
  758. play = params['play']
  759. password = False
  760. if params.has_key('password') and params['password']:
  761. password = params['password']
  762. get_channel(params['name'], play, password)
  763.  
  764. elif mode == 'get_favorites':
  765. display_favorites()
  766.  
  767. elif mode == 'get_channel_archives':
  768. url = None
  769. if params.has_key('url'):
  770. url = params['url']
  771. display_channel_archives(params['name'], url)
  772.  
  773. elif mode == 'add_favorite':
  774. add_favorite(params['params'], params['info'])
  775.  
  776. elif mode == 'remove_fav':
  777. remove_favorite(params['name'])
  778.  
  779. elif mode == 'set_archive_url':
  780. set_resolved_url(params['url'])
  781.  
  782. elif mode == 'get_justin_favorites':
  783. get_user_favorites(params['url'])
  784.  
  785. elif mode == 'search':
  786. search(params['name'], params['url'])
  787.  
  788. elif mode == 'remove_query':
  789. remove_search(params['name'])
  790.  
  791. elif mode == 'blacklist_channel':
  792. blacklist_channel(params['name'])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement