def play(url): url = url.decode('utf-8', 'ignore') resolved = u'' try: import urlresolver resolved = urlresolver.HostedMediaFile(url).resolve() vitem = ListItem(label=url, path=resolved) vitem.is_folder = False vitem.set_is_playable = True vitem.set_info(type='video', info_labels={'Title': url}) vitem.add_stream_info(stream_type='video', stream_values={}) plugin.set_resolved_url(resolved) return plugin.play_video(vitem) except: plugin.notify( msg="Failed to resolve {0} to a playable video.".format(url)) try: if resolved is None or len(resolved) < 5: import YoutubeDLWrapper ytdl = YoutubeDLWrapper._getYTDL() ytdl.clearDownloadParams() resolved = ytdl.extract_info(url, download=False) vitem = ListItem(label=url, path=resolved) vitem.is_folder = False vitem.set_is_playable = True vitem.set_info(type='video', info_labels={'Title': url}) vitem.add_stream_info(stream_type='video', stream_values={}) plugin.set_resolved_url(resolved) return plugin.play_video(vitem) except: plugin.notify( msg="Failed to resolve {0} to a playable video.".format(url)) return None
def test_select(self): with patch.object(xbmcgui.ListItem, 'select') as mock_select: item = ListItem() item.selected = True mock_select.assert_called_with(True) item.select(False) mock_select.assert_called_with(False)
def javmagnet(qbbb='qb',gid='0',uc='0'): menus=[] baseurl=javbusurl['base'] if qbbb=='om': baseurl=javbusurl['om'] #try: rspmagnet=_http('%s/ajax/uncledatoolsbyajax.php?gid=%s&uc=%s&floor=1'%(baseurl,gid,uc),referer=baseurl) #xbmc.log(rspmagnet) leechmagnet = re.compile('onmouseover.*?href="(?P<magnet>magnet.*?)">\s*(?P<title>.*?)\s*</a>.*?href.*?">\s*(?P<filesize>.*?)\s*</a>.*?href.*?">\s*(?P<createdate>.*?)\s*</a>', re.S) #if qbbb=='om': # leechmagnet = re.compile(r'onmouseover.*?\x29">\s*(?P<title>.*?)\s*</td>.*?">\s*(?P<filesize>.*?)\s*</td>.*?">\s*(?P<createdate>.*?)\s*</td>.*?href="(?P<magnet>magnet.*?)">', re.S) for match in leechmagnet.finditer(rspmagnet): magnet=match.group('magnet') title=match.group('title') title = re.sub("<a\x20.*?>", "|", title) filesize=match.group('filesize') createdate=match.group('createdate') filemsg ='大小:'+filesize+' 创建时间:'+createdate listitem=ListItem(label=comm.colorize_label(title, 'bt'), label2=filesize, icon=None, thumbnail=xbmc.translatePath( os.path.join( IMAGES_PATH, 'magnet.jpg') ), path=plugin.url_for('execmagnet', url=six.ensure_binary(magnet),title=six.ensure_binary(title),msg=six.ensure_binary(filemsg))) menus.append(listitem) return menus #except: plugin.notify('自带磁力获取失败') return
def episode_makeitem(episodename, episodelink): ''' Will return a ListItem for the given link to an episode and it's full linked name. Name will be sent to format show to attempt to parse out a date or season from the title. Infolabels are populated with any details that can be parsed from the title as well. Should be used anytime an item needs to be created that is an item for one specific episode of a show. Latest 350, Saved Show, Category (Show listing of all episodes for that series) would all use this. ''' infolbl = {} spath = plugin.url_for(episode, name=episodename, url=episodelink) img = "DefaultVideoFolder.png" seasonstr = '' try: eptitle, epdate, epnum = formatshow(episodename) eplbl = formatlabel(eptitle, epdate, epnum) plotstr = "{0} ({1}): {2} {3}".format(epdate, epnum, eptitle, episodelink) infolbl = {'Date': epdate, 'Title': eptitle, 'Plot': plotstr} if len(epnum) > 0: showS, showE = findepseason(epnum) dictshow = {'Episode': showE, 'Season': showS} infolbl.update(dictshow) snum = int(showS) epnum = int(showE) if snum > 0 and epnum > 0: epdate = "S{0}e{1}".format(snum, epnum) item = {'label': eplbl, 'label2': epdate, 'icon': img, 'thumbnail': img, 'path': spath} item.setdefault(item.keys()[0]) li = ListItem.from_dict(**item) li.set_info(type='video', info_labels=infolbl) li.add_context_menu_items([('Search [B]{0}[/B]'.format(eptitle), 'RunPlugin({0})'.format(plugin.url_for(query, searchquery=eptitle)),)]) except: li = ListItem(label=episodename, label2=episodelink, icon=img, thumbnail=img, path=spath) return li
def video_detail(seasonId): detail = Meiju.video_detail(seasonId) title = detail["data"]["seasonDetail"]["title"] SEASON_CACHE[seasonId] = detail["data"] # store season detail history = HISTORY.get("list", None) playing_episode = "0" if history is not None: for l in history: if l["seasonId"] == seasonId: playing_episode = l["index"] for episode in detail["data"]["seasonDetail"]["episode_brief"]: label = title + episode["episode"] if episode["episode"] == playing_episode: label = "[B]" + colorize(label, "green") + "[/B]" item = ListItem( **{ 'label': label, 'path': plugin.url_for("play_season", seasonId=seasonId, index=episode["episode"], Esid=episode["sid"]), }) item.set_info( "video", { "plot": episode["text"], "TVShowTitle": episode["text"], "episode": int(episode["episode"]), "season": 0 }) item.set_is_playable(True) yield item plugin.set_content('episodes')
def test_label2(self): item = ListItem('foo') self.assertIsNone(item.label2) item.label2 = 'bar' self.assertEqual(item.label2, 'bar') item.set_label2('baz') self.assertEqual(item.get_label2(), 'baz')
def test_label(self): item = ListItem('foo') self.assertEqual(item.label, 'foo') item.label = 'bar' self.assertEqual(item.label, 'bar') item.set_label('baz') self.assertEqual(item.get_label(), 'baz')
def play(artist, track): data = getTrack(artist, track) print data item = ListItem() item.set_label('%s - %s' % (artist, track)) item.set_path(data['url']) item.set_played(True) xbmcplugin.setResolvedUrl(plugin.handle, True, item.as_xbmc_listitem())
def test_stream_info(self): with patch.object(xbmcgui.ListItem, 'addStreamInfo') as mock_stream_info: item = ListItem() item.add_stream_info('video', {'duration': 185}) mock_stream_info.assert_called_with('video', {'duration': 185}) item.add_stream_info('audio', {'languange': 'en'}) mock_stream_info.assert_called_with('audio', {'languange': 'en'})
def javstarlist(qbbb='qb', page=1): filter = '/actresses' pagestr = '' if int(page) > 1: pagestr = '/' + str(page) url = '%s%s%s' % (javbusurl[qbbb], filter, pagestr) try: rsp = _http(url) releech = 'avatar-box.*?href="%s/star/(?P<starid>.*?)">.*?src="(?P<starimg>.*?)".*?<span>(?P<starname>.*?)</span>' % ( javbusurl[qbbb]) # if qbbb=='om': # releech=r'star-frame2.*?href="%s/star/(?P<starid>.*?)".*?src="(?P<starimg>.*?)".*?title="(?P<starname>.*?)"'%(javbusurl[qbbb]) leech = re.compile(releech, re.S) menus = [] for match in leech.finditer(rsp): context_menu_items = [] context_menu_items.append(( '搜索' + colorize_label(match.group('starname').encode('UTF-8'), color='00FF00'), 'RunPlugin(' + plugin.url_for('searchinit', stypes='pan,bt', sstr=match.group('starname').encode('UTF-8'), modify='1', otherargs='{}') + ')', )) listitem = ListItem( label='优优:%s' % (match.group('starname')), thumbnail=match.group('starimg'), path=plugin.url_for('javlist', qbbb=qbbb, filtertype='star', filterkey=match.group('starid'), page=1), ) if len(context_menu_items) > 0 and listitem != None: listitem.add_context_menu_items(context_menu_items, False) menus.append(listitem) strnextpage = str(int(page) + 1) strnextpage = '/' + strnextpage + '">' + strnextpage + '</a>' if rsp.find(strnextpage) >= 0: menus.append({ 'label': '下一页', 'path': plugin.url_for('javstarlist', qbbb=qbbb, page=int(page) + 1), 'thumbnail': xbmc.translatePath(os.path.join( IMAGES_PATH, 'nextpage.png')).decode('utf-8') }) setthumbnail['set'] = True return menus except: plugin.notify('女优列表获取失败') return
def test_context_menu(self): menu_items = [('label1', 'foo'), ('label2', 'bar')] item = ListItem() item.add_context_menu_items(menu_items) self.assertEqual(item.get_context_menu_items(), menu_items) extra_menu_item = ('label3', 'baz') menu_items.append(extra_menu_item) item.add_context_menu_items([extra_menu_item]) self.assertEqual(item.get_context_menu_items(), menu_items)
def play(seasonId="", index="", Esid=""): season_data = SEASON_CACHE.get(seasonId) title = season_data["seasonDetail"]["title"] episode_sid = Esid rs = RRMJResolver() play_url, _ = rs.get_play(seasonId, episode_sid, plugin.get_setting("quality")) if play_url is not None: add_history(seasonId, index, Esid, title) li = ListItem(title + index, path=play_url) plugin.set_resolved_url(li)
def test_thumbnail(self): item = ListItem() self.assertIsNone(item.thumbnail) item.thumbnail = 'bar' self.assertEqual(item.thumbnail, 'bar') self.assertEqual(item.get_thumbnail(), 'bar') item.set_thumbnail('baz') self.assertEqual(item.thumbnail, 'baz') self.assertEqual(item.get_thumbnail(), 'baz')
def test_path(self): item = ListItem() self.assertIsNone(item.path) item.path = 'bar' self.assertEqual(item.path, 'bar') self.assertEqual(item.get_path(), 'bar') item.set_path('baz') self.assertEqual(item.path, 'baz') self.assertEqual(item.get_path(), 'baz')
def test_icon(self): item = ListItem() self.assertIsNone(item.icon) item.icon = 'bar' self.assertEqual(item.icon, 'bar') self.assertEqual(item.get_icon(), 'bar') item.set_icon('baz') self.assertEqual(item.icon, 'baz') self.assertEqual(item.get_icon(), 'baz')
def test_selected(self): item = ListItem() self.assertEqual(item.selected, False) self.assertEqual(item.is_selected(), False) item.selected = True self.assertEqual(item.selected, True) self.assertEqual(item.is_selected(), True) item.select(False) self.assertEqual(item.selected, False) self.assertEqual(item.is_selected(), False)
def btsearch(enginestr, sstr, sorttype): if not sstr or sstr == '0': return max = int(plugin.get_setting('btmaxresult')) max = (max + 1) * 20 items = [] if enginestr != 'all' and sorttype == '-1': engineinfo = nova2.getengineinfo(enginestr) supportsort = engineinfo['support_sort'] if len(supportsort) > 0: sortkeys = { 'relevance': '相关度', 'addtime': '创建时间', 'size': '文件大小', 'files': '文件数量', 'popular': '热度', } dialog = xbmcgui.Dialog() sortselectlist = [] for s in supportsort: sortselectlist.append(sortkeys[s]) sorttype = dialog.select(engineinfo['name'] + '选择排序类型', sortselectlist) if sorttype == -1: return None sorttype = supportsort[int(sorttype)] #plugin.notify(sorttype) result = nova2.search(enginestr, sstr, sorttype, maxresult=max) msg = '共找到%d条磁力链' % (len(result)) plugin.notify(msg) for res_dict in result: title = '[COLOR FF00FFFF]' + res_dict[ 'size'] + '[/COLOR]' + '[COLOR FFCCFFCC]' + res_dict[ 'date'][:10] + '[/COLOR]' + res_dict['name'].encode('UTF-8') filemsg = '大小:' + res_dict['size'].encode( 'UTF-8') + ' 创建时间:' + res_dict['date'].encode('UTF-8') listitem = ListItem(label=comm.colorize_label(title, 'bt'), label2=res_dict['size'], icon=None, thumbnail=None, path=plugin.url_for( 'execmagnet', url=res_dict['link'].encode('UTF-8'), title=title, msg=filemsg)) #listitem.set_info('picture', {'size': anySizeToBytes(res_dict['size'])}) context_menu_items = [] if (list == 'other'): titletype = title items.append(listitem) return items
def play_movie(imdb_id, year, title): xbmcvfs.mkdirs( 'special://profile/addon_data/plugin.video.search.and.play/Movies.play' ) name = 'special://profile/addon_data/plugin.video.search.and.play/Movies.play/%s.strm' % ( imdb_id) f = xbmcvfs.File(name, "wb") movie_library_url = plugin.get_setting('movie.library.url') number = plugin.get_setting('movie.library.number') if number == "0": meta_url = plugin.get_setting('movie.library') movie_library_addon = plugin.get_setting('movie.library.addon') elif number == "1": meta_url = plugin.get_setting('movie.library2') movie_library_addon = plugin.get_setting('movie.library2.addon') else: meta_url = plugin.get_setting('movie.library3') movie_library_addon = plugin.get_setting('movie.library3.addon') if movie_library_url == "true" and meta_url: if movie_library_addon: meta_url = re.sub('plugin://.*?/', 'plugin://%s/' % movie_library_addon, meta_url) if "%M" in meta_url: what = base64.b64decode( 'aHR0cHM6Ly9hcGkudGhlbW92aWVkYi5vcmcvMy9maW5kLyVzP2FwaV9rZXk9ZDY5OTkyZWM4MTBkMGY0MTRkM2RlNGEyMjk0Yjg3MDAmbGFuZ3VhZ2U9ZW4tVVMmZXh0ZXJuYWxfc291cmNlPWltZGJfaWQ=' ) url = what % imdb_id html = requests.get(url).content match = re.search('"id":([0-9]*)', html) if match: id = match.group(1) meta_url = meta_url.replace("%M", id) if "%K" in meta_url: trakt = trakt_id(imdb_id) meta_url = meta_url.replace("%K", trakt) meta_url = meta_url.replace("%Y", year) meta_url = meta_url.replace("%I", imdb_id) meta_url = meta_url.replace("%T", urllib.quote_plus(title)) else: meta_url = 'plugin://%s/movies/play/imdb/%s/library' % ( plugin.get_setting('catchup.plugin').lower(), imdb_id) f.write(meta_url.encode("utf8")) f.close() item = ListItem(label=title, thumbnail=get_icon_path('settings'), path=meta_url) return plugin.set_resolved_url(item)
def processPlaylists(playlists): items = [] for playlist in playlists: item = ListItem() title = playlist['name'] if plugin.get_setting('Show owner') == 'true': title += ' @' + playlist['user']['login'] item.set_label(title) item.set_thumbnail(playlist['images']['large']) item.set_path( plugin.url_for('playlist', playlist_id=str(playlist['playlistId']))) item.set_info('music', { 'Album': playlist['name'], 'TrackNumber': playlist['itemsCount'] }) items.append(item) return items
def play(seasonId='', index='', Esid=''): season_data = SEASON_CACHE.get(seasonId).get('season') title = season_data['title'] episode_sid = Esid play_url, _ = Meiju.get_by_sid(episode_sid, plugin.get_setting('quality')) if play_url is not None: play_url = play_url.split('|') stackurl = 'stack://' + ' , '.join(play_url) add_history(seasonId, index, Esid, title) li = ListItem(title + index, path=stackurl, thumbnail=season_data.get('cover')) li.set_info('video', { 'title': title + index, 'plot': season_data.get('brief', '') }) plugin.set_resolved_url(li) else: plugin.set_resolved_url(False)
def get_album(albumId): c_list = Meiju.get_album(albumId) for one in c_list["data"]["results"]: item = ListItem( **{ 'label': one.get("title"), 'path': plugin.url_for("detail", seasonId=one.get("id")), 'icon': one["cover"], 'thumbnail': one["cover"], }) item.set_info( "video", { "plot": one.get("brief", ""), "rating ": float(one["score"]), "genre": one["cat"], "season": one["seasonNo"] }) item.set_is_playable(False) yield item plugin.set_content('TVShows')
def watch(sid, season, episode, title, vid): if vid == 'None': # Otherwise request was sent from choose_quality and url already exist vid, cookie = sdarot.get_final_video_and_cookie(sid, season, episode) if vid: item = ListItem(**{ 'label': u'פרק {0}'.format(episode), 'path': vid, 'thumbnail': POSTER_PREFIX + sid + '.jpg' }) item.as_xbmc_listitem().setContentLookup(False) item.set_property('mimetype', 'video/mp4') item.set_property('type', 'movie') item.set_info('Video', { 'Title': title, 'Genre': u'פרק {0}, עונה {1}'.format(episode, season) }) plugin.set_resolved_url(item) else: plugin.notify(msg='הייתה בעיה, נסו שוב', title='שגיאה', image=ICON)
def processTracksList(tracks): items = [] for track in tracks: item = ListItem() item.set_label('%s - %s' % (track['artistName'], track['trackName'])) try: item.set_thumbnail(track['imageLarge']) except: pass item.set_path( plugin.url_for('play', artist=track['artistName'].encode('utf-8'), track=track['trackName'].encode('utf-8'))) item.set_is_playable(True) try: item.set_info( 'music', { 'Duration': track['durationSec'], 'Title': track['trackName'], 'Artist': track['artistName'], 'TrackNumber': track['position'], }) except: pass # Support Track Downloading if plugin.get_setting('Download Path') != '': item.add_context_menu_items([ (plugin.get_string(30007), 'XBMC.RunPlugin(' + plugin.url_for('download', artist=track['artistName'].encode('utf-8'), track=track['trackName'].encode('utf-8')) + ')') ]) items.append(item) return items
def episode_makeitem(episodename, episodelink, dateadded=None): ''' Will return a ListItem for the given link to an episode and it's full linked name. Name will be sent to format show to attempt to parse out a date or season from the title. Infolabels are populated with any details that can be parsed from the title as well. Should be used anytime an item needs to be created that is an item for one specific episode of a show. Latest 350, Saved Show, Category (Show listing of all episodes for that series) would all use this. ''' infolbl = {} spath = plugin.url_for(episode, name=episodename, url=episodelink) img = "DefaultVideoFolder.png" seasonstr = '' try: eptitle, epdate, epnum = formatshow(episodename) eplbl = formatlabel(eptitle, epdate, epnum) plotstr = "{0} ({1}): {2} {3}".format(epdate, epnum, eptitle, episodelink) infolbl = {'EpisodeName': epdate, 'Title': eptitle, 'Plot': plotstr} if len(epnum) > 0: showS, showE = findepseason(epnum) snum = int(showS) epnum = int(showE) infolbl.update({'Episode': showE, 'Season': showS}) if snum > 0 and epnum > 0: epdate = "S{0}e{1}".format(snum, epnum) infolbl.update({'PlotOutline': epdate}) if dateadded is not None: dateout = dateadded.replace(' ', '-').trim() eplbl += " [I][B][LIGHT]{0}[/LIGHT][/B][/I]".format(dateout) infolbl.update({"Date": dateout}) item = {'label': eplbl, 'label2': epdate, 'icon': img, 'thumbnail': img, 'path': spath} item.setdefault(item.keys()[0]) li = ListItem.from_dict(**item) li.set_info(type='video', info_labels=infolbl) except: li = ListItem(label=episodename, label2=episodelink, icon=img, thumbnail=img, path=spath) return li
def play(link, title): if link[0] == '/': link = HOST + link page = get_html(link) playurl = re.compile('a href="(http.+?)\"').findall(page)[0] if ('le.com' in playurl) or ('letv.com' in playurl): videourl = video_from_letv(playurl, m3u8=__m3u8__) plugin.set_resolved_url(__m3u8__) return elif 'sohu.com' in playurl: videourl = video_from_sohu elif 'qq.com' in playurl: videourl = video_from_qq elif 'iqiyi.com' in playurl: split = urlparse.urlsplit(playurl) playurl = '{scheme}://{netloc}{path}/'.format(scheme=split[0], netloc=split[1], path=split[2]) videourl = video_from_iqiyi elif 'fun.tv' in playurl: videourl = video_from_funshion elif 'youku.com' in playurl: videourl = video_from_youku elif 'mgtv.com' in playurl: videourl = video_from_mgtv else: xbmcgui.Dialog().ok(plugin.addon.getAddonInfo('name'), '地址不能解析') return urls = videourl(playurl) stackurl = 'stack://' + ' , '.join(urls) li = ListItem(title, path=stackurl) li.set_info('video', {'title': title}) plugin.set_resolved_url(li)
def dbactor(sstr,sort='time',page=0): try: url = 'https://movie.douban.com/celebrity/%s/' % (sstr) rsp = _http(url) celename=celeinfo=celeimg=summary='' m = re.search(r"\x22nbg\x22\s+title\x3D\x22(?P<celename>.*?)\x22\s+href\x3D\x22(?P<celeimg>.*?)\x22", rsp, re.DOTALL) if m: celename = m.group("celename") celeimg= m.group("celeimg") rtxt = r'(?P<celeinfo>\x3Cli\x3E\s+\x3Cspan\x3E性别.+?)\x3C\x2Ful\x3E' m = re.search(rtxt, rsp, re.DOTALL) if m: celeinfo=m.group('celeinfo') celeinfo=re.sub(r'\x3C.*?\x3E','',celeinfo) celeinfo=re.sub(r'\x3A\s+','\x3A',celeinfo, re.DOTALL) celeinfo=celeinfo.replace(' ','') celeinfo=re.sub(r'\s+','\r\n',celeinfo, re.DOTALL) #plugin.log.error(celename) m = re.search(r'影人简介.*?\x22bd\x22\x3E(?P<summary>.*?)\x3C', rsp, re.DOTALL) if m: summary = m.group("summary") m = re.search(r'\x22all\s+hidden\x22\x3E(?P<summary>.*?)\x3C', rsp, re.DOTALL) if m: summary = m.group("summary") menus =[] menus.append({'label':'简介:[COLOR FFFF2222]%s[/COLOR]'%celename, 'path': plugin.url_for('dbsummary', summary=six.ensure_binary(celename+celeinfo+summary)), 'thumbnail':celeimg}) menus.append({'label':comm.colorize_label('影人图片',None,color='32FF94') , 'path': plugin.url_for('celephotos', cele=six.ensure_binary(sstr),page=0), 'thumbnail':xbmc.translatePath( os.path.join( IMAGES_PATH, 'picture.png') )}) if sort=='time': menus.append({'label': '按[COLOR FFFF3333]评分[/COLOR]排序', 'path': plugin.url_for('dbactor',sstr=six.ensure_binary(sstr),sort='vote',page='0')}) else: menus.append({'label': '按[COLOR FFFF3333]时间[/COLOR]排序', 'path': plugin.url_for('dbactor',sstr=six.ensure_binary(sstr),sort='time',page='0')}) url = 'https://movie.douban.com/celebrity/%s/movies?start=%d&format=pic&sortby=%s&' % (sstr,int(page)*10,sort) rsp = _http(url) rtxt=r'subject\x2F(?P<id>[0-9]+)\x2F.*?img\ssrc\x3D\x22(?P<imgurl>.*?)\x22.*?title\x3D\x22(?P<title>.*?)\x22.*?\x22star\s.*?span\x3E(?P<rate>.*?)\x3C\x2Fdiv' for sub in re.finditer(rtxt, rsp, re.DOTALL): rate = '' mrate=re.search(r'\x3Cspan\x3E(?P<rate>[\x2E0-9]+?)\x3C',sub.group('rate').strip(), re.DOTALL) if mrate: rate=mrate.group('rate') context_menu_items=[] context_menu_items.append(('搜索'+colorize_label(sub.group('title'), color='00FF00'), 'RunPlugin('+plugin.url_for('searchinit',stypes='pan,bt,db',sstr=six.ensure_binary(sub.group('title')),modify='1',otherargs='{}')+')',)) listitem=ListItem(label='%s[[COLOR FFFF3333]%s[/COLOR]]'%(sub.group('title'),rate), thumbnail= sub.group('imgurl'), path = plugin.url_for('dbsubject', subject=sub.group('id')),) if len(context_menu_items)>0 and listitem!=None: listitem.add_context_menu_items(context_menu_items) menus.append(listitem) m = re.search("\x22count\x22.*?(?P<count>[0-9]+)", rsp, re.DOTALL) if m: count =int( m.group('count')) totalpage=int((count-1)/30) if int(page)<totalpage: menus.append({'label':'下一页','thumbnail':xbmc.translatePath( os.path.join( IMAGES_PATH, 'nextpage.png') ), 'path': plugin.url_for('dbactor',sstr=six.ensure_binary(sstr),sort=sort,page=int(page)+1)}) plugin.set_content('images') setthumbnail['set']=True return menus return menus except Exception as e: plugin.notify(str(e)) xbmc.log(msg=format_exc(),level=xbmc.LOGERROR) return
def dbmovie(tags='',sort='U',page=0,addtag=0,scorerange='',year_range=''): sorttypes=[('近期热门','U'),('标记最多','T'),('评分最高','S'),('最新上映','R')] tags=six.ensure_text(tags) if tags=='0': tags='' if sort=='0': sort='U' if scorerange=='0': scorerange='0,10' curyear=int(time.strftime('%Y',time.localtime(time.time()))) if year_range=='0': year_range='%d,%d'%(1900,curyear) tag='' if int(addtag)==1: tag=dbgettag() taglist=[] if tags: taglist.extend(tags.split(',')) if tag: taglist.append(six.ensure_text(tag)) #plugin.log.error(str(taglist)) #if len(taglist)<1: return; tags='' for t in taglist: tags+=t.strip()+',' tags=tags.strip(' ,') if sort=='set': dialog = xbmcgui.Dialog() sel = dialog.select('排序类型', [q[0] for q in sorttypes]) if sel==-1: return sort=sorttypes[sel][1] sorttype='' for q in sorttypes: if sort==q[1]: sorttype=q[0] break if scorerange=='set': sellow=0 dialog = xbmcgui.Dialog() ranges=['0','1','2','3','4','5','6','7','8','9','10'] sellow = dialog.select('最低评分', ranges[:10]) if sellow==-1: return if sellow>=9: scorerange='9,10' else: selhigh = dialog.select('最高评分', ranges[sellow+1:]) if selhigh==-1: return scorerange='%d,%d'%(sellow,sellow+selhigh+1) if year_range=='set': sellow=0 dialog = xbmcgui.Dialog() ranges=['2010','2005','2000','1995','1990','1980','1970','1960','1900'] for intyear in range(2011,curyear+1): ranges.insert(0, str(intyear)) sellow = dialog.select('年代起', ranges) if sellow==-1: return if sellow==0: year_range='%d,%d'%(curyear,curyear) else: yearlow=ranges[sellow] ranges=ranges[:sellow+1] selhigh = dialog.select('年代止', ranges) if selhigh==-1: return yearhigh=ranges[selhigh] year_range='%s,%s'%(yearlow,yearhigh) #url='https://movie.douban.com/j/search_subjects?type=movie&tag=%s&sort=%s&page_limit=20&page_start=%s'%(tags.replace(' ','%20'),sort,str(page)) url='https://movie.douban.com/j/new_search_subjects?'+parse.urlencode(encode_obj({'tags':tags,'sort':sort,'range':scorerange,'genres':'','start':str(int(page)*20),'year_range':year_range})) try: rsp = _http(url) minfo = json.loads(rsp[rsp.index('{'):]) menus =[] for m in minfo['data']: context_menu_items=[] context_menu_items.append(('搜索'+colorize_label(m['title'], color='00FF00'), 'RunPlugin('+plugin.url_for('searchinit',stypes='pan,bt,db',sstr=six.ensure_binary(m['title']),modify='1',otherargs='{}')+')',)) listitem=ListItem(label='%s[[COLOR FFFF3333]%s[/COLOR]]'%(m['title'],m['rate']), thumbnail= m['cover'], path= plugin.url_for('dbsubject', subject=m['id']),) if len(context_menu_items)>0 and listitem!=None: listitem.add_context_menu_items(context_menu_items) menus.append(listitem) if len(menus)<=1: plugin.notify('豆瓣标签:无记录') return tags2='0' if tags: tags2=tags if len(menus)==20: menus.append({'label': '下一(第%d)页'%(int(page)+2), 'path': plugin.url_for('dbmovie',tags=six.ensure_binary(tags2),sort=sort,page=int(page)+1,addtag='0',scorerange=scorerange,year_range=year_range), 'thumbnail':xbmc.translatePath( os.path.join( IMAGES_PATH, 'nextpage.png') )}) menus.insert(0, {'label': '标签:[COLOR FFFF3333]%s[/COLOR]'%(tags), 'path': plugin.url_for('dbmovie',tags=six.ensure_binary(tags2),sort=sort,page='0',addtag='1',scorerange=scorerange,year_range=year_range)}) menus.insert(0, {'label': '年代:[COLOR FFFF3333]%s[/COLOR]'%(year_range), 'path': plugin.url_for('dbmovie',tags=six.ensure_binary(tags2),sort=sort,page='0',addtag='0',scorerange=scorerange,year_range='set')}) menus.insert(0, {'label': '评分:[COLOR FFFF3333]%s[/COLOR]'%(scorerange), 'path': plugin.url_for('dbmovie',tags=six.ensure_binary(tags2),sort=sort,page='0',addtag='0',scorerange='set',year_range=year_range)}) menus.insert(0, {'label': '排序:[COLOR FFFF3333]%s[/COLOR]'%(sorttype), 'path': plugin.url_for('dbmovie',tags=six.ensure_binary(tags2),sort='set',page='0',addtag='0',scorerange=scorerange,year_range=year_range)}) plugin.set_content('movies') setthumbnail['set']=True return menus except Exception as e: xbmc.log(msg=format_exc(),level=xbmc.LOGERROR) plugin.notify(str(e)) return
def dbsubject(subject): menus=[] try: rsp = _http('https://api.douban.com/v2/movie/subject/'+subject+'?apikey=0b2bdeda43b5688921839c8ecb20399b',referer='https://www.douban.com/link2/') #plugin.notify('ok') rsp=rsp[rsp.index('{'):] #plugin.log.error(rsp) minfo = json.loads(rsp[rsp.index('{'):]) year=minfo['year'] comm.moviepoint['group']='db' comm.moviepoint['title']=minfo['title'] comm.moviepoint['thumbnail']=minfo['images']['large'].decode('utf-8') #summary ='' #for s,i in enumerate(re.findall(ur'([^\n]{1,28})', minfo['summary'])): # summary=summary+i+'\r\n' #xbmc.log(plugin.url_for('dbsummary', summary=minfo['summary'].encode('utf-8'))) menus.append({'label':'[COLOR FFFF2222]简介:[/COLOR]%s'%minfo['summary'].encode('utf-8'), 'path': plugin.url_for('dbsummary', summary=minfo['summary'].encode('utf-8')), 'thumbnail':minfo['images']['large'].decode('utf-8')}) clipandphotos['clips']=[] clipandphotos['photos']=[] if minfo.has_key('clips'): clipandphotos['clips'].extend(minfo['clips']) if minfo.has_key('bloopers'): clipandphotos['clips'].extend(minfo['bloopers']) if minfo.has_key('photos'): clipandphotos['photos'].extend(minfo['photos']) menus.append({'label':comm.colorize_label('预告片和图片',None,color='32FF94') , 'path': plugin.url_for('dbtrailer'), 'thumbnail':xbmc.translatePath( os.path.join( __cwd__, 'movies.png') ).decode('utf-8')}) strlist=[] strlist.append(minfo['title']) strlist.append(minfo['title']+' '+year) if minfo.has_key('original_title'): #strlist.append(minfo['original_title']) strlist.append(minfo['original_title']+' '+year) if minfo.has_key('aka'): for aka in minfo['aka']: if aka.find('(')>=0 and aka.find(')')>=0: aka=aka.replace(aka[ aka.find('('):aka.find(')')+1],'') #strlist.append(aka) strlist.append(aka+' '+year) #去重 news_strlist = list(set(strlist)) news_strlist.sort(key=strlist.index) for sstr in news_strlist: context_menu_items=[] context_menu_items.append(('搜索'+colorize_label(sstr.encode('UTF-8'), color='00FF00'), 'RunPlugin('+plugin.url_for('searchinit',stypes='pan,bt',sstr=sstr.encode('UTF-8'),modify='1',otherargs='{}')+')',)) listitem=ListItem(label='BT:[COLOR FF00FFFF]%s[/COLOR]' % (sstr.encode('utf-8')), label2=None, icon=None, thumbnail=xbmc.translatePath( os.path.join( __cwd__, 'magnet.jpg') ).decode('utf-8'), path=plugin.url_for('btsearchInit', sstr=sstr.encode('utf-8'), modify='0',ext=comm.moviepoint)) if len(context_menu_items)>0 and listitem!=None: listitem.add_context_menu_items(context_menu_items,False) menus.append(listitem) if minfo.has_key('casts'): for cast in minfo['casts']: thumb=xbmc.translatePath( os.path.join( __cwd__, 'guest.png') ).decode('utf-8') if cast['avatars']: if cast['avatars']['medium']: thumb=cast['avatars']['medium'] castname=cast['name'].encode('utf-8') menus.append({'label': '演员:[COLOR FFFF66AA]%s[/COLOR]' % (castname), 'path': plugin.url_for('dbactor', sstr=castname, page=0), 'context_menu':[('搜索'+colorize_label(castname.encode('UTF-8'), color='00FF00'), 'RunPlugin('+plugin.url_for('searchinit',stypes='pan,bt,db',sstr=castname.encode('UTF-8'),modify='1',otherargs='{}')+')',)], 'thumbnail':thumb}) if minfo.has_key('directors'): for director in minfo['directors']: thumb=xbmc.translatePath( os.path.join( __cwd__, 'guest.png') ).decode('utf-8') if director['avatars']: if director['avatars']['medium']: thumb=director['avatars']['medium'] directorname=director['name'].encode('utf-8') menus.append({'label': '导演:[COLOR FFFFAA66]%s[/COLOR]' % (directorname), 'path': plugin.url_for('dbactor', sstr=directorname, page=0), 'context_menu':[('搜索'+colorize_label(directorname.encode('UTF-8'), color='00FF00'), 'RunPlugin('+plugin.url_for('searchinit',stypes='pan,bt,db',sstr=directorname.encode('UTF-8'),modify='1',otherargs='{}')+')',)], 'thumbnail':thumb}) if minfo.has_key('year'): menus.append({'label': '年代:[COLOR FF00AAFF]%s[/COLOR]' % (minfo['year']), 'path': plugin.url_for('dbmovie',tags=minfo['year'],sort='U',page='0',addtag='0',scorerange='0',year_range='0')}) if minfo.has_key('genres'): for genres in minfo['genres']: menus.append({'label': '类型:[COLOR FF00AAFF]%s[/COLOR]' % (str(genres)), 'path': plugin.url_for('dbmovie',tags=str(genres),sort='U',page='0',addtag='0',scorerange='0',year_range='0')}) if minfo.has_key('countries'): for country in minfo['countries']: menus.append({'label': '国家:[COLOR FF00AAFF]%s[/COLOR]' % (str(country)), 'path': plugin.url_for('dbmovie',tags=str(country),sort='U',page='0',addtag='0',scorerange='0',year_range='0')}) if minfo.has_key('tags'): for tag in minfo['tags']: menus.append({'label': '标签:[COLOR FF00AAFF]%s[/COLOR]' % (str(tag)), 'path': plugin.url_for('dbmovie',tags=str(tag),sort='U',page='0',addtag='0',scorerange='0',year_range='0')}) ''' rsp = _http('https://movie.douban.com/subject/'+subject+'/',referer='https://www.douban.com/link2/') for match in re.finditer('[\x22\x27]\x2Ftag\x2F(?P<tag>.*?)[\x22\x27]', rsp, re.DOTALL | re.IGNORECASE): menus.append({'label': '标签:[COLOR FF00AAFF]%s[/COLOR]' % (match.group('tag')), 'path': plugin.url_for('dbmovie',tags=match.group('tag'),sort='U',page='0',addtag='0',scorerange='0',year_range='0'), 'thumbnail':thumb}) ''' return menus except Exception,e: plugin.log.error(str(e)) return
def dbsubject(subject): menus=[] try: rsp = _http('https://movie.douban.com/subject/'+subject+'/',referer='https://www.douban.com/link2/') #plugin.log.error(rsp) year=title=title2=thumb=summary='' m = re.search(r"title\x3E\s*(?P<title>.*?)\s*\x3C\x2Ftitle", rsp, re.DOTALL) if m: title = m.group("title") title=title[0:title.index('(')].strip() rtxt = r'dale_movie_subject_top_icon.*?itemreviewed\x22\x3E(?P<title>.*?)\x3C.*?\x22year\x22\x3E(?P<year>.*?)\x3C.*?mainpic.*?img\s+src\x3D\x22(?P<thumb>.*?)\x22' m = re.search(rtxt, rsp, re.DOTALL) if m: year=m.group('year').strip(')(') title2=html_parser.HTMLParser().unescape(m.group('title')) title2=title2.replace(title,'').strip() thumb=m.group('thumb') rtxt=r'summary.*?\x3E\s*(?P<summary>.*?)\s*\x3C' m = re.search(rtxt, rsp, re.DOTALL) if m: summary=m.group('summary') rtxt=r'div\s+id\x3D\x22info\x22\x3E\s+(?P<info>.*?)\s+\x3C\x2Fdiv' m = re.search(rtxt,rsp, re.DOTALL) genres=[] areas=[] names=[] if m: info=m.group('info') m = re.search(r'类型.*?(?P<strs>\x3Cspan.*?span\x3E\s*)\x3Cbr', info, re.DOTALL) if m: strs = m.group('strs') for m in re.finditer("\x3E(?P<gen>[^\x3E\x3C]+?)\x3C\x2Fspan", strs, re.DOTALL): genres.append(m.group('gen')) m = re.search(r'制片国家.*?span\x3E\s*(?P<strs>.*?)\x3Cbr', info, re.DOTALL) if m: strs = m.group('strs') for area in strs.split('/'): areas.append(area.strip()) m = re.search(r'又名.*?span\x3E\s*(?P<strs>.*?)\x3Cbr', info, re.DOTALL) if m: strs = html_parser.HTMLParser().unescape(m.group('strs')) for othtitle in strs.split('/'): names.append(othtitle.strip()) celes=[] rtxt=r"avatar[^\n]*?background\x2Dimage[^\n]*?url\x28(?P<img>[^\x2C\s]*?)\x29\x22\x3E.*?celebrity\x2F(?P<id>[0-9]+)\x2F.*?name\x22\x3E(?P<name>.*?)\x3C\x2Fa\x3E.*?title\x3D\x22(?P<role>.*?)\x22\x3E" for m in re.finditer(rtxt, rsp, re.DOTALL): celes.append({'id':m.group('id'),'name':m.group('name'),'img':m.group('img'),'role':m.group('role'),}) tags=[] m = re.search("\x22tags-body\x22\x3E.*?\x3C\x2Fdiv\x3E", rsp, re.DOTALL) if m: tagsg = m.group() for m in re.finditer("\x2Ftag\x2F.*?\x3E(?P<tag>.*?)\x3C", tagsg, re.DOTALL): tags.append(m.group('tag')) comm.moviepoint['group']='db' comm.moviepoint['title']=title comm.moviepoint['thumbnail']=thumb menus.append({'label':'[COLOR FFFF2222]简介:[/COLOR]%s'%summary, 'path': plugin.url_for('dbsummary', summary=six.ensure_binary(summary)), 'thumbnail':thumb}) menus.append({'label':comm.colorize_label('预告片',None,color='32FF94') , 'path': plugin.url_for('dbclips', subject=subject), 'thumbnail':xbmc.translatePath( os.path.join( IMAGES_PATH, 'movies.png') )}) menus.append({'label':comm.colorize_label('剧照',None,color='32FF94') , 'path': plugin.url_for('dbphotos', subject=subject,pictype='S',page=0), 'thumbnail':xbmc.translatePath( os.path.join( IMAGES_PATH, 'picture.png') )}) strlist=[] strlist.append(title) strlist.append(title+' '+year) if title2!='': strlist.append(title2+' '+year) for aka in names: if aka.find('(')>=0 and aka.find(')')>=0: aka=aka.replace(aka[ aka.find('('):aka.find(')')+1],'') strlist.append(aka+' '+year) #去重 news_strlist = list(set(strlist)) news_strlist.sort(key=strlist.index) for sstr in news_strlist: ''' context_menu_items=[] context_menu_items.append(('搜索'+colorize_label(sstr, color='00FF00'), 'RunPlugin('+plugin.url_for('searchinit',stypes='pan,bt',sstr=six.ensure_binary(sstr),modify='1',otherargs='{}')+')',)) listitem=ListItem(label='BT:[COLOR FF00FFFF]%s[/COLOR]' % (six.ensure_text(sstr)), label2=None, icon=None, thumbnail=xbmc.translatePath( os.path.join( IMAGES_PATH, 'magnet.png') ), path=plugin.url_for('btsearchInit', sstr=six.ensure_binary(sstr), modify='0',ext=comm.moviepoint)) if len(context_menu_items)>0 and listitem!=None: listitem.add_context_menu_items(context_menu_items) menus.append(listitem) ''' menus.append(ListItem(label='搜索:[COLOR FF00FFFF]%s[/COLOR]' % (six.ensure_text(sstr)), label2=None, icon=None, thumbnail=xbmc.translatePath( os.path.join( IMAGES_PATH, 'disksearch.png') ), path=plugin.url_for('searchinit',stypes='pan,bt',sstr=six.ensure_binary(sstr),modify='1',otherargs='{}'))) for cast in celes: thumb=cast['img'] cast['name']+' '+cast['role'] menus.append({'label': '[COLOR FFFF66AA]%s[/COLOR]%s' % (cast['name'],cast['role']), 'path': plugin.url_for('dbactor', sstr=six.ensure_binary(cast['id']),sort='time',page=0), 'context_menu':[('搜索'+colorize_label(cast['name'], color='00FF00'), 'RunPlugin('+plugin.url_for('searchinit',stypes='pan,bt,db',sstr=six.ensure_binary(cast['name']),modify='1',otherargs='{}')+')',)], 'thumbnail':thumb}) menus.append({'label': '年代:[COLOR FF00AAFF]%s[/COLOR]' % (year),'thumbnail':xbmc.translatePath( os.path.join( IMAGES_PATH, 'tag.png') ), 'path': plugin.url_for('dbmovie',tags=six.ensure_binary(year),sort='U',page='0',addtag='0',scorerange='0',year_range='0')}) for genre in genres: menus.append({'label': '类型:[COLOR FF00AAFF]%s[/COLOR]' % (genre),'thumbnail':xbmc.translatePath( os.path.join( IMAGES_PATH, 'tag.png') ), 'path': plugin.url_for('dbmovie',tags=six.ensure_binary(genre),sort='U',page='0',addtag='0',scorerange='0',year_range='0')}) for area in areas: menus.append({'label': '地区:[COLOR FF00AAFF]%s[/COLOR]' % (area),'thumbnail':xbmc.translatePath( os.path.join( IMAGES_PATH, 'tag.png') ), 'path': plugin.url_for('dbmovie',tags=six.ensure_binary(area),sort='U',page='0',addtag='0',scorerange='0',year_range='0')}) for tag in tags: menus.append({'label': '标签:[COLOR FF00AAFF]%s[/COLOR]' % (tag),'thumbnail':xbmc.translatePath( os.path.join( IMAGES_PATH, 'tag.png') ), 'path': plugin.url_for('dbmovie',tags=six.ensure_binary(tag),sort='U',page='0',addtag='0',scorerange='0',year_range='0')}) ''' rsp = _http('https://movie.douban.com/subject/'+subject+'/',referer='https://www.douban.com/link2/') for match in re.finditer('[\x22\x27]\x2Ftag\x2F(?P<tag>.*?)[\x22\x27]', rsp, re.DOTALL | re.IGNORECASE): menus.append({'label': '标签:[COLOR FF00AAFF]%s[/COLOR]' % (match.group('tag')), 'path': plugin.url_for('dbmovie',tags=match.group('tag'),sort='U',page='0',addtag='0',scorerange='0',year_range='0'), 'thumbnail':thumb}) ''' return menus except Exception as e: xbmc.log(msg=format_exc(),level=xbmc.LOGERROR) plugin.log.error(str(e)) return
def test_set_info(self): with patch.object(xbmcgui.ListItem, 'setInfo') as mock_setInfo: item = ListItem() item.set_info('video', {'title': '300'}) mock_setInfo.assert_called_with('video', {'title': '300'})