From 70d703f59636fc18abbac127dee36f19a21a9dfe Mon Sep 17 00:00:00 2001 From: yfang1644 Date: Fri, 27 Mar 2020 23:37:33 +0800 Subject: [PATCH] migu/totalPage,iqiyi/xbmcswift2 --- addons.xml | 2 +- plugin.video.iqiyi/default.py | 584 ++++++++++-------- plugin.video.iqiyi/lib/iqiyi.py | 10 +- .../plugin.video.iqiyi-2.4.8.zip | Bin 41203 -> 41489 bytes plugin.video.miguvideo/default.py | 6 +- .../plugin.video.miguvideo-0.9.3.zip | Bin 31995 -> 31973 bytes 6 files changed, 332 insertions(+), 270 deletions(-) diff --git a/addons.xml b/addons.xml index 2acb076..739204a 100644 --- a/addons.xml +++ b/addons.xml @@ -201,7 +201,7 @@ diff --git a/plugin.video.iqiyi/default.py b/plugin.video.iqiyi/default.py index 019a531..4dbfbba 100644 --- a/plugin.video.iqiyi/default.py +++ b/plugin.video.iqiyi/default.py @@ -1,29 +1,29 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -from xbmcswift2 import Plugin, xbmc, xbmcgui +import xbmc +from xbmcgui import Dialog, ListItem +from xbmcplugin import addDirectoryItem, endOfDirectory, setContent +import xbmcaddon import re import os from json import loads from bs4 import BeautifulSoup from common import get_html, r1 -from lib.iqiyi import video_from_vid, quote_plus +from lib.iqiyi import video_from_vid, video_from_url, quote_plus, parse_qsl, urlencode ######################################################################## # 爱奇艺 list.iqiyi.com ######################################################################## -plugin = Plugin() -url_for = plugin.url_for LIST_URL = 'http://list.iqiyi.com' PCW_API = 'https://pcw-api.iqiyi.com/search/video/videolists?channel_id={}&mode={}&pageNum={}&pageSize=30&without_qipu=1&is_purchase=0' -PCW_API = 'https://pcw-api.iqiyi.com/search/video/videolists?access_play_control_platform=14&channel_id={}&data_type=1&from=pcw_list&is_album_finished=&is_purchase=&key=&market_release_date_level=&mode={}&pageNum={}&pageSize=48&site=iqiyi&source_type=&three_category_id=15\;must&without_qipu=1' +PCW_API = 'https://pcw-api.iqiyi.com/search/video/videolists?channel_id={}&data_type=1&from=pcw_list&is_album_finished=&is_purchase=&key=&market_release_date_level=&mode={}&pageNum={}&pageSize=30&site=iqiyi&source_type=&three_category_id=&without_qipu=1' ALBUM_API = 'https://pcw-api.iqiyi.com/albums/album/avlistinfo?aid={}&page=1&size=300' - -__profile__ = xbmc.translatePath(plugin.addon.getAddonInfo('profile')) +__profile__ = xbmc.translatePath(xbmcaddon.Addon().getAddonInfo('profile')) __m3u8__ = xbmc.translatePath(os.path.join(__profile__, 'temp.m3u8')) BANNER_FMT = '[COLOR FFDEB887][%s][/COLOR]' @@ -42,17 +42,19 @@ def httphead(url): def previous_page(endpoint, page, total_page, **kwargs): if int(page) > 1: - page = str(int(page) - 1) - return [{'label': u'上一页 - {0}/{1}'.format(page, str(total_page)), 'path': plugin.url_for(endpoint, page=page, **kwargs)}] - else: - return [] + li = ListItem('上一页 - {0}/{1}'.format(page, str(total_page))) + kwargs['mode'] = endpoint + kwargs['page'] = int(page) - 1 + u = sys.argv[0] + '?' + urlencode(kwargs) + addDirectoryItem(int(sys.argv[1]), u, li, True) def next_page(endpoint, page, total_page, **kwargs): if int(page) < int(total_page): - page = str(int(page) + 1) - return [{'label': u'下一页 - {0}/{1}'.format(page, str(total_page)), 'path': plugin.url_for(endpoint, page=page, **kwargs)}] - else: - return [] + li = ListItem('下一页 - {0}/{1}'.format(page, str(total_page))) + kwargs['mode'] = endpoint + kwargs['page'] = int(page) + 1 + u = sys.argv[0] + '?' + urlencode(kwargs) + addDirectoryItem(int(sys.argv[1]), u, li, True) def convertTImer(info): try: @@ -64,45 +66,55 @@ def convertTImer(info): return info -@plugin.route('/stay') -def stay(): - pass - - -@plugin.route('/playvideo////<pic>/') -def playvideo(tvId, vid, title, pic): - sel = int(plugin.addon.getSetting('resolution')) - m3u8set = plugin.addon.getSetting('m3u8') +def playvideo(params): + name = params['name'] + thumbnail = params['thumbnail'] + tvId = params['tvId'] + vid = params['vid'] + level = int(xbmcaddon.Addon().getSetting('resolution')) + m3u8set = xbmcaddon.Addon().getSetting('m3u8') playmode = True if m3u8set == 'true' else None - urls = video_from_vid(tvId, vid, level=sel, m3u8=playmode) + urls = video_from_vid(tvId, vid, level=level, m3u8=playmode) if urls is None: - xbmcgui.Dialog().ok(plugin.addon.getAddonInfo('name'), '无法播放此视频') + Dialog().ok(xbmcaddon.Addon().getAddonInfo('name'), '无法播放此视频') return - if len(urls) > 1: - playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) - playlist.clear() - stackurl = 'stack://' + ' , '.join(urls) - list_item = xbmcgui.ListItem(title, thumbnailImage=pic) - list_item.setInfo('video', {'title': title}) - playlist.add(stackurl, list_item) - xbmc.Player().play(playlist) - else: - plugin.set_resolved_url(urls[0]) + playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO) + playlist.clear() + stackurl = 'stack://' + ' , '.join(urls) + list_item = ListItem(name, thumbnailImage=thumbnail) + list_item.setInfo('video', {'title': name}) + playlist.add(stackurl, list_item) + xbmc.Player().play(playlist) -@plugin.route('/reference/<tvId>/<vid>/<title>/<pic>/') -def reference(tvId, vid, title, pic): - plugin.set_content('TVShows') +def playurl(params): + url = params.pop('url') + link = get_html(url) + videoId = r1(r'#curid=.+_(.*)$', url) or \ + r1(r'vid=([^&]+)', url) or \ + r1(r'data-player-videoid="([^"]+)"', link) or \ + r1(r'vid=(.+?)\&', link) or \ + r1(r'param\[\'vid\'\]\s*=\s*"(.+?)"', link) + params['vid'] = videoId + playvideo(params) + + +def reference(params): + tvId = params['tvId'] + thumbnail = params['thumbnail'] # recommend - items = [] - items.append({ - 'label': BANNER_FMT % title, - 'path': url_for('playvideo', tvId=tvId, vid=vid, - title=title, pic=pic), - 'is_playable': True, - 'info': {'title': title} - }) + + li = ListItem(BANNER_FMT % params['name'], thumbnailImage=thumbnail) + req = { + 'mode': 'playvideo', + 'tvId': tvId, + 'vid': params['vid'], + 'name': params['name'], + 'thumbnail': thumbnail + } + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, False) url = 'http://mixer.video.iqiyi.com/jp/recommend/videos?referenceId=%s&area=swan&type=video' % tvId link = get_html(url) @@ -111,23 +123,24 @@ def reference(tvId, vid, title, pic): videos = json_response['mixinVideos'] for series in videos: if tvId == series['tvId']: - mode, playable = 'playvideo', True + mode, isFolder = 'playvideo', False else: - mode, playable = 'reference', False - - items.append({ - 'label': series['name'], - 'path': url_for(mode, tvId=series.get('tvId'), - vid=series.get('vid', 0), - title=series['name'].encode('utf-8'), - pic=series['imageUrl']), - 'thumbnail': series['imageUrl'], - 'is_playable': playable, - 'info': {'title': series['name'], - 'plot': series['description'], - 'duration': series['duration']} - }) - return items + mode, isFolder = 'reference', True + + li = ListItem(series['name'], thumbnailImage=series['imageUrl']) + li.setInfo(type='Video', infoLabels={'title': series['name'], 'plot': series['description'], 'duration': series['duration']}) + req = { + 'mode': mode, + 'tvId': series.get('tvId'), + 'vid': series.get('vid', 0), + 'name': series['name'].encode('utf-8'), + 'thumbnail': series['imageUrl'] + } + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, isFolder) + + setContent(int(sys.argv[1]), 'tvshows') + endOfDirectory(int(sys.argv[1])) def listType1(albumType, albumId): @@ -135,24 +148,20 @@ def listType1(albumType, albumId): link = get_html(url) data = link[link.find('=')+1:] json_response = loads(data) - items = [] if 'data' not in json_response: return [] for item in json_response['data']: - items.append({ - 'label': item['videoName'] + item['tvYear'], - 'path': url_for('playvideo', - tvId=item['tvId'], - vid=item['vid'], - title=item['videoName'].encode('utf-8'), - pic=item['aPicUrl']), - 'thumbnail': item['aPicUrl'], - 'is_playable': True, - 'info': {'title': item['videoName']} - }) - - return items + li = ListItem(item['videoName'] + item['tvYear'], thumbnailImage=item['aPicUrl']) + req = { + 'mode': 'playvideo', + 'tvId': item['tvId'], + 'vid': item['vid'], + 'name': item['videoName'].encode('utf-8'), + 'thumbnail': item['aPicUrl'] + } + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, False) def listType2(albumId, page): @@ -160,46 +169,45 @@ def listType2(albumId, page): link = get_html(url) data = link[link.find('=')+1:] json_response = loads(data) - items = [] try: totalpages = json_response['data']['pgt'] except: - return items + return currpage = int(page) for item in json_response['data']['vlist']: - items.append({ - 'label': item['vn'] + ' ' + item['vt'], - 'path': url_for('playvideo', - tvId=item['id'], - vid=item['vid'], - title=item['vn'].encode('utf-8'), - pic=item['vpic']), - 'thumbnail': item['vpic'], - 'is_playable': True, - 'info': {'title': item['vn'], 'plot': item['desc'], 'duration': item['timeLength']} - }) + li = ListItem(item['vn']+' '+item['vt'], thumbnailImage=item['vpic']) + li.setInfo(type='Video', infoLabels={'title': item['vn'], 'plot': item['desc'], 'duration': item['timeLength']}) + req = { + 'mode': 'playvideo', + 'tvId': item['id'], + 'vid': item['vid'], + 'name': item['vn'].encode('utf-8'), + 'thumbnail': item['vpic'] + } + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, False) + req = { + 'mode': 'episodelist', + 'albumId': albumId + } if currpage > 1: - items.append({ - 'label': '上一页', - 'path': url_for('episodelist', albumId=albumId, page=currpage-1), - }) + li = ListItem('上一页') + req['page'] = currpage - 1 if currpage < totalpages: - items.append({ - 'label': '下一页', - 'path': url_for('episodelist', albumId=albumId, page=currpage+1), - }) + li = ListItem('下一页') + req['page'] = currpage + 1 + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, True) - return items - -@plugin.route('/episodelist/<albumId>/<page>/') -def episodelist(albumId, page): - plugin.set_content('TVShows') +def episodelist(params): + albumId = params['albumId'] + page = params['page'] url = 'http://cache.video.qiyi.com/a/%s' % albumId - items = [] + link = get_html(url) data = link[link.find('=')+1:] json_response = loads(data) @@ -215,65 +223,74 @@ def episodelist(albumId, page): title = item['tvName'].encode('utf-8') isSeries = item['isSeries'] if isSeries == 0: - items.append({ - 'label': BANNER_FMT % title, - 'path': url_for('playvideo', tvId=tvId, vid=vid, title=title, - pic=item.get('tvPictureUrl','0')), - 'thumbnail': item.get('tvPictureUrl', ''), - 'is_playable': True, - 'info': {'title': title, 'plot': item['tvDesc']} - }) + img = item.get('tvPictureUrl', '') + li = ListItem(BANNER_FMT % title, thumbnailImage=img) + li.setInfo(type='Video', infoLabels={'title': title, 'plot': item['tvDesc']}) + req = { + 'mode': 'playvideo', + 'tvId': tvId, + 'vid': vid, + 'name': title, + 'thumbnail': img + } + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, False) else: - item1 = listType1(albumType, albumId) - items += item1 - if not item1: - items += listType2(albumId, page) + listType1(albumType, albumId) + listType2(albumId, page) # recommend - items += reference(tvId, vid, title, 'xxxx') - if len(items) > 1 and items[0]['label'] == items[1]['label']: - del items[1] - return items + req = { + 'tvId': tvId, + 'vid': vid, + 'name': title, + 'thumbnail': '' + } + reference(req) -@plugin.route('/playfound/<url>/<title>/<pic>/') -def playfound(url, title, pic): +def playfound(params): + url = params['url'] + thumbnail = params['thumbnail'] + name = params['name'] items = [] - if not url.startswith('http'): - return [] + if url[0:4] != 'http': + return link = get_html(url) tvId = r1(r'param\[\'tvid\'\]\s*=\s*"(.+)"', link) vid = r1(r'param\[\'vid\'\]\s*=\s*"(.+)"', link) if tvId is not None and vid is not None: - items = [{ - 'label': title, - 'path': url_for('playvideo', tvId=tvId, vid=vid, - title=title, pic=pic), - 'is_playable': True, - 'info': {'title': title} - }] + li = ListItem(title, thumbnailImage=thumbnail) + req = { + 'mode': 'playvideo', + 'tvId': tvId, + 'vid': vid, + 'name': name, + 'thumbnail': thumbnail + } + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, False) else: albumId = r1('albumid="(.+?)"', link) if albumId is not None: - items = episodelist(albumId, 1) - return items + episodelist({'albumId': albumId, 'page':1}) -@plugin.route('/filter/<url>/') -def filter(url): +def filter(params): + url = params['url'] html = get_html(url) tree = BeautifulSoup(html, 'html.parser') - filter = tree.find_all('div', {'class': 'mod_sear_list'}) + filter = tree.findAll('div', {'class': 'mod_sear_list'}) surl = url.split('/') lurl = surl[-1].split('-') - dialog = xbmcgui.Dialog() + dialog = Dialog() for item in filter[1:]: title = item.h3.text - si = item.find_all('li') + si = item.findAll('li') list = [] for x in si: if x.get('class') and 'selected' in x.get('class'): @@ -296,20 +313,18 @@ def filter(url): surl[-1] = '-'.join(lurl) url = '/'.join(surl) - return videolist(httphead(url)) + videolist({'url': httphead(url)}) ########################################################################### # search in http://so.iqiyi.com/so/q_%s?source=hot ############################################################################ -@plugin.route('/search/') -def search(): - items = [] +def search(params): keyboard = xbmc.Keyboard('', '请输入搜索内容') xbmc.sleep(1000) keyboard.doModal() if not keyboard.isConfirmed(): - return [] + return keyword = keyboard.getText() key = quote_plus(keyword) @@ -317,25 +332,21 @@ def search(): link = get_html(url) if link is None: - items.append({ - 'label':' 抱歉,没有找到[COLOR yellow] ' + keyword + ' [/COLOR]的相关视频', - 'path': url_for('stay') - }) - return items - - plugin.set_content('TVShows') - items.append({ - 'label': '[COLOR yellow]当前搜索:(' + keyword + ')[/COLOR]', - 'path': url_for('stay') - }) + li = ListItem('抱歉,没有找到[COLOR yellow] ' + keyword + ' [/COLOR]的相关视频') + addDirectoryItem(int(sys.argv[1]), sys.argv[0], li, True) + return + + li = ListItem('[COLOR yellow]当前搜索:(' + keyword + ')[/COLOR]') + addDirectoryItem(int(sys.argv[1]), sys.argv[0], li, True) # fetch and build the video series episode list - content = BeautifulSoup(link, 'html.parser') - soup = content.find_all('ul', {'class': 'mod_result_list'}) - for item in soup: - lists = item.find_all('li', {'class': 'list_item'}) + soup = BeautifulSoup(link, 'html.parser') + tree = soup.findAll('ul', {'class': 'mod_result_list'}) + for item in tree: + lists = item.findAll('li', {'class': 'list_item'}) for series in lists: img = series.img.get('src', '') + img = httphead(img) title = series.img.get('title') or series.a.get('title') if title is None: continue @@ -344,58 +355,58 @@ def search(): info = text.text except: info = '' - site = series.find_all('em', {'class': 'vm-inline'}) + site = series.findAll('em', {'class': 'vm-inline'}) for t in site: title += ' |' + t.text - items.append({ - 'label': title, - 'path': url_for('playfound', - url=httphead(series.a['href']), - title=title.encode('utf-8'), - pic=httphead(img)), - 'thumbnail': httphead(img), - 'info': {'title': title, 'plot': info} - }) - - album = series.find_all('li', {'class': 'album_item'}) + + li = ListItem(title, thumbnailImage=img) + li.setInfo(type='Video', infoLabels={'title': title, 'plot': info}) + req = { + 'mode': 'playfound', + 'url': httphead(series.a['href']), + 'name': title.encode('utf-8'), + 'thumbnail': img + } + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, True) + + album = series.findAll('li', {'class': 'album_item'}) for page in album: title = page.a.get('title', '') - items.append({ - 'label': '--' + title, - 'path': url_for('playfound', - url=page.a.get('href'), - title=title.encode('utf-8'), - pic=img), - 'thumbnail': img, - 'info': {'title': title} - }) - return items - - -@plugin.route('/videolist/<url>/') -def videolist(url): - plugin.set_content('TVShows') + li = ListItem('--' + title, thumbnailImage=img) + req = { + 'mode': 'playfound', + 'url': page.a.get('href'), + 'name': title.encode('utf-8'), + 'thumbnail': img + } + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, True) + + setContent(int(sys.argv[1]), 'tvshows') + endOfDirectory(int(sys.argv[1])) + + +def videolist(params): html = get_html(url) html = re.sub('\t|\r|\n', ' ', html) - tree = BeautifulSoup(html, 'html.parser') + soup = BeautifulSoup(html, 'html.parser') ul = url.split('/')[-1] page = ul.split('-')[14] if page == '': page = '1' - items = [] - items.append({ - 'label': '[第%s页](分类过滤)' % page.encode('utf-8'), - 'path': url_for('filter', url=url) - }) - - items.append({ - 'label': BANNER_FMT % '排序方式', - 'path': url_for('stay') - }) - soup = tree.find_all('div', {'class': 'sort-result-l'}) - arrange = soup[0].find_all('a') + + li = ListItem('[第%s页](分类过滤)' % page.encode('utf-8')) + u = sys.argv[0] + '?mode=filter&url=' + url + addDirectoryItem(int(sys.argv[1]), u, li, True) + + li = ListItem(BANNER_FMT % '排序方式') + addDirectoryItem(int(sys.argv[1]), sys.argv[0], li, True) + + tree = soup.findAll('div', {'class': 'sort-result-l'}) + arrange = tree[0].findAll('a') for sort in arrange: title = sort.text.strip() select = sort.get('class', '') @@ -403,13 +414,12 @@ def videolist(url): title = INDENT_FMT1 % title else: title = INDENT_FMT0 % title - items.append({ - 'label': title, - 'path': url_for('videolist', url=httphead(sort['href'])) - }) + li = ListItem(title) + u = sys.argv[0] + '?mode=videolist&url=' + httphead(sort['href']) + addDirectoryItem(int(sys.argv[1]), u, li, True) - soup = tree.find_all('div', {'class': 'site-piclist_pic'}) - for item in soup: + tree = soup.findAll('div', {'class': 'site-piclist_pic'}) + for item in tree: href = item.a.get('href') img = item.img.get('src', '') title = item.a.get('title', '') @@ -439,69 +449,100 @@ def videolist(url): else: infoLabels={'title': title, 'duration': info} - items.append({ - 'label': title + extrainfo.strip(), - 'path': url_for('episodelist', albumId=albumId, page=1), - 'thumbnail': httphead(img), - 'info': infoLabels, - }) + li = ListItem(title + extrainfo.strip(), thumbnailImage=httphead(img)) + li.setInfo(type='Video', infoLabels=infoLabels) + req = { + 'mode': 'episodelist', + 'albumId': albumId, + 'page': 1 + } + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, True) - items.append({ - 'label':INDENT_FMT0 % ('分页'), - 'path': url_for('stay') - }) + li = ListItem(INDENT_FMT0 % '分页') + addDirectoryItem(int(sys.argv[1]), sys.argv[0], li, True) - pages = tree.find_all('div', {'class': 'mod-page'}) - pages = pages[0].find_all('a') + pages = soup.findAll('div', {'class': 'mod-page'}) + pages = pages[0].findAll('a') for page in pages: - items.append({ - 'label': page.text, - 'path': url_for('videolist', url=httphead(page['href'])) - }) - return items + li = ListItem(page.txt) + u = sys.argv[0] + '?mode=videolist&url=' + httphead(page['href']) + addDirectoryItem(int(sys.argv[1]), u, li, True) + + setContent(int(sys.argv[1]), 'tvshows') + endOfDirectory(int(sys.argv[1])) orderlist=[{"id":24,"name":"综合排序"}, {"id":11,"name":"热播榜"}, {"id":4,"name":"新上线"}] -@plugin.route('/category/<order>/<cid>/<page>/') -def category(order, cid, page): - plugin.set_content('TVShows') +def category(params): + order = params['order'] + cid = params['cid'] + page = params['page'] items = [] for x in orderlist: if int(x['id']) == int(order): style = '[COLOR red]{}[/COLOR]'.format(x['name']) else: style = '[COLOR yellow]{}[/COLOR]'.format(x['name']) - items.append({ - 'label': style, - 'path': url_for('category', order=x['id'], cid=cid, page=page) - }) + li = ListItem(style) + req = { + 'mode': 'category', + 'order': x['id'], + 'cid': cid, + 'page': page + } + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, True) api = PCW_API.format(cid, order, page) + if cid == '16': + api = api.replace('data_type=1', 'data_type=2') jdata = loads(get_html(api)) - items += previous_page('category', page, 300, order=order, cid=cid) + total_page = jdata['data']['pageTotal'] + + previous_page('category', page, total_page, order=order, cid=cid) for item in jdata['data']['list']: - albumId=item.get('albumId') + albumId = item.get('albumId') + tvId = item.get('tvId') + duration = item.get('duration', 0) + duration = convertTImer(duration) + li = ListItem(item['name'], thumbnailImage=item['imageUrl']) + li.setInfo(type='Video', infoLabels={'title': item['name'],'plot':item.get('description'), 'duration': duration}) if albumId: - items.append({ - 'label': item['name'], - 'path': url_for('episodelist', albumId=albumId, page=1), - 'thumbnail': item['imageUrl'], - 'info': {'title': item['name'], 'plot': item.get('description')} - }) + req = { + 'mode': 'episodelist', + 'albumId': albumId, + 'page': 1 + } + isFolder = True + elif tvId: + req = { + 'mode': 'playurl', + 'tvId': tvId, + 'url': item['playUrl'], + 'name': item['name'].encode('utf-8'), + 'thumbnail': item['imageUrl'] + } + isFolder = False else: - items.append({ - 'label': item['name'], - 'path': url_for('playfound', url=item['playUrl'], - title=item['name'].encode('utf-8'), - pic=item['imageUrl']), - 'thumbnail': item['imageUrl'], - 'info': {'title': item['name'], 'plot': item.get('description')} - }) - items += next_page('category', page, 300, order=order, cid=cid) - return items + req = { + 'mode': 'playfound', + 'url': item['playUrl'], + 'name': item['name'].encode('utf-8'), + 'thumbnail': item['imageUrl'] + } + isFolder = True + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, isFolder) + + next_page('category', page, total_page, order=order, cid=cid) + + setContent(int(sys.argv[1]), 'tvshows') + endOfDirectory(int(sys.argv[1])) + channellist=[{"cid":2,"name":"电视剧"}, {"cid":1,"name":"电影"}, @@ -531,20 +572,43 @@ def category(order, cid, page): {"cid":31,"name":"脱口秀"}, {"cid":32,"name":"健康"}] - -@plugin.route('/') -def index(): - yield { - 'label': '[COLOR yellow] 【爱奇艺 - 搜索】[/COLOR]', - 'path': url_for('search') - } +def root(): + li = ListItem('[COLOR yellow] 【爱奇艺 - 搜索】[/COLOR]') + u = sys.argv[0] + '?mode=search' + addDirectoryItem(int(sys.argv[1]), u, li, True) for channel in channellist: - yield { - 'label': channel['name'], - 'path': url_for('category', order=24, cid=channel['cid'], page=1) + li = ListItem(channel['name']) + req = { + 'mode': 'category', + 'order': 24, + 'cid': channel['cid'], + 'page': 1 } - - -if __name__ == '__main__': - plugin.run() + u = sys.argv[0] + '?' + urlencode(req) + addDirectoryItem(int(sys.argv[1]), u, li, True) + + endOfDirectory(int(sys.argv[1])) + + +# main programs goes here ######################################### +runlist = { + 'category': 'category(params)', + 'episodelist': 'episodelist(params)', + 'playfound': 'playfound(params)', + 'reference': 'reference(params)', + 'search': 'search(params)', + 'filter': 'filter(params)', + 'playurl': 'playurl(params)', + 'playvideo': 'playvideo(params)' +} + +params = sys.argv[2][1:] +params = dict(parse_qsl(params)) + +mode = params.get('mode') +if mode: + del (params['mode']) + exec(runlist[mode]) +else: + root() diff --git a/plugin.video.iqiyi/lib/iqiyi.py b/plugin.video.iqiyi/lib/iqiyi.py index 64ff02a..6718237 100644 --- a/plugin.video.iqiyi/lib/iqiyi.py +++ b/plugin.video.iqiyi/lib/iqiyi.py @@ -2,16 +2,16 @@ # -*- coding: utf-8 -*- import sys -if sys.version[0] == '3': - from urllib.parse import urlencode -else: - from urllib import urlencode import hashlib import time from random import randrange from json import loads from common import get_html, r1 - +if sys.version[0]=='3': + from urllib.parse import urlencode, quote_plus, parse_qsl +else: + from urllib import urlencode, quote_plus + from urlparse import parse_qsl class IQiyi(): name = '爱奇艺 (Iqiyi)' diff --git a/plugin.video.iqiyi/plugin.video.iqiyi-2.4.8.zip b/plugin.video.iqiyi/plugin.video.iqiyi-2.4.8.zip index fb62e33f1ded4e548c3b3b02adf6a91dcc934aac..c14f2aa27a3a2a9399f5742feee59e4b39a680e8 100644 GIT binary patch delta 7916 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 Syq$>!-poaVZ^`;^_x}TS?G54p delta 7606 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 diff --git a/plugin.video.miguvideo/default.py b/plugin.video.miguvideo/default.py index 54ffe84..d10ec15 100644 --- a/plugin.video.miguvideo/default.py +++ b/plugin.video.miguvideo/default.py @@ -192,12 +192,10 @@ def categorylist(index, type, area, year, pack, cont, Chu, page): 'mediaChu': '' if Chu=='0' else Chu, 'ct': 101, } - html = get_html(cateAPI + urlencode(req)) data = loads(html) - total = int(data.get('resultNum', 0)) - total_page = (total + pagesize - 1) // pagesize - + total_page = int(data.get('totalPage', 30)) + items = previous_page('categorylist', page, total_page, index=index, type=type, area=area, year=year, pack=pack, cont=cont, Chu=Chu) diff --git a/plugin.video.miguvideo/plugin.video.miguvideo-0.9.3.zip b/plugin.video.miguvideo/plugin.video.miguvideo-0.9.3.zip index 1e5cfd4e289a1ceec6321667961510da4199f4b9..3d187c632ef4f4bc77c1d58236edd2a761335325 100644 GIT binary patch delta 3188 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 a007A-lbC!u19%;Nlhu462LE{g0002N>I^dg delta 3188 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 a000pwlY)FY1KnnQlfQf*1{Hb$0001oRwzOM