diff --git a/addons.xml b/addons.xml index 3b919a5..919a3e1 100644 --- a/addons.xml +++ b/addons.xml @@ -2,18 +2,19 @@ - + video + LeTV video plugin 乐视网插件 @@ -27,36 +28,41 @@ + + + video + YinYueTai video plugin 音悦台视频插件 Online MV from yinyuetai.com 观看音悦台在线MV https://github.com/yfang1644/kodi_plugins/plugin.video.yinyuetai - yfang1644@gmail.com + yfang1644@gmail.com all - + video + PPTV video plugin PPTV视频插件 @@ -119,18 +125,23 @@ - + + + + + video + SoHu Video plugin 搜狐视频插件 @@ -251,13 +262,15 @@ + + + point="xbmc.python.pluginsource" library="addon.py"> audio @@ -295,12 +308,14 @@ version="1.0.2" provider-name="yfang1644"> + - + video + Mangguo Video plugin MGTV 视频插件 @@ -362,16 +377,17 @@ - + video + IQIYI Video plugin 爱奇艺视频插件 @@ -415,44 +431,44 @@ - - - - - - video - - - - TV Live plugin - 地方电视台直播 - Stream live Nanjing TV and other local TV programs - 电视台直播 + + + + + + video + + + TV Live plugin + 地方电视台直播 + Stream live Nanjing TV and other local TV programs + 电视台直播 http://www.nbs.cn, http://www.haoqu.net/3/ - - GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007 - - + + GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007 + + https://github.com/yfang1644/kodi_plugins/plugin.video.tvonline yfang1644@gmail.com - all - + all + - + video + Funshion Video plugin 风行网视频插件 @@ -466,15 +482,16 @@ - + video + Tencent Video plugin QQ视频插件 @@ -488,15 +505,18 @@ - + + + video + 人人视频 人人视频 @@ -527,22 +547,23 @@ - + video + YouKu Video (plain version) 优酷视频插件(平铺版) online video from youku.com 优酷(www.youku.com)在线网络视频 https://github.com/yfang1644/kodi_plugins/plugin.video.youku - yfang1644@gmail.com + yfang1644@gmail.com all @@ -553,7 +574,8 @@ - + + video @@ -571,15 +593,17 @@ - + + video + 优酷TV @@ -592,17 +616,20 @@ + - + + video + Tudou video plugin 土豆在线视频 @@ -653,15 +680,24 @@ + + + " + + + + + + video - + CNTV video plugin CNTV 视频插件 @@ -679,7 +715,7 @@ - + audio @@ -737,12 +773,13 @@ + version="1.1.0" + provider-name="yfang1644"> - + + video @@ -759,12 +796,12 @@ - + video @@ -781,13 +818,15 @@ - + + + + - audio @@ -804,12 +843,20 @@ - + + + + + + + + + diff --git a/plugin.audio.baidu/addon.xml b/plugin.audio.baidu/addon.xml index 6475c45..1e16074 100644 --- a/plugin.audio.baidu/addon.xml +++ b/plugin.audio.baidu/addon.xml @@ -1,13 +1,15 @@ - + + + + - audio @@ -17,7 +19,7 @@ Baidu Music Kodi Plugin 百度音乐插件 https://github.com/yfang1644/kodi_plugins/plugin.audio.baidu - yfang1644@gmail.com + yfang1644@gmail.com all diff --git a/plugin.audio.baidu/default.py b/plugin.audio.baidu/default.py index 9bb2412..8846b5d 100644 --- a/plugin.audio.baidu/default.py +++ b/plugin.audio.baidu/default.py @@ -1,16 +1,12 @@ # -*- coding: utf-8 -*- from xbmcswift2 import Plugin -from urllib import quote_plus -import urllib2 from json import loads +from bs4 import BeautifulSoup +import re from common import get_html from iqiyi import video_from_vid as IQIYI_from_vid from yinyuetai import video_from_vid as YINYUETAI_from_vid -from bs4 import BeautifulSoup -import re - -__UserAgent = 'Mozilla/5.0 (X11; Linux x86_64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2' plugin = Plugin() url_for = plugin.url_for diff --git a/plugin.audio.baidu/plugin.audio.baidu-1.0.1.zip b/plugin.audio.baidu/plugin.audio.baidu-1.1.0.zip similarity index 72% rename from plugin.audio.baidu/plugin.audio.baidu-1.0.1.zip rename to plugin.audio.baidu/plugin.audio.baidu-1.1.0.zip index b702216..4d10c80 100644 Binary files a/plugin.audio.baidu/plugin.audio.baidu-1.0.1.zip and b/plugin.audio.baidu/plugin.audio.baidu-1.1.0.zip differ diff --git a/plugin.audio.baidufm/plugin.audio.baidufm-0.0.5.zip b/plugin.audio.baidufm/plugin.audio.baidufm-0.0.5.zip deleted file mode 100644 index 08d77da..0000000 Binary files a/plugin.audio.baidufm/plugin.audio.baidufm-0.0.5.zip and /dev/null differ diff --git a/plugin.audio.kuwo/addon.xml b/plugin.audio.kuwo/addon.xml index db8995d..8938b95 100644 --- a/plugin.audio.kuwo/addon.xml +++ b/plugin.audio.kuwo/addon.xml @@ -1,12 +1,12 @@ - + diff --git a/plugin.audio.kuwo/plugin.audio.kuwo-2.2.4.zip b/plugin.audio.kuwo/plugin.audio.kuwo-2.3.0.zip similarity index 89% rename from plugin.audio.kuwo/plugin.audio.kuwo-2.2.4.zip rename to plugin.audio.kuwo/plugin.audio.kuwo-2.3.0.zip index abb090f..03ffd35 100644 Binary files a/plugin.audio.kuwo/plugin.audio.kuwo-2.2.4.zip and b/plugin.audio.kuwo/plugin.audio.kuwo-2.3.0.zip differ diff --git a/plugin.audio.kuwobox/addon.xml b/plugin.audio.kuwobox/addon.xml deleted file mode 100644 index aecd176..0000000 --- a/plugin.audio.kuwobox/addon.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - audio - - - KuwoBox audio plugin - 酷我音乐盒音乐插件 - KuwoBox audio plugin - 酷我音乐盒在线音乐 - https://github.com/yfang1644/kodi_plugins/plugin.audio.kuwobox - yfang1644@gmail.com - all - - diff --git a/plugin.audio.kuwobox/changelog.txt b/plugin.audio.kuwobox/changelog.txt deleted file mode 100644 index 7ec65f9..0000000 --- a/plugin.audio.kuwobox/changelog.txt +++ /dev/null @@ -1,24 +0,0 @@ -v1.1.5 (2015/01/04 osfans) -- 修正安卓脚本错误 -- 修正“分类”歌曲重复 - -v1.1.4 (2014/12/23 osfans) -- 修复所有栏目。 -- 使用beautifulsoup4 - -v1.1.3 (2013/06/13) -- 修复“歌手”栏目。 - -v1.1.2 (2013/06/05 by wenli380@gamil.com) -- 修正网站变化造成无法获取歌曲播放地址。 - -v1.1.1 (2012/10/28 by runner6502@gamil.com) -- change AAC to the first download. - -v1.1.0 (2011/12/04 by d44000) -- 全面支持酷我站内的音乐内容,增加音乐分类,专辑,等等。 -- 增加搜索功能,支持基于百度输入法的中文输入法插件 -- 暂不支持MV播放。(酷我网站不支持基于HTTP的MV播放,如有其它方法,请告知。) - -v1.0.0 (2009/11/08 by robinttt) -- 初始版本 diff --git a/plugin.audio.kuwobox/default.py b/plugin.audio.kuwobox/default.py deleted file mode 100644 index 1db9b50..0000000 --- a/plugin.audio.kuwobox/default.py +++ /dev/null @@ -1,605 +0,0 @@ -# -*- coding: utf-8 -*- - -#v1.0.0 2009/11/08 by robinttt, initial release -#v1.1.0 2011/12/04 by d744000, full web scraping, added search. - -import xbmc -import xbmcplugin -import xbmcgui -import xbmcaddon -import urllib -import urllib2 -import os -import re -import sys -import gzip -import StringIO #playvideo -import hashlib -import time -from bs4 import BeautifulSoup - - -UserAgent = 'Mozilla/5.0 (Windows NT 5.1; rv:8.0) Gecko/20100101 Firefox/8.0' -URL_BASE = 'http://yinyue.kuwo.cn' -MAX_TEST = 300 -INDENT_STR = ' ' -BANNER_FMT = '[COLOR FFDEB887]【%s】[/COLOR]' - - -# -# Web process engine -# -def getUrlTree(url, data=None): - if data and not isinstance(data, str): - # 2-item tuple or param dict, assume utf-8 - data = urllib.urlencode(data) - req = urllib2.Request(url, data, {'User-Agent': UserAgent}) - response = urllib2.urlopen(req) - httpdata = response.read() - response.close() - if response.headers.get('content-encoding', None) == 'gzip': - httpdata = gzip.GzipFile(fileobj=StringIO.StringIO(httpdata)).read() - # BeautifulSoup handles encoding, thus skip transcoding here. - - tree = BeautifulSoup(httpdata, "html.parser") - return tree - - -def make_param(query, url=None): - if url is None: - url = sys.argv[0] - param = "%s?%s" % (url, urllib.urlencode(query)) - return param - - -def addDir(name, url, mode, iconimage='DefaultFolder.png', context={}, folder=True, total=0): - if url == '#@': - url = params['url'] - elif url.startswith('/'): - url = URL_BASE + url - - param = {"url": url, "mode": mode} - param.update(context) - u = make_param(param) - - item = xbmcgui.ListItem(name, iconImage=iconimage, thumbnailImage=iconimage) - xbmcplugin.addDirectoryItem(pluginhandle, url=u, listitem=item, isFolder=folder, totalItems=total) - - -def endDir(cache=True): - xbmcplugin.endOfDirectory(pluginhandle, cacheToDisc=True) - - -context_params = {} - - -def driller(tree, lCont): - # global item - global context_params - if not isinstance(lCont, list): - lCont = [lCont] - - for cont in lCont: - result = None - context_params = cont.get('context', {}) - items = tree.find_all(*cont['tag']) - # print("to find:", cont) - for item in items: - # print('found') - if cont.get('vect', None): - try: - result = cont['vect'](item) - except: - pass - if result != 'DRILLER_NO_DEEPER': - if cont.get('child', None): - driller(item, cont['child']) - - -def processWebPage(tagHandler): - global tree - url = params['url'] - post = params.get('urlpost', None) - tree = getUrlTree(url, post) - driller(tree, tagHandler) - endDir() - - -def get_params(params): - param = {} - if len(params) >= 2: - if len(params) == 2: - params = params[1] - param = dict(urllib2.urlparse.parse_qsl(params)) - return param - - -# -# Keyboard for search -# -def processSearch(url): - key = get_params(url).get('key', None) - params['url'] = url - params['indent'] = INDENT_STR - params['search_key'] = key - processWebPage(searchList) - - -def searchDefaultKeyboard(key=None, mode='all'): - if key: - url = make_param({"key": key, 'type': mode}, 'http://sou.kuwo.cn/ws/NSearch') - processSearch(url) - else: - keyb = xbmc.Keyboard('', '搜索(可用拼音)') - keyb.doModal() - if keyb.isConfirmed(): - key = keyb.getText() - - -def searchChineseKeyboard(key=None, mode='all', pn=0): - if key: - url = make_param({"key": key, 'type': mode}, 'http://sou.kuwo.cn/ws/NSearch') - processSearch(url) - else: - # Somehow, current chinese keyboard implementation works differently than the - # default keyboard. The doModal doesn't prevent xbmcplugin from popping up the - # directory-scanning window, which covers up the keyboard window. - # A workaround is to terminate the directory, doModal, pass in keyboard input - # as new param of the container, then relaunch the container. - xbmcplugin.endOfDirectory(int(sys.argv[1])) - # 中文输入法 - keyboard = ChineseKeyboard.Keyboard('', '搜索') - keyboard.doModal() - if keyboard.isConfirmed(): - keyword = keyboard.getText() - if keyword: - u = make_param({'url': '', 'mode': 'search("%s")' % keyword}) - xbmc.executebuiltin('Container.Update(%s,replace)' % u) - - -# -# Media player -# -def get_content_by_tag(tree, tag): - f = tree.find(tag) - if f and f.contents: - return f.contents[0].encode('utf-8') - else: - return '' - - -def PlayMusic(): - mids = params['url'] - - playlist = xbmc.PlayList(xbmc.PLAYLIST_MUSIC) - playlist.clear() - mids = mids.split('/') - for mid in mids: - if mid == '': - continue - tree = getUrlTree('http://player.kuwo.cn/webmusic/st/getNewMuiseByRid?rid=MUSIC_'+mid) - title = get_content_by_tag(tree, 'name') - # kuwo has names like "song name(抢听版)", causing lyrics look up failure - true_title = title.split('(')[0].rstrip() - artist = get_content_by_tag(tree, 'artist') - iconimage = get_content_by_tag(tree, 'artist_pic240') - - # prefer AAC or WMA, somehow it starts or loads faster than the mp3 link, - # change AAC to the first download. edit by runner6502@gamil.com - path = get_content_by_tag(tree, 'aacpath') - dl = get_content_by_tag(tree, 'aacdl') - if not (path and dl): - path = get_content_by_tag(tree, 'path') - dl = get_content_by_tag(tree, 'wmadl') - if not (path and dl): - path = get_content_by_tag(tree, 'mp3path') - dl = get_content_by_tag(tree, 'mp3dl') - - if path and dl: - timestamp = ("%x" % int(time.time()))[:8] - hashstr = hashlib.md5("kuwo_web@1906/resource/%s%s" % (path, timestamp)).hexdigest() - url = 'http://%s/%s/%s/resource/%s' % (dl, hashstr, timestamp, path) - - listitem = xbmcgui.ListItem(title, iconImage=iconimage, thumbnailImage=iconimage) - listitem.setInfo(type="Music", infoLabels={"Title": true_title, "Artist": artist}) - playlist.add(url, listitem) - - xbmc.Player().play(playlist) - - -# -# Utilities -# -def addBanner(name): - ''' Add a banner, a button without action, but to separate groups of other buttons. ''' - # Burlywood color - if name: - name = BANNER_FMT % name - addDir(name, '', 'pass', '', folder=False) - - -def addH1Banner(item): - addBanner(item.h1.text.encode('utf-8')) - - -def addNav(item, mode): - item_url = extractHref(item) - if item_url == '#@': - return - name = extractName(item) - addDir(name, item_url, mode, '') - - -# -# Kuwo tag handlers -# -def extractName(item): - if not item: - return '' - name = '' - span_name = item.find('span') - if span_name: - name = span_name.contents[0] - elif item.has_attr('title'): - name = item['title'] - elif item.contents: - content = item.contents[0] - if 'String' in str(type(content)): - #BeautifulSoup NavigableString - name = content - else: - try: - name = content['title'] - except: - pass - return name.encode('utf-8') - - -def extractHref(item): - if item and item.has_attr('href'): - return item['href'].encode('utf-8') - return '' - - -def extractImg(item): - if item: - for k in ['lazy_src', 'sr', 'src', 'init_src']: - if item.has_attr(k): - return item[k].encode('utf-8') - return '' - - -def extractImgSearch(item, name=''): - iconimage = extractImg(item.find('img')) - if (not iconimage) and name: - attrs = {'title': unicode(name, 'utf-8')} - iconimage = extractImg(item.findChild('img', attrs)) - if not iconimage: - iconimage = extractImg(item.findPreviousSibling('img', attrs)) - if not iconimage: - iconimage = extractImg(item.findParent().findPreviousSibling('img', attrs)) - return iconimage - - -# -# XBMC plugin -# -def addLink(title, artist, url, mode, iconimage='', total=0, video=False): - u = make_param({'url': url, 'mode': mode}) - displayname = artist + ' - ' + title if artist else title - displayname = INDENT_STR + displayname - itemType = 'Video' if video else 'Music' - - item = xbmcgui.ListItem(displayname, iconImage=iconimage, thumbnailImage=iconimage) - item.setInfo(type=itemType, infoLabels={'Title': title, 'Artist': artist}) - xbmcplugin.addDirectoryItem(pluginhandle, url=u, listitem=item, isFolder=False, totalItems=total) - - -def addBillboardPhase(item): - nxt_idx = None - cur_idx = params.get('billboard_idx', item.find('li')['idx'].encode('utf-8')) - cur_item = item.find('li', {'idx': cur_idx}) - if cur_item: - tabDef = cur_item.find('p') - if tabDef and tabDef.contents: - params['playall_title'] = ('播放' + tabDef.contents[0].encode('utf-8') + '歌曲') - nxt_item = cur_item.findNextSibling('li') - if nxt_item: - nxt_idx = nxt_item['idx'].encode('utf-8') - - # previous billboard phase - if nxt_idx: - rgtArrow = item.find(attrs={'id': 'goRight', 'class': 'jtRig'}) - if rgtArrow and rgtArrow.has_attr('onclick'): - catId = re.search("getData\((\d+),1\)", rgtArrow['onclick']) - if catId: - catId = catId.groups()[0].encode('utf-8') - url = 'http://yinyue.kuwo.cn/yy/dd/BillBoardIndex' - post = 'cat='+catId+'&phase='+nxt_idx - context = {'urlpost': post, 'billboard_idx': nxt_idx, 'billboard_phases': str(item)} - addDir('查看前一期', url, 'processWebPage([songList])', '', context=context) - - -# 排行榜 -def addBoardMusic(item): - mid = item.find(attrs={'type': 'checkbox'}) - if not (mid and mid.has_attr('mid')): - return - mid = mid['mid'] - title = item.find(attrs={'class': 'songName'}).a['title'].encode('utf-8') - # artist page has album name in 'class songer', not artist name - artist = params.get('artist', '') - if not artist: - chld = item.find(attrs={'class': 'songer'}) - if chld and chld.findChild('a'): - chld = chld.findChild('a') - if chld.has_attr('title'): - artist = chld['title'].encode('utf-8') - addLink(title, artist, mid, 'PlayMusic()', '') - - -def addBoardMusicList(item): - if 'billboard_phases' in params: - print(params['billboard_phases']) - phase_item = BeautifulSoup(params['billboard_phases'], "html.parser") - addBillboardPhase(phase_item) - mids = item.find_all(attrs={'type': 'checkbox'}) - mids = [x['mid'] for x in mids if x.has_attr('mid')] - if mids: - mids = '/'.join(mids) - disp_title = params.get('playall_title', '播放全部歌曲') - iconimg = params.get('playall_icon', '') - addDir(disp_title, mids, 'PlayMusic()', iconimg, folder=False) - - -def addBoard(item): - name = extractName(item) - item_url = extractHref(item) - iconimage = extractImgSearch(item, name) - mode = 'processWebPage(boardMusicList)' - playall_title = '播放【%s】所含曲目' % name - context = {'indent': INDENT_STR, 'playall_title': playall_title, 'playall_icon': iconimage} - addDir(name, item_url, mode, iconimage, context=context) - - -# 歌手 -def addArtistMusicNav(item): - addNav(item, 'processWebPage(artistMusicPage)') - - -def addArtistNav(item): - addNav(item, 'processWebPage(artistListPage)') - - -def addArtistList(item): - item_url = extractHref(item.a) + "music.htm" - name = INDENT_STR + extractName(item.a) - iconimage = extractImg(item.a.img) - addDir(name, item_url, 'processWebPage(artistMusicPage)', iconimage) - - -def addArtistCategory(item): - item = item.h1 - item_url = "http://www.kuwo.cn%s" % extractHref(item.a) - name = item.contents[0].encode('utf-8') - addDir(name, item_url, 'processWebPage(artistListPage)', '') - - -# 分类 -def addHotMusic(item): - l = re.findall('"musiclist":(\[.+\]),"rids"', item.text) - if not l: - return - l = eval(l[0]) - mids = "/".join([d['musicrid'] for d in l]) - disp_title = params.get('playall_title', '播放全部歌曲') - iconimg = params.get('playall_icon', '') - addDir(disp_title, mids, 'PlayMusic()', iconimg, folder=False) - for d in l: - title = d['name'] - artist = d['artist'] - mid = d['musicrid'] - addLink(title, artist, mid, 'PlayMusic()', '') - - -def addHotMusicList(item): - ''' playlist item ''' - url = extractHref(item.a) - name = extractName(item.a) - iconimg = extractImg(item.a.img) - playall_title = '播放【%s】所含曲目' % name - context = {'indent': INDENT_STR, 'playall_title': playall_title, 'playall_icon': iconimg} - addDir(INDENT_STR + name, url, 'processWebPage(hotMusic)', iconimg, context=context) - - -def addHotList(item): - ''' playlist item ''' - url = extractHref(item.a) - name = extractName(item.a) - iconimg = extractImg(item.a.img) - playall_title = '' - context = {'indent': INDENT_STR, 'playall_title': playall_title, 'playall_icon': iconimg} - if name in hotSubList: - addDir(name, url, 'processWebPage(hotList)', iconimg, context=context) - else: - addDir(INDENT_STR + name, url, 'processWebPage(hotMusicListPage)', iconimg, context=context) - - -# 专辑 -def addMusic(item): - '''for mingxing and album''' - artist = item.find(attrs={'class': 's_name'}).a['title'].encode('utf-8') - title = item.find(attrs={'class': 'm_name'}).a['title'].encode('utf-8') - mid = item.find(attrs={'class': 'number'}).input['mid'].encode('utf-8') - addLink(title, artist, mid, 'PlayMusic()', '') - - -def addAlbumMusicList(item): - disp_title = params.get('playall_title', '播放全部歌曲') - iconimg = params.get('playall_icon', '') - mids = [i.input['mid'] for i in item.find_all(attrs={'class': 'number'})] - mids = "/".join(mids) - addDir(disp_title, mids, 'PlayMusic()', iconimg, folder=False) - - -def addAlbum(item): - # album item - url = extractHref(item.a) - title = extractName(item.a) - iconimg = extractImg(item.find('img')) - albumCont = item.findNextSibling(attrs={'class': 'albumCont'}) - playall_title = '播放【' + title + '】所含曲目' - dispname = title - context = {'indent': INDENT_STR, 'playall_title': playall_title, 'playall_icon': iconimg} - dispname = params.get('indent', '') + dispname - addDir(dispname, url, 'processWebPage(albumMusicList)', iconimg, context=context) - - -def addAlbumNav(item): - mode = 'processWebPage(albums)' - addNav(item, mode) - - -def addAlbumList(item): - item_url = extractHref(item.a) - name = item.a.string.encode('utf-8') - mode = 'processWebPage(albums)' - addDir(name, item_url, mode, '') - - -# 淘歌单 -def addPlaylistMusic(item): - s = item.string - if not s: - return - l = re.findall('wbarr =(.*?);', s) - if not l: - return - l = eval(l[0]) - mids = "/".join([d['rid'].split('_')[1] for d in l]) - disp_title = params.get('playall_title', '播放全部歌曲') - iconimg = params.get('playall_icon', '') - addDir(disp_title, mids, 'PlayMusic()', iconimg) - for d in l: - title = d['name'] - artist = d['art'] - mid = d['rid'].split('_')[1] - addLink(title, artist, mid, 'PlayMusic()', '') - - -def addPlaylistAlbum(item): - iconimg = extractImg(item.find('img')) - item = item.find('a', attrs={'class': 'gdPlay'}) - url = extractHref(item) - title = extractName(item.find_previous_sibling('a')) - playall_title = '播放【%s】' % title - playall_icon = iconimg - score = item.find_next_sibling().text.encode('utf-8') - dispname = '%s【%s】' % (title, score) - context = {'indent': INDENT_STR, 'playall_title': playall_title, 'playall_icon': iconimg} - dispname = params.get('indent', '') + dispname - addDir(dispname, url, 'processWebPage(playlistMusic)', iconimg, context=context) - - -def addPlaylist(item): - addBanner(item.text.encode('utf-8')) - items = item.find_next_sibling().find_all('li') - for item in items: - item = item.a - name = extractName(item) - item_url = extractHref(item) - iconimage = extractImgSearch(item, name) - addDir(name, item_url, 'processWebPage(playlistAlbum)', iconimage) - - -# 搜索 -def addSearch(item): - name = BANNER_FMT % item.h1.text.encode('utf-8') - item_url = extractHref(item.h1.a) - if item_url: - mode = 'processSearch("%s")' % item_url - else: - mode = 'pass' - addDir(name, item_url, mode, '') - - -def addSearchNav(item): - item_url = extractHref(item) - mode = 'processSearch("http://sou.kuwo.cn%s")' % item_url - addNav(item, mode) - - -# 标签 -boardMusic = {'tag': (None, {'class':'itemUl'}), 'vect':addBoardMusic} -boardMusicList = {'tag': (None, {'id':'container'}), 'vect':addBoardMusicList, 'child': boardMusic} -board = {'tag':('a',{}), 'vect':addBoard} -boardPage = {'tag':('ul',{'class':['borLr', 'chartList']}), 'child': board} - -artistMusic = {'tag': ('li', {'class': 'clearfix'}), 'vect': addMusic} -artistMusicNav = {'tag': ('a', {}), 'vect': addArtistMusicNav} -artistMusicNavPage = {'tag': ('div', {'class': 'page'}), 'child': artistMusicNav} -artistMusicPage = [artistMusic, artistMusicNavPage] -artistListItem = {'tag': ('li', {}), 'vect': addArtistList} -artistList = {'tag': ('ul', {'class': ['singer_pic_list', 'singer_name_list']}), 'child': artistListItem} -artistNav = {'tag': ('a', {}), 'vect': addArtistNav} -artistNavPage = {'tag': ('div', {'class': 'page'}), 'child': artistNav} -artistListPage = [artistList, artistNavPage] -artistCategory = {'tag': ('div', {'class': 'top'}), 'vect': addArtistCategory} -artistPage = {'tag': ('div', {'class': 'singer'}), 'child': artistCategory} - -hotMusic = {'tag': ('script', {}), 'vect': addHotMusic} -hotMusicList = {'tag': ('li', {}), 'vect': addHotMusicList} -hotMusicListPage = {'tag': ('ul', {'class': 'singer_list clearfix'}), 'child': hotMusicList} -hotList = {'tag': ('li', {}), 'vect': addHotList} -hotPage = {'tag': ('div', {'class': 'hotlist'}), 'vect': addH1Banner, 'child': hotList} -hotSubList = {'评书', '有声读物', '歌手'} - - -albumMusic = {'tag': ('li', {}), 'vect': addMusic} -albumMusicList = {'tag': ('div', {'class': 'm_list'}), 'vect': addAlbumMusicList, 'child': albumMusic} -album = {'tag': (None, {'class': 'music clearfix'}), 'vect': addAlbum, 'child': None} -albumNav = {'tag': ('a', {}), 'vect': addAlbumNav} -albumNavPage = {'tag': ('div', {'class': 'page'}), 'child': albumNav} -albums = [album, albumNavPage] -albumList = {'tag': ('li', {}), 'vect': addAlbumList, 'child': None} -albumPage = {'tag': (None, {'class': 'sdlist clearfix'}), 'vect': addH1Banner, 'child': albumList} - -playlistMusic = {'tag': ('script', {}), 'vect': addPlaylistMusic} -playlistAlbum = {'tag': ('div', {'class': 'albumItem'}), 'vect': addPlaylistAlbum} -playlistBanner = {'tag': ('p', {'class': ['mTitBg', 'titYh', "titYh titLr"]}), 'vect': addPlaylist} -playlistPage = {'tag': ('div', {'class': 'mw300'}), 'child': playlistBanner} - -searchArtist = {'tag': ('div', {'class': 'hotSinger'}), 'vect': addSearch, 'child': artistListItem} -searchMusic = {'tag': ('div', {'class': 'm_list'}), 'vect': addSearch, 'child': albumMusic} -searchAlbumItem = {'tag': ('li', {}), 'vect': addAlbum} -searchAlbum = {'tag': ('div', {'class': 'album'}), 'vect': addSearch, 'child': searchAlbumItem} -searchNav = {'tag': ('a', {}), 'vect': addSearchNav} -searchNavPage = {'tag': ('div', {'class': 'page'}), 'child': searchNav} -searchList = [searchArtist, searchMusic, searchAlbum, searchNavPage] - - -# main program goes here ###################### -# Choose ChineseKeyboard if script.module.keyboard.chinese is installed. -try: - import ChineseKeyboard - search = searchChineseKeyboard -except: - search = searchDefaultKeyboard - - -pluginhandle = int(sys.argv[1]) -params = sys.argv[2][1:] -params = dict(urllib2.urlparse.parse_qsl(params)) -mode = params.get('mode', None) -if mode: - exec(mode) -else: - # params['url'] = URL_BASE - addDir('搜索', '', 'search()') - addDir('排行榜', 'http://yinyue.kuwo.cn/billboard_%E9%9B%AA%E7%A2%A7%E6%98%8E%E6%98%9F%E6%A6%9C.htm', 'processWebPage(boardPage)') - addDir('歌手', 'http://www.kuwo.cn/mingxing', 'processWebPage(artistPage)') - addDir('分类', 'http://yinyue.kuwo.cn/category.htm', 'processWebPage(hotPage)') - addDir('专辑', 'http://www.kuwo.cn/album', 'processWebPage(albumPage)') - addDir('淘歌单', 'http://fang.kuwo.cn/p/st/PlCat', 'processWebPage(playlistPage)'); - - endDir() diff --git a/plugin.audio.kuwobox/icon.png b/plugin.audio.kuwobox/icon.png deleted file mode 100644 index dc518eb..0000000 Binary files a/plugin.audio.kuwobox/icon.png and /dev/null differ diff --git a/plugin.audio.kuwobox/plugin.audio.kuwobox-1.1.5.zip b/plugin.audio.kuwobox/plugin.audio.kuwobox-1.1.5.zip deleted file mode 100644 index 164585e..0000000 Binary files a/plugin.audio.kuwobox/plugin.audio.kuwobox-1.1.5.zip and /dev/null differ diff --git a/plugin.audio.qingting/plugin.audio.qingting-1.0.1.zip b/plugin.audio.qingting/plugin.audio.qingting-1.0.1.zip index 6ff7830..63d6262 100644 Binary files a/plugin.audio.qingting/plugin.audio.qingting-1.0.1.zip and b/plugin.audio.qingting/plugin.audio.qingting-1.0.1.zip differ diff --git a/plugin.audio.xiami/addon.py b/plugin.audio.xiami/addon.py new file mode 100644 index 0000000..c17b333 --- /dev/null +++ b/plugin.audio.xiami/addon.py @@ -0,0 +1,337 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +from xbmcswift2 import Plugin +from bs4 import BeautifulSoup +import re +from json import loads +from common import get_html +from iqiyi import video_from_vid as IQIYI_from_vid +from yinyuetai import video_from_vid as YINYUETAI_from_vid + +plugin = Plugin() +url_for = plugin.url_for + +HOST = 'http://www.xiami.com' +BANNER_FMT = '[COLOR gold][%s][/COLOR]' + + +def pageList(tree, endpoint): + pages = tree.find_all('a', {'class': 'page-navigator-number'}) + items = [{ + 'label': page.text.strip(), + 'path': url_for(endpoint, url=page['href'].encode('utf-8')) + } for page in pages] + + return items + +@plugin.route('/stay') +def stay(): + pass + +@plugin.route('/playMV/////') +def playMV(source, tvid, vid, mvid, url): + if source == 'iqiyi': + urls = IQIYI_from_vid(tvid, vid) + + elif source == 'yinyuetai': + match = re.search('yinyuetai.com.*/(\d+)', url) + urls = YINYUETAI_from_vid(match.group(1)) + + url = 'stack://' + ' , '.join(urls) + plugin.set_resolved_url(url) + +@plugin.route('/MVList/') +def MVList(url): + if url[0] == '/': + url = HOST + url + page = get_html(url) + songs= re.findall('data.push\((.+)\)', page) + items = [] + + for str_item in songs: + item = loads(str_item) + songId = item['songId'] + albumId = item['albumId'] + albumTitle = item['albumTitle'] + author = item['author'] + authorId = item['authorId'] + tvid = item['tvid'] + vid = item['vid'] + mvid = item['mvid'] + file_link = item.get('file_link') + if file_link is None: + file_link = '' + + items.append({ + 'label': item['title'], + 'path': url_for('playMV', + source=item['source'], + tvid='0' if tvid == '' else tvid, + vid='0' if vid == '' else vid, + mvid='0' if mvid == '' else mvid, + url=file_link), + 'info': {'title': item['title'], 'duration': item['time']}, + 'is_playable': True + }) + + return items + + +@plugin.route('/musiclist/') +def musiclist(url): + if url[0] == '/': + url = HOST + url + + page = get_html(url, decoded=True) + tree = BeautifulSoup(page, 'html.parser') + soup = tree.find_all('li', {'class': 'mv-item'}) + + items = [{ + 'label': item.a['title'], + 'thumbnail': item.img['org_src'], + 'path': url_for('MVList', url=item.a['href']), + } for item in soup] + + items += pageList(tree, 'musiclist') + + return items + + +@plugin.route('/mv') +def mv(): + page = get_html(HOST + '/mv/ml') + tree = BeautifulSoup(page, 'html.parser') + soups = tree.find_all('ul', {'class': 'clearfix'}) + + items = [] + for soup in soups: + p = soup.find_all('li') + for item in p: + items.append({ + 'label': item.text.strip(), + 'path': url_for('musiclist', url=item.a['href']) + }) + + return items + +@plugin.route('/playBD/') +def playBD(sid): + data = loads(get_html( + HOST + '/data/music/fmlink?songIds=%s' % sid + ))['data'] + + if data['xcode'] != '': # inside china mainland + url = data['songList'][0]['songLink'] + plugin.set_resolved_url(url) + + +@plugin.route('/taglist/') +def taglist(url): + if url[0] == '/': + url = HOST + url + + page = get_html(url, decoded=False) + tree = BeautifulSoup(page, 'html.parser') + soups= tree.find_all('span', {'class': 'music-icon-hook'}) + + items = [] + + for item in soups: + js = loads(item['data-musicicon']) + albumId = js['albumId'] + + items.append({ + 'label': js['songTitle'], + 'path': url_for('playBD', sid=js['id']), + 'is_playable': True, + 'info': {'title': js['songTitle']} + }) + + items += pageList(tree, 'taglist') + return items + +@plugin.route('/tag') +def tag(): + page = get_html(HOST + '/tag') + tree = BeautifulSoup(page, 'html.parser') + items = [] + soups = tree.find_all('dl', {'class': 'tag-mod'}) + + for soup in soups: + items += [{'label': BANNER_FMT % soup.dt.text, 'path': url_for('stay')}] + p = soup.find_all('span', {'class': 'tag-list clearfix'}) + for item in p: + items.append({ + 'label': item.text.strip(), + 'path': url_for('taglist', url=item.a['href']) + }) + + return items + +@plugin.route('/artistAlbum/') +def artistAlbum(url): + if url[0] == '/': + url = HOST + url + + page = get_html(url, decoded=False) + tree = BeautifulSoup(page, 'html.parser') + pages = tree.find_all('div', {'class': 'page-inner'}) + + items = [] + + # songs + items += [{'label': '单曲', 'path': url_for('stay')}] + soup1 = tree.find_all('div', {'class': 'song-list-wrap'}) + soups = soup1[0].find_all('span', {'class': 'music-icon-hook'}) + for item in soups: + js = loads(item['data-musicicon']) + albumId = js['albumId'] + + items.append({ + 'label': js['songTitle'], + 'path': url_for('playBD', sid=js['id']), + 'is_playable': True, + 'info': {'title': js['songTitle']} + }) + + items += pageList(pages[0], 'artistAlbum') + + # albums + items += [{'label': '专辑', 'path': url_for('stay')}] + soup2 = tree.find_all('div', {'class': 'album-list-wrap'}) + soups = soup2[0].find_all('div', {'class': 'album-cover'}) + for item in soups: + js = loads(item['data-albumdata']) + items.append({ + 'label': js['albumTitle'], + 'thumbnail': js['albumPic'], + 'path': url_for('taglist', url='/album/'+js['id']), + }) + + items += pageList(pages[1], 'artistAlbum') + + # mvs + items += [{'label': 'MV', 'path': url_for('stay')}] + soup3 = tree.find_all('div', {'class': 'mv-list-wrap'}) + soups = soup3[0].find_all('li', {'class': 'mv-item'}) + for item in soups: + items.append({ + 'label': item.a['title'], + 'thumbnail': item.img['org_src'], + 'path': url_for('MVList', url=item.a['href']), + }) + items += pageList(pages[2], 'artistAlbum') + return items + + +@plugin.route('/artistName/') +def artistName(url): + if url[0] == '/': + url = HOST + url + + page = get_html(url) + tree = BeautifulSoup(page, 'html.parser') + soups = tree.find_all('ul', {'class': 'clearfix'}) + items = [] + for soup in soups: + p = soup.find_all('li') + for item in p: + try: + items.append({ + 'label': item.text.strip(), + 'path': url_for('artistAlbum', url=item.a['href']) + }) + except: + pass + + return items + +@plugin.route('/artist') +def artist(): + page = get_html(HOST + '/artist') + tree = BeautifulSoup(page, 'html.parser') + soups = tree.find_all('dl', {'class': 'tree_main'}) + + items = [] + for soup in soups: + p = soup.find_all('dd') + for item in p: + items.append({ + 'label': item.text.strip(), + 'path': url_for('artistName', url=item.a['href']) + }) + + return items + +#排行榜 +@plugin.route('/chart') +def chart(): + pass +#专辑 +@plugin.route('/album/') +def album(url): + thisPage = [ + ('全部', 'all'), + ('华语', 'huayu'), + ('欧美', 'oumei'), + ('日本', 'ri'), + ('韩国', 'han')] + if url == '0' + url = HOST + '/music/newalbum?' + + for x in thisPage: + yield { + 'label': x[0], + 'path' : url_for('album', url=url+'type='+x[1]) + } + +#艺人 +@plugin.route('/artist/') +def artist(url): + pass +#曲风 +@plugin.route('/genre/') +def genre(url): + pass + + +@plugin.route('/homepage/') +def homepage(url): + page = get_html(HOST) + tree = BeautifulSoup(page, 'html.parser') + soup = tree.find_all('div', {'class': 'songlist-tag'}) + soups = soup[0].find_all('dl') + + items = [] + for soup in soups: + items += [{'label': BANNER_FMT % soup.dt.text, 'path': url_for('stay')}] + p = soup.find_all('dd') + for item in p: + items.append({ + 'label': item.text.strip(), + 'path': url_for('albumlist', url=item.a['href'].encode('utf-8')) + }) + + return items + + +@plugin.route('/') +def root(): + mainlist = [ + {'热门': 'homepage'}, + {'排行榜': 'chart'}, + {'专辑': 'album'}, + {'艺人': 'artist'}, + {'风格': 'genre'} + ] + + items = [{ + 'label': item, + 'path': url_for(mainlist[item], url=HOST), + } for item in mainlist] + + return items + +if __name__ == '__main__': + plugin.run() diff --git a/plugin.audio.xiami/addon.xml b/plugin.audio.xiami/addon.xml new file mode 100644 index 0000000..760feba --- /dev/null +++ b/plugin.audio.xiami/addon.xml @@ -0,0 +1,24 @@ + + + + + + + + + + audio + + + Xiami audio plugin + 虾米音乐插件 + Xiami Music Kodi Plugin + 虾米音乐插件 + https://github.com/yfang1644/kodi_plugins/plugin.audio.xiami + yfang1644@gmail.com + all + + diff --git a/plugin.audio.xiami/changelog.txt b/plugin.audio.xiami/changelog.txt new file mode 100644 index 0000000..0876c1b --- /dev/null +++ b/plugin.audio.xiami/changelog.txt @@ -0,0 +1,3 @@ + +2017.11.18 +- 初始版本 diff --git a/plugin.audio.xiami/icon.png b/plugin.audio.xiami/icon.png new file mode 100644 index 0000000..c08b69d Binary files /dev/null and b/plugin.audio.xiami/icon.png differ diff --git a/plugin.audio.xiami/plugin.audio.xiami-1.0.1.zip b/plugin.audio.xiami/plugin.audio.xiami-1.0.1.zip new file mode 100644 index 0000000..babc9e9 Binary files /dev/null and b/plugin.audio.xiami/plugin.audio.xiami-1.0.1.zip differ diff --git a/plugin.audio.ximalaya/addon.py b/plugin.audio.ximalaya/addon.py index 4b9a040..50446ee 100644 --- a/plugin.audio.ximalaya/addon.py +++ b/plugin.audio.ximalaya/addon.py @@ -15,8 +15,6 @@ url_for = plugin.url_for # Plugin constants -__addonid__ = plugin.addon.getAddonInfo('id') -__addonname__ = plugin.addon.getAddonInfo('name') stream_types = [ {'itag': '1', 'container': 'm4a', 'bitrate': 'default'}, diff --git a/plugin.audio.ximalaya/addon.xml b/plugin.audio.ximalaya/addon.xml index 6377fb4..14a9e9b 100644 --- a/plugin.audio.ximalaya/addon.xml +++ b/plugin.audio.ximalaya/addon.xml @@ -1,11 +1,11 @@ - + audio diff --git a/plugin.audio.ximalaya/plugin.audio.ximalaya-1.0.4.zip b/plugin.audio.ximalaya/plugin.audio.ximalaya-1.1.0.zip similarity index 79% rename from plugin.audio.ximalaya/plugin.audio.ximalaya-1.0.4.zip rename to plugin.audio.ximalaya/plugin.audio.ximalaya-1.1.0.zip index d198127..5fc7abe 100644 Binary files a/plugin.audio.ximalaya/plugin.audio.ximalaya-1.0.4.zip and b/plugin.audio.ximalaya/plugin.audio.ximalaya-1.1.0.zip differ diff --git a/plugin.video.baidu/addon.xml b/plugin.video.baidu/addon.xml index 02664c8..3560414 100644 --- a/plugin.video.baidu/addon.xml +++ b/plugin.video.baidu/addon.xml @@ -1,12 +1,20 @@ - + + + + + + + + + diff --git a/plugin.video.baidu/plugin.video.baidu-1.0.0.zip b/plugin.video.baidu/plugin.video.baidu-1.1.0.zip similarity index 96% rename from plugin.video.baidu/plugin.video.baidu-1.0.0.zip rename to plugin.video.baidu/plugin.video.baidu-1.1.0.zip index 0c5530f..8f6e38f 100644 Binary files a/plugin.video.baidu/plugin.video.baidu-1.0.0.zip and b/plugin.video.baidu/plugin.video.baidu-1.1.0.zip differ diff --git a/plugin.video.bilibili/addon.xml b/plugin.video.bilibili/addon.xml index 10ba505..628a6c6 100644 --- a/plugin.video.bilibili/addon.xml +++ b/plugin.video.bilibili/addon.xml @@ -1,16 +1,18 @@ + version="1.1.0" + provider-name="yfang1644"> - + + video + all Plugin for bilibili diff --git a/plugin.video.bilibili/changelog.txt b/plugin.video.bilibili/changelog.txt index 426a23c..d4e94c0 100644 --- a/plugin.video.bilibili/changelog.txt +++ b/plugin.video.bilibili/changelog.txt @@ -1,3 +1,5 @@ +2018.08.27 +- change structures v1/0.4 (2017-06-18) - 修复临时文件夹路径 diff --git a/plugin.video.bilibili/default.py b/plugin.video.bilibili/default.py index 97fa6be..7861f91 100644 --- a/plugin.video.bilibili/default.py +++ b/plugin.video.bilibili/default.py @@ -2,9 +2,10 @@ #coding=utf-8 from xbmcswift2 import Plugin, xbmc, xbmcgui -from resources.lib.bilibili import Bilibili -from resources.lib.subtitle import subtitle_offset -from resources.lib.login_dialog import LoginDialog +from lib.bilibili import Bilibili +from lib.subtitle import subtitle_offset +from lib.login_dialog import LoginDialog +from lib.bilivideo import video_from_vid as bilivideo_from_vid import time import string, os from random import choice @@ -181,7 +182,7 @@ def playmovie(cid, vid, name): if vid != '0': urls = video_from_vid(vid) else: - urls = bilibili.get_video_urls(cid) + urls = bilivideo_from_vid(cid) stack_url = 'stack://' + ' , '.join(urls) danmu = plugin.addon.getSetting('danmu') diff --git a/plugin.video.bilibili/lib/.cookie b/plugin.video.bilibili/lib/.cookie new file mode 100644 index 0000000..02e6243 --- /dev/null +++ b/plugin.video.bilibili/lib/.cookie @@ -0,0 +1,9 @@ +# Netscape HTTP Cookie File +# http://curl.haxx.se/rfc/cookie_spec.html +# This is a generated file! Do not edit. + +.bilibili.com TRUE / FALSE 1509245308 DedeUserID 198750789 +.bilibili.com TRUE / FALSE 1509245308 DedeUserID__ckMd5 2ca427075de91396 +.bilibili.com TRUE / FALSE 1509245308 SESSDATA 44259c14%2C1509245308%2C3287f83f +.bilibili.com TRUE / FALSE 1509245308 bili_jct 03c48bce623e2518e8152c8d4814d40a +.bilibili.com TRUE / FALSE 1538189163 sid 4j161bpl diff --git a/plugin.video.bilibili/resources/__init__.py b/plugin.video.bilibili/lib/__init__.py similarity index 100% rename from plugin.video.bilibili/resources/__init__.py rename to plugin.video.bilibili/lib/__init__.py diff --git a/plugin.video.bilibili/resources/lib/bilibili.py b/plugin.video.bilibili/lib/bilibili.py similarity index 99% rename from plugin.video.bilibili/resources/lib/bilibili.py rename to plugin.video.bilibili/lib/bilibili.py index 8263ff5..eba094c 100644 --- a/plugin.video.bilibili/resources/lib/bilibili.py +++ b/plugin.video.bilibili/lib/bilibili.py @@ -27,7 +27,8 @@ class Bilibili(): api_url = 'http://interface.bilibili.com/playurl?' bangumi_api_url = 'http://bangumi.bilibili.com/player/web_api/playurl?' - SEC1 = '1c15888dc316e05a15fdd0a02ed6584f' + #SEC1 = '1c15888dc316e05a15fdd0a02ed6584f' + SEC1 = '94aba54af9065f71de72f5508f1cd42e' SEC2 = '9b288147e5474dd2aa67085f716c560d' supported_stream_profile = [u'流畅', u'高清', u'超清'] stream_types = [ @@ -43,7 +44,7 @@ class Bilibili(): def __init__(self, appkey=APPKEY, appsecret=APPSECRET, width=720, height=480): self.defaultHeader = {'Referer':'http://www.bilibili.com'} - self.defaultHeader = {} + #self.defaultHeader = {} self.appkey = appkey self.appsecret = appsecret self.WIDTH = width diff --git a/plugin.video.bilibili/resources/lib/bilibili_config.py b/plugin.video.bilibili/lib/bilibili_config.py similarity index 100% rename from plugin.video.bilibili/resources/lib/bilibili_config.py rename to plugin.video.bilibili/lib/bilibili_config.py diff --git a/plugin.video.bilibili/lib/biliparser.py b/plugin.video.bilibili/lib/biliparser.py new file mode 100644 index 0000000..3b73af2 --- /dev/null +++ b/plugin.video.bilibili/lib/biliparser.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import hashlib +import re +from json import loads +from xml.dom.minidom import parseString +from common import get_html, match1 + +appkey='f3bb208b3d081dc8' +SECRETKEY_MINILOADER = '1c15888dc316e05a15fdd0a02ed6584f' + + +class BiliVideo(): + name = u'哔哩哔哩 (Bilibili)' + supported_stream_profile = [u'流畅', u'高清', u'超清'] + + def parse_cid_playurl(self, xml): + urls = [] + doc = parseString(xml.encode('utf-8')) + for durl in doc.getElementsByTagName('durl'): + urls.append(durl.getElementsByTagName('url')[0].firstChild.nodeValue) + return urls + + #https://www.bilibili.com/video/av3851533 + def video_from_url(self, url, **kwargs): + level = kwargs.get('level', 0) # set default to best + level += 1 + self.url = url + self.vid = None + fake_headers={'Referer': 'http://www.bilibili.com'} + + if "#page=" in self.url: + page_index = match1(self.url, '#page=(\d+)') + av_id = match1(self.url, '\/(av\d+)') + self.url = 'http://www.bilibili.com/{}/index_{}.html'.format(av_id, page_index) + if not self.vid: + html = get_html(self.url, headers=fake_headers) + self.vid = match1(html, 'cid=\"*(\d+)') + title = match1(html, '([^<]+)').strip(u"_完结动画_番剧_bilibili_哔哩哔哩") + if not self.vid: + eid = match1(self.url, 'anime/v/(\d+)') or \ + match1(self.url, 'play#(\d+)') or \ + match1(html, 'anime/v/(\d+)') + if eid: + html = get_html('http://bangumi.bilibili.com/web_api/episode/{}.json'.format(eid)) + Episode_info = loads(html)['result']['currentEpisode'] + self.vid = Episode_info['danmaku'] + self.title += ' ' + Episode_info['indexTitle'] + '. ' + Episode_info['longTitle'] + + assert self.vid, "can't play this video: {}".format(url) + + pdata = 'cid={}&from=miniplay&player=1&quality={}{}'.format(self.vid, level, SECRETKEY_MINILOADER) + sign_this = hashlib.md5(pdata.encode('utf-8')).hexdigest() + api_url = 'http://interface.bilibili.com/playurl?cid={}&player=1&quality={}&from=miniplay&sign={}'.format(self.vid, level, sign_this) + html = get_html(api_url, headers=fake_headers) + urls = self.parse_cid_playurl(html) + + return urls + +site = BiliVideo() +video_from_url = site.video_from_url + +print video_from_url("https://www.bilibili.com/video/av3851533") diff --git a/plugin.video.bilibili/lib/bilivideo.py b/plugin.video.bilibili/lib/bilivideo.py new file mode 100644 index 0000000..7c31052 --- /dev/null +++ b/plugin.video.bilibili/lib/bilivideo.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from common import get_html +from json import loads +import time +import re +import hashlib +from urllib2 import urlopen, Request + +def get_location(url, headers={}): + response = urlopen(Request(url, headers)) + # urllib will follow redirections and it's too much code to tell urllib + # not to do that + return response.geturl() + +def match1(text, *patterns): + for pattern in patterns: + try: + match = re.search(pattern, text) + except(TypeError): + match = re.search(pattern, str(text)) + if match: + return match.group(1) + + +def matchall(text, patterns): + ret = [] + for pattern in patterns: + try: + match = re.findall(pattern, text) + except(TypeError): + match = re.findall(pattern, str(text)) + ret += match + return ret + +class BiliBase(): + supported_stream_profile = [u'流畅', u'高清', u'超清'] + profile_2_type = {u'超清': 'TD', u'高清': 'HD', u'流畅' :'SD'} + headers = {'Referer': 'https://www.bilibili.com'} + + def parse_cid_playurl(self, xml): + from xml.dom.minidom import parseString + urls = [] + doc = parseString(xml.encode('utf-8')) + ext = doc.getElementsByTagName('format')[0].firstChild.nodeValue + for durl in doc.getElementsByTagName('durl'): + u = durl.getElementsByTagName('url')[0].firstChild.nodeValue + # urls.append(u + '|referer=https://www.bilibili.com') + urls.append(u) + return urls, ext + + def video_from_vid(self, vid, **kwargs): + level = kwargs.get('level', 0) + self.vid = vid + api_url = self.get_api_url(level + 1) + html = get_html(api_url, headers=self.headers) + code = match1(html, '<code>([^<])') + assert not code, "can't play this video: {}".format(match1(html, 'CDATA\[([^\]]+)')) + urls, ext = self.parse_cid_playurl(html) + if ext == 'hdmp4': + ext = 'mp4' + + return urls + + def video_from_url(self, url, **kwargs): + self.url = url + self.vid = '' + self.vid, title = self.get_vid_title() + assert self.vid, "can't play this video: {}".format(self.url) + return self.video_from_vid(self.vid, **kwargs) + + +class BiliBan(BiliBase): + name = u'哔哩哔哩 番剧 (Bilibili Bangumi)' + + def get_vid_title(self): + self.url = get_location(self.url, headers=self.headers) + html = get_html(self.url, headers=self.headers) + title = match1(html, '<h1 title="([^"]+)', '<title>([^<]+)').strip() + + if "movie" in self.url: + aid = match1(html, 'aid=(\d+)', 'aid=\"(\d+)') + form = {"movie_aid" : aid} + vid = loads(get_html("https://bangumi.bilibili.com/web_api/get_source", data=urlencode(form)))["result"]["cid"] + else: + eid = match1(self.url, 'anime/v/(\d+)', 'play#(\d+)', 'ep(\d+)') or match1(html, 'anime/v/(\d+)') + Episode_info = loads(get_content('http://bangumi.bilibili.com/web_api/episode/{}.json'.format(eid)))['result']['currentEpisode'] + vid = Episode_info['danmaku'] + title = title + ' ' + Episode_info['indexTitle'] + '. ' + Episode_info['longTitle'] + + return vid, title + + def get_api_url(self, q): + if "movie" in self.url: + mod = "movie" + else: + mod = "bangumi" + ts = str(int(time.time())) + params_str = 'cid={}&module={}&player=1&quality={}&ts={}'.format(self.vid, mod, q, ts) + SEC2 = '9b288147e5474dd2aa67085f716c560d' + chksum = hashlib.md5(params_str + SEC2).hexdigest() + bangumi_api_url = 'http://bangumi.bilibili.com/player/web_api/playurl?' + return bangumi_api_url + params_str + '&sign=' + chksum + + def prepare_list(self): + sid = match1(html, 'var season_id = "(\d+)";') + j_ = get_content("http://bangumi.bilibili.com/jsonp/seasoninfo/{}.ver".format(sid)) + s_data = loads(j_) + urls = [e['webplay_url'] for e in sorted(s_data['result']['episodes'], key=lambda e: e['index'])] + return urls + + +class BiliVideo(BiliBase): + name = u'哔哩哔哩 (Bilibili)' + + def get_vid_title(self): + if "#page=" in self.url: + page_index = match1(self.url, '#page=(\d+)') + av_id = match1(self.url, '\/(av\d+)') + self.url = 'http://www.bilibili.com/{}/index_{}.html'.format(av_id, page_index) + if not self.vid: + html = get_html(self.url, headers=self.headers) + vid = match1(html, 'cid=(\d+)', 'cid=\"(\d+)') + title = match1(html, '<h1 title="([^"]+)', '<title>([^<]+)').strip() + + return vid, title + + def get_api_url(self, q): + SECRETKEY_MINILOADER = '1c15888dc316e05a15fdd0a02ed6584f' + sign_this = hashlib.md5('cid={}&from=miniplay&player=1&quality={}{}'.format(self.vid, q, SECRETKEY_MINILOADER)).hexdigest() + return 'http://interface.bilibili.com/playurl?cid={}&player=1&quality={}&from=miniplay&sign={}'.format(self.vid, q, sign_this) + + def prepare_list(self): + html = get_html(self.url) + video_list = matchall(html, ['<option value=\'([^\']*)\'']) + if video_list: + return ['http://www.bilibili.com'+v for v in video_list] + +site = BiliVideo() +video_from_url = site.video_from_url +video_from_vid = site.video_from_vid diff --git a/plugin.video.bilibili/resources/lib/login_dialog.py b/plugin.video.bilibili/lib/login_dialog.py similarity index 100% rename from plugin.video.bilibili/resources/lib/login_dialog.py rename to plugin.video.bilibili/lib/login_dialog.py diff --git a/plugin.video.bilibili/resources/lib/niconvert.py b/plugin.video.bilibili/lib/niconvert.py similarity index 100% rename from plugin.video.bilibili/resources/lib/niconvert.py rename to plugin.video.bilibili/lib/niconvert.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/__init__.py b/plugin.video.bilibili/lib/pyasn1/__init__.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/__init__.py rename to plugin.video.bilibili/lib/pyasn1/__init__.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/__init__.py b/plugin.video.bilibili/lib/pyasn1/codec/__init__.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/__init__.py rename to plugin.video.bilibili/lib/pyasn1/codec/__init__.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/ber/__init__.py b/plugin.video.bilibili/lib/pyasn1/codec/ber/__init__.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/ber/__init__.py rename to plugin.video.bilibili/lib/pyasn1/codec/ber/__init__.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/ber/decoder.py b/plugin.video.bilibili/lib/pyasn1/codec/ber/decoder.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/ber/decoder.py rename to plugin.video.bilibili/lib/pyasn1/codec/ber/decoder.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/ber/encoder.py b/plugin.video.bilibili/lib/pyasn1/codec/ber/encoder.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/ber/encoder.py rename to plugin.video.bilibili/lib/pyasn1/codec/ber/encoder.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/ber/eoo.py b/plugin.video.bilibili/lib/pyasn1/codec/ber/eoo.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/ber/eoo.py rename to plugin.video.bilibili/lib/pyasn1/codec/ber/eoo.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/cer/__init__.py b/plugin.video.bilibili/lib/pyasn1/codec/cer/__init__.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/cer/__init__.py rename to plugin.video.bilibili/lib/pyasn1/codec/cer/__init__.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/cer/decoder.py b/plugin.video.bilibili/lib/pyasn1/codec/cer/decoder.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/cer/decoder.py rename to plugin.video.bilibili/lib/pyasn1/codec/cer/decoder.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/cer/encoder.py b/plugin.video.bilibili/lib/pyasn1/codec/cer/encoder.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/cer/encoder.py rename to plugin.video.bilibili/lib/pyasn1/codec/cer/encoder.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/der/__init__.py b/plugin.video.bilibili/lib/pyasn1/codec/der/__init__.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/der/__init__.py rename to plugin.video.bilibili/lib/pyasn1/codec/der/__init__.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/der/decoder.py b/plugin.video.bilibili/lib/pyasn1/codec/der/decoder.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/der/decoder.py rename to plugin.video.bilibili/lib/pyasn1/codec/der/decoder.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/codec/der/encoder.py b/plugin.video.bilibili/lib/pyasn1/codec/der/encoder.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/codec/der/encoder.py rename to plugin.video.bilibili/lib/pyasn1/codec/der/encoder.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/compat/__init__.py b/plugin.video.bilibili/lib/pyasn1/compat/__init__.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/compat/__init__.py rename to plugin.video.bilibili/lib/pyasn1/compat/__init__.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/compat/octets.py b/plugin.video.bilibili/lib/pyasn1/compat/octets.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/compat/octets.py rename to plugin.video.bilibili/lib/pyasn1/compat/octets.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/debug.py b/plugin.video.bilibili/lib/pyasn1/debug.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/debug.py rename to plugin.video.bilibili/lib/pyasn1/debug.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/error.py b/plugin.video.bilibili/lib/pyasn1/error.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/error.py rename to plugin.video.bilibili/lib/pyasn1/error.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/__init__.py b/plugin.video.bilibili/lib/pyasn1/type/__init__.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/__init__.py rename to plugin.video.bilibili/lib/pyasn1/type/__init__.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/base.py b/plugin.video.bilibili/lib/pyasn1/type/base.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/base.py rename to plugin.video.bilibili/lib/pyasn1/type/base.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/char.py b/plugin.video.bilibili/lib/pyasn1/type/char.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/char.py rename to plugin.video.bilibili/lib/pyasn1/type/char.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/constraint.py b/plugin.video.bilibili/lib/pyasn1/type/constraint.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/constraint.py rename to plugin.video.bilibili/lib/pyasn1/type/constraint.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/error.py b/plugin.video.bilibili/lib/pyasn1/type/error.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/error.py rename to plugin.video.bilibili/lib/pyasn1/type/error.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/namedtype.py b/plugin.video.bilibili/lib/pyasn1/type/namedtype.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/namedtype.py rename to plugin.video.bilibili/lib/pyasn1/type/namedtype.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/namedval.py b/plugin.video.bilibili/lib/pyasn1/type/namedval.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/namedval.py rename to plugin.video.bilibili/lib/pyasn1/type/namedval.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/tag.py b/plugin.video.bilibili/lib/pyasn1/type/tag.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/tag.py rename to plugin.video.bilibili/lib/pyasn1/type/tag.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/tagmap.py b/plugin.video.bilibili/lib/pyasn1/type/tagmap.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/tagmap.py rename to plugin.video.bilibili/lib/pyasn1/type/tagmap.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/univ.py b/plugin.video.bilibili/lib/pyasn1/type/univ.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/univ.py rename to plugin.video.bilibili/lib/pyasn1/type/univ.py diff --git a/plugin.video.bilibili/resources/lib/pyasn1/type/useful.py b/plugin.video.bilibili/lib/pyasn1/type/useful.py similarity index 100% rename from plugin.video.bilibili/resources/lib/pyasn1/type/useful.py rename to plugin.video.bilibili/lib/pyasn1/type/useful.py diff --git a/plugin.video.bilibili/resources/lib/rsa/__init__.py b/plugin.video.bilibili/lib/rsa/__init__.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/__init__.py rename to plugin.video.bilibili/lib/rsa/__init__.py diff --git a/plugin.video.bilibili/resources/lib/rsa/_compat.py b/plugin.video.bilibili/lib/rsa/_compat.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/_compat.py rename to plugin.video.bilibili/lib/rsa/_compat.py diff --git a/plugin.video.bilibili/resources/lib/rsa/_version133.py b/plugin.video.bilibili/lib/rsa/_version133.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/_version133.py rename to plugin.video.bilibili/lib/rsa/_version133.py diff --git a/plugin.video.bilibili/resources/lib/rsa/_version200.py b/plugin.video.bilibili/lib/rsa/_version200.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/_version200.py rename to plugin.video.bilibili/lib/rsa/_version200.py diff --git a/plugin.video.bilibili/resources/lib/rsa/asn1.py b/plugin.video.bilibili/lib/rsa/asn1.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/asn1.py rename to plugin.video.bilibili/lib/rsa/asn1.py diff --git a/plugin.video.bilibili/resources/lib/rsa/bigfile.py b/plugin.video.bilibili/lib/rsa/bigfile.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/bigfile.py rename to plugin.video.bilibili/lib/rsa/bigfile.py diff --git a/plugin.video.bilibili/resources/lib/rsa/cli.py b/plugin.video.bilibili/lib/rsa/cli.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/cli.py rename to plugin.video.bilibili/lib/rsa/cli.py diff --git a/plugin.video.bilibili/resources/lib/rsa/common.py b/plugin.video.bilibili/lib/rsa/common.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/common.py rename to plugin.video.bilibili/lib/rsa/common.py diff --git a/plugin.video.bilibili/resources/lib/rsa/core.py b/plugin.video.bilibili/lib/rsa/core.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/core.py rename to plugin.video.bilibili/lib/rsa/core.py diff --git a/plugin.video.bilibili/resources/lib/rsa/key.py b/plugin.video.bilibili/lib/rsa/key.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/key.py rename to plugin.video.bilibili/lib/rsa/key.py diff --git a/plugin.video.bilibili/resources/lib/rsa/parallel.py b/plugin.video.bilibili/lib/rsa/parallel.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/parallel.py rename to plugin.video.bilibili/lib/rsa/parallel.py diff --git a/plugin.video.bilibili/resources/lib/rsa/pem.py b/plugin.video.bilibili/lib/rsa/pem.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/pem.py rename to plugin.video.bilibili/lib/rsa/pem.py diff --git a/plugin.video.bilibili/resources/lib/rsa/pkcs1.py b/plugin.video.bilibili/lib/rsa/pkcs1.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/pkcs1.py rename to plugin.video.bilibili/lib/rsa/pkcs1.py diff --git a/plugin.video.bilibili/resources/lib/rsa/prime.py b/plugin.video.bilibili/lib/rsa/prime.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/prime.py rename to plugin.video.bilibili/lib/rsa/prime.py diff --git a/plugin.video.bilibili/resources/lib/rsa/randnum.py b/plugin.video.bilibili/lib/rsa/randnum.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/randnum.py rename to plugin.video.bilibili/lib/rsa/randnum.py diff --git a/plugin.video.bilibili/resources/lib/rsa/transform.py b/plugin.video.bilibili/lib/rsa/transform.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/transform.py rename to plugin.video.bilibili/lib/rsa/transform.py diff --git a/plugin.video.bilibili/resources/lib/rsa/util.py b/plugin.video.bilibili/lib/rsa/util.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/util.py rename to plugin.video.bilibili/lib/rsa/util.py diff --git a/plugin.video.bilibili/resources/lib/rsa/varblock.py b/plugin.video.bilibili/lib/rsa/varblock.py similarity index 100% rename from plugin.video.bilibili/resources/lib/rsa/varblock.py rename to plugin.video.bilibili/lib/rsa/varblock.py diff --git a/plugin.video.bilibili/resources/lib/subtitle.py b/plugin.video.bilibili/lib/subtitle.py similarity index 100% rename from plugin.video.bilibili/resources/lib/subtitle.py rename to plugin.video.bilibili/lib/subtitle.py diff --git a/plugin.video.bilibili/plugin.video.bilibili-1.0.6.zip b/plugin.video.bilibili/plugin.video.bilibili-1.1.0.zip similarity index 90% rename from plugin.video.bilibili/plugin.video.bilibili-1.0.6.zip rename to plugin.video.bilibili/plugin.video.bilibili-1.1.0.zip index c5b0dfd..285b45e 100644 Binary files a/plugin.video.bilibili/plugin.video.bilibili-1.0.6.zip and b/plugin.video.bilibili/plugin.video.bilibili-1.1.0.zip differ diff --git a/plugin.video.cntv-live/addon.py b/plugin.video.cntv-live/addon.py index 48db036..2fc13f3 100644 --- a/plugin.video.cntv-live/addon.py +++ b/plugin.video.cntv-live/addon.py @@ -23,7 +23,8 @@ cityList = [{"area": "安徽", 'id': 'anhui', 'channel': []}, {"area": "北京", 'id': 'beijing', - 'channel': [{"btv2": "BTV文艺"}, + 'channel': [{"btv1": "BTV综合"}, + {"btv2": "BTV文艺"}, {"btv3": "BTV科教"}, {"btv4": "BTV影视"}, {"btv5": "BTV财经"}, diff --git a/plugin.video.cntv-live/plugin.video.cntv-live-2.0.10.zip b/plugin.video.cntv-live/plugin.video.cntv-live-2.0.10.zip index 8272117..94d9b78 100644 Binary files a/plugin.video.cntv-live/plugin.video.cntv-live-2.0.10.zip and b/plugin.video.cntv-live/plugin.video.cntv-live-2.0.10.zip differ diff --git a/plugin.video.cntv-video/addon.xml b/plugin.video.cntv-video/addon.xml index 22160a3..ee90e96 100644 --- a/plugin.video.cntv-video/addon.xml +++ b/plugin.video.cntv-video/addon.xml @@ -1,15 +1,24 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.cntv-video" name="CNTV 视频" - version="1.1.7" + version="1.2.0" provider-name="yfang1644"> <requires> <import addon="script.module.beautifulsoup4" version="4.3.2"/> + <import addon="script.module.geturl" version="1.0.0"/> + <import addon="plugin.video.iqiyi" version="2.4.0"/> + <import addon="plugin.video.qq" version="1.1.0"/>" + <import addon="plugin.video.funshion" version="2.1.0"/> + <import addon="plugin.video.youku" version="1.1.0"/> + <import addon="plugin.video.pptv" version="2.1.0"/> + <import addon="plugin.video.mgtv" version="1.1.0"/> + <import addon="plugin.video.letv" version="2.1.0"/> + <import addon="plugin.video.sohuvideo" version="2.6.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> - <extension point="xbmc.python.module" library="lib" /> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <summary lang="en">CNTV video plugin</summary> <summary lang="zh">CNTV 视频插件</summary> diff --git a/plugin.video.cntv-video/default.py b/plugin.video.cntv-video/default.py index 0fe9a41..c7ad991 100644 --- a/plugin.video.cntv-video/default.py +++ b/plugin.video.cntv-video/default.py @@ -10,7 +10,18 @@ import re from bs4 import BeautifulSoup from json import loads -from lib.common import get_html +from common import get_html + +from lib.cntv import video_from_url as video_from_cntv + +from iqiyi import video_from_url as video_from_iqiyi +from qq import video_from_url as video_from_qq +from funshion import video_from_url as video_from_fun +from youku import video_from_url as video_from_youku +from pptv import video_from_url as video_from_pptv +from mgtv import video_from_url as video_from_mgtv +from letv import video_from_url as video_from_letv +from sohu import video_from_url as video_from_sohu # Plugin constants __addon__ = xbmcaddon.Addon() @@ -338,41 +349,37 @@ def PlayVideo(playurl, title, thumb): videoRes = int(__addon__.getSetting('resolution')) if ('le.com' in playurl) or ('letv.com' in playurl): - import lib.letv as letv - video = letv.LeTV() - videourl = video.video_from_url(playurl, - level=videoRes, - m3u8=__m3u8__) + videourl = video_from_letv(playurl, + level=videoRes, + m3u8=__m3u8__) li = ListItem(title, thumbnailImage=thumb) li.setInfo(type="Video", infoLabels={"Title": title}) xbmc.Player().play(__m3u8__, li) return if 'sohu.com' in playurl: - from lib.sohu import video_from_url + videourl = video_from_sohu(playurl, level=videoRes) elif 'qq.com' in playurl: - from lib.qq import video_from_url + videourl = video_from_qq(playurl, level=videoRes) elif 'qiyi.com' in playurl: - from lib.iqiyi import video_from_url + videourl = video_from_iqiyi(playurl, level=videoRes) elif 'fun.tv' in playurl: - from lib.funshion import video_from_url + videourl = video_from_fun(playurl, level=videoRes) elif 'youku.com' in playurl: - from lib.youku import video_from_url + videourl = video_from_youku(playurl, level=videoRes) elif ('cntv.cn' in playurl) or ('cctv.com' in playurl): - from lib.cntv import video_from_url + videourl = video_from_cntv(playurl, level=videoRes) elif 'mgtv.com' in playurl: - from lib.mgtv import video_from_url + videourl = video_from_mgtv(playurl, level=videoRes) elif 'pptv.com' in playurl: - from lib.pptv import video_from_url - - videourl = video_from_url(playurl, level=videoRes) + videourl = video_from_pptv(playurl, level=videoRes) ulen = len(videourl) diff --git a/plugin.video.cntv-video/plugin.video.cntv-video-1.1.7.zip b/plugin.video.cntv-video/plugin.video.cntv-video-1.2.0.zip similarity index 62% rename from plugin.video.cntv-video/plugin.video.cntv-video-1.1.7.zip rename to plugin.video.cntv-video/plugin.video.cntv-video-1.2.0.zip index 2607a7d..ec244c5 100644 Binary files a/plugin.video.cntv-video/plugin.video.cntv-video-1.1.7.zip and b/plugin.video.cntv-video/plugin.video.cntv-video-1.2.0.zip differ diff --git a/plugin.video.funshion/addon.xml b/plugin.video.funshion/addon.xml index 3038577..f72610b 100644 --- a/plugin.video.funshion/addon.xml +++ b/plugin.video.funshion/addon.xml @@ -1,16 +1,17 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.funshion" name="风行视频(Funshion)" - version="2.0.1" + version="2.1.0" provider-name="yfang1644"> <requires> <import addon="script.module.xbmcswift2" version="2.4.0"/> <import addon="script.module.beautifulsoup4" version="4.3.2"/> - <import addon="plugin.video.cntv-video" version="1.1.6"/> + <import addon="script.module.geturl" version="1.0.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <summary lang="en">Funshion Video plugin</summary> <summary lang="zh">风行网视频插件</summary> diff --git a/plugin.video.funshion/default.py b/plugin.video.funshion/default.py index 9643e03..48bdc89 100644 --- a/plugin.video.funshion/default.py +++ b/plugin.video.funshion/default.py @@ -6,7 +6,7 @@ from bs4 import BeautifulSoup from json import loads from common import get_html, r1 -from funshion import video_from_url +from lib.funshion import video_from_url BANNER_FMT = '[COLOR FFDEB887]%s[/COLOR]' EXTRA = '[COLOR FF8080FF]%s[/COLOR]' diff --git a/plugin.video.bilibili/resources/lib/__init__.py b/plugin.video.funshion/lib/__init__.py similarity index 100% rename from plugin.video.bilibili/resources/lib/__init__.py rename to plugin.video.funshion/lib/__init__.py diff --git a/plugin.video.cntv-video/lib/funshion.py b/plugin.video.funshion/lib/funshion.py similarity index 100% rename from plugin.video.cntv-video/lib/funshion.py rename to plugin.video.funshion/lib/funshion.py diff --git a/plugin.video.funshion/plugin.video.funshion-2.0.1.zip b/plugin.video.funshion/plugin.video.funshion-2.1.0.zip similarity index 80% rename from plugin.video.funshion/plugin.video.funshion-2.0.1.zip rename to plugin.video.funshion/plugin.video.funshion-2.1.0.zip index a08b617..d4cf689 100644 Binary files a/plugin.video.funshion/plugin.video.funshion-2.0.1.zip and b/plugin.video.funshion/plugin.video.funshion-2.1.0.zip differ diff --git a/plugin.video.iqiyi/addon.xml b/plugin.video.iqiyi/addon.xml index bccf3c2..e0b33ba 100644 --- a/plugin.video.iqiyi/addon.xml +++ b/plugin.video.iqiyi/addon.xml @@ -1,16 +1,17 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.iqiyi" name="爱奇艺视频(IQIYI)" - version="2.3.0" + version="2.4.0" provider-name="yfang1644"> <requires> <import addon="script.module.xbmcswift2" version="2.4.0"/> <import addon="script.module.beautifulsoup4" version="4.3.2"/> - <import addon="plugin.video.cntv-video" version="1.0.6"/> + <import addon="script.module.geturl" version="1.0.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <summary lang="en">IQIYI Video plugin</summary> <summary lang="zh">爱奇艺视频插件</summary> diff --git a/plugin.video.iqiyi/default.py b/plugin.video.iqiyi/default.py index 5f25e1b..dc172b2 100644 --- a/plugin.video.iqiyi/default.py +++ b/plugin.video.iqiyi/default.py @@ -8,7 +8,7 @@ from json import loads from bs4 import BeautifulSoup from common import get_html, r1 -from iqiyi import video_from_vid +from lib.iqiyi import video_from_vid ######################################################################## # 爱奇艺 list.iqiyi.com @@ -80,11 +80,9 @@ def reference(tvId, vid, title): videos = json_response['mixinVideos'] for series in videos: if tvId == series['tvId']: - mode = 'playvideo' - playable = True + mode, playable = 'playvideo', True else: - mode = 'reference' - playable = False + mode, playable = 'reference', False items.append({ 'label': series['name'], 'path': url_for(mode, tvId=series['tvId'], vid=series['vid'], title=series['name'].encode('utf-8')), @@ -172,15 +170,16 @@ def episodelist(albumId, page): tvId = item['tvId'] vid = item['vid'] title = item['tvName'].encode('utf-8') - items.append({ - 'label': BANNER_FMT % title, - 'path': url_for('playvideo', tvId=tvId, vid=vid, title=title), - 'thumbnail': item.get('tvPictureUrl', ''), - 'is_playable': True, - 'info': {'title': title, 'plot': item['tvDesc']} - }) - - if albumId != int(tvId): + isSeries = item['isSeries'] + if isSeries == 0: + items.append({ + 'label': BANNER_FMT % title, + 'path': url_for('playvideo', tvId=tvId, vid=vid, title=title), + 'thumbnail': item.get('tvPictureUrl', ''), + 'is_playable': True, + 'info': {'title': title, 'plot': item['tvDesc']} + }) + else: item1 = listType1(albumType, albumId) items += item1 if not item1: @@ -188,6 +187,8 @@ def episodelist(albumId, page): # recommend items += reference(tvId, vid, title) + if len(items) > 1 and items[0]['label'] == items[1]['label']: + del items[1] return items @@ -204,6 +205,7 @@ def playfound(url, title): vid = r1(r'#curid=.+_(.*)$', url) or \ r1(r'vid=([^&]+)', url) or \ r1(r'data-player-videoid="([^"]+)"', link) + if tvId is not None and vid is not None: items = [{ 'label': title, diff --git a/plugin.video.iqiyi/lib/__init__.py b/plugin.video.iqiyi/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plugin.video.cntv-video/lib/iqiyi.py b/plugin.video.iqiyi/lib/iqiyi.py similarity index 100% rename from plugin.video.cntv-video/lib/iqiyi.py rename to plugin.video.iqiyi/lib/iqiyi.py diff --git a/plugin.video.iqiyi/plugin.video.iqiyi-2.3.0.zip b/plugin.video.iqiyi/plugin.video.iqiyi-2.4.0.zip similarity index 85% rename from plugin.video.iqiyi/plugin.video.iqiyi-2.3.0.zip rename to plugin.video.iqiyi/plugin.video.iqiyi-2.4.0.zip index 65c1a0d..09430dc 100644 Binary files a/plugin.video.iqiyi/plugin.video.iqiyi-2.3.0.zip and b/plugin.video.iqiyi/plugin.video.iqiyi-2.4.0.zip differ diff --git a/plugin.video.letv/addon.xml b/plugin.video.letv/addon.xml index d523ce8..674e76b 100644 --- a/plugin.video.letv/addon.xml +++ b/plugin.video.letv/addon.xml @@ -1,18 +1,19 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.letv" name="乐视网 (LeTV)" - version="2.0.0" + version="2.1.0" provider-name="yfang1644"> <requires> <import addon="script.module.beautifulsoup4" version="4.3.2"/> <import addon="script.module.xbmcswift2" version="2.4.0"/> - <import addon="plugin.video.cntv-video" version="1.0.6"/> + <import addon="script.module.geturl" version="1.0.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <summary lang="en">LeTV video plugin</summary> <summary lang="zh">乐视网插件</summary> diff --git a/plugin.video.letv/default.py b/plugin.video.letv/default.py index ac5626e..fb7c54e 100644 --- a/plugin.video.letv/default.py +++ b/plugin.video.letv/default.py @@ -8,7 +8,7 @@ from json import loads from bs4 import BeautifulSoup from common import get_html -from letv import video_from_vid +from lib.letv import video_from_vid plugin = Plugin() url_for = plugin.url_for diff --git a/plugin.video.letv/lib/__init__.py b/plugin.video.letv/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plugin.video.cntv-video/lib/letv.py b/plugin.video.letv/lib/letv.py similarity index 100% rename from plugin.video.cntv-video/lib/letv.py rename to plugin.video.letv/lib/letv.py diff --git a/plugin.video.letv/plugin.video.letv-2.0.0.zip b/plugin.video.letv/plugin.video.letv-2.1.0.zip similarity index 82% rename from plugin.video.letv/plugin.video.letv-2.0.0.zip rename to plugin.video.letv/plugin.video.letv-2.1.0.zip index ce9fc3e..a9a998e 100644 Binary files a/plugin.video.letv/plugin.video.letv-2.0.0.zip and b/plugin.video.letv/plugin.video.letv-2.1.0.zip differ diff --git a/plugin.video.mgtv/addon.xml b/plugin.video.mgtv/addon.xml index fad8198..9631494 100644 --- a/plugin.video.mgtv/addon.xml +++ b/plugin.video.mgtv/addon.xml @@ -1,16 +1,17 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.mgtv" name="芒果TV" - version="1.0.2" + version="1.1.0" provider-name="yfang1644"> <requires> <import addon="script.module.xbmcswift2" version="2.4.0"/> <import addon="script.module.beautifulsoup4" version="4.3.2"/> - <import addon="plugin.video.cntv-video" version="1.0.6"/> + <import addon="script.module.geturl" version="1.0.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <summary lang="en">Mangguo Video plugin</summary> <summary lang="zh">MGTV 视频插件</summary> diff --git a/plugin.video.mgtv/default.py b/plugin.video.mgtv/default.py index d8694ce..ad3288f 100644 --- a/plugin.video.mgtv/default.py +++ b/plugin.video.mgtv/default.py @@ -2,11 +2,10 @@ # -*- coding: utf-8 -*- from xbmcswift2 import Plugin, xbmcgui -from urlparse import parse_qsl from bs4 import BeautifulSoup from json import loads from common import get_html, r1 -from mgtv import video_from_vid +from lib.mgtv import video_from_vid plugin = Plugin() url_for = plugin.url_for diff --git a/plugin.video.mgtv/lib/__init__.py b/plugin.video.mgtv/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plugin.video.cntv-video/lib/mgtv.py b/plugin.video.mgtv/lib/mgtv.py similarity index 100% rename from plugin.video.cntv-video/lib/mgtv.py rename to plugin.video.mgtv/lib/mgtv.py diff --git a/plugin.video.mgtv/plugin.video.mgtv-1.0.2.zip b/plugin.video.mgtv/plugin.video.mgtv-1.1.0.zip similarity index 56% rename from plugin.video.mgtv/plugin.video.mgtv-1.0.2.zip rename to plugin.video.mgtv/plugin.video.mgtv-1.1.0.zip index 71a1ae1..f4830ac 100644 Binary files a/plugin.video.mgtv/plugin.video.mgtv-1.0.2.zip and b/plugin.video.mgtv/plugin.video.mgtv-1.1.0.zip differ diff --git a/plugin.video.pptv/addon.xml b/plugin.video.pptv/addon.xml index 8ab05ba..d5fb907 100644 --- a/plugin.video.pptv/addon.xml +++ b/plugin.video.pptv/addon.xml @@ -1,27 +1,28 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.pptv" name="PPTV视频" - version="2.0.0" + version="2.1.0" provider-name="yfang1644"> <requires> <import addon="script.module.xbmcswift2" version="2.4.0"/> - <import addon="plugin.video.cntv-video" version="1.0.6"/> - </requires> - <extension + <import addon="script.module.geturl" version="1.0.0"/> + </requires> + <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <summary lang="en">PPTV video plugin</summary> <summary lang="zh">PPTV视频插件</summary> <description lang="en">Watch online videos in www.pptv.com site.</description> <description lang="zh">观看 www.pptv.com 在线直播和点播视频.</description> - <license>GNU GENERAL PUBLIC LICENSE. Version 3, 29 June 2007</license> - <forum></forum> - <website></website> + <license>GNU GENERAL PUBLIC LICENSE. Version 3, 29 June 2007</license> + <forum></forum> + <website></website> <source>https://github.com/yfang1644/kodi_plugins/plugin.video.pptv</source> - <email>yfang1644@gmail.com</email> + <email>yfang1644@gmail.com</email> <platform>all</platform> </extension> </addon> diff --git a/plugin.video.pptv/default.py b/plugin.video.pptv/default.py index 6d38dce..7abf7bb 100644 --- a/plugin.video.pptv/default.py +++ b/plugin.video.pptv/default.py @@ -9,15 +9,13 @@ from random import random from json import loads from common import get_html -from pptv import video_from_url - +from lib.pptv import video_from_url # Plugin constants plugin = Plugin() url_for = plugin.url_for - PPTV_LIST = 'http://list.pptv.com/' PPTV_TV_LIST = 'http://live.pptv.com/list/tv_list' diff --git a/plugin.video.pptv/lib/__init__.py b/plugin.video.pptv/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plugin.video.cntv-video/lib/pptv.py b/plugin.video.pptv/lib/pptv.py similarity index 100% rename from plugin.video.cntv-video/lib/pptv.py rename to plugin.video.pptv/lib/pptv.py diff --git a/plugin.video.pptv/plugin.video.pptv-2.0.0.zip b/plugin.video.pptv/plugin.video.pptv-2.1.0.zip similarity index 94% rename from plugin.video.pptv/plugin.video.pptv-2.0.0.zip rename to plugin.video.pptv/plugin.video.pptv-2.1.0.zip index ce854de..d2ce85c 100644 Binary files a/plugin.video.pptv/plugin.video.pptv-2.0.0.zip and b/plugin.video.pptv/plugin.video.pptv-2.1.0.zip differ diff --git a/plugin.video.qq/addon.xml b/plugin.video.qq/addon.xml index 82cdf13..6f57fc1 100644 --- a/plugin.video.qq/addon.xml +++ b/plugin.video.qq/addon.xml @@ -1,15 +1,16 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.qq" name="腾讯视频" - version="1.0.4" + version="1.1.0" provider-name="yfang1644"> <requires> <import addon="script.module.beautifulsoup4" version="4.3.2"/> - <import addon="plugin.video.cntv-video" version="1.0.6"/> + <import addon="script.module.geturl" version="1.0.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <summary lang="en">Tencent Video plugin</summary> <summary lang="zh">QQ视频插件</summary> diff --git a/plugin.video.qq/default.py b/plugin.video.qq/default.py index 1c8c6fd..4a05bcb 100644 --- a/plugin.video.qq/default.py +++ b/plugin.video.qq/default.py @@ -11,7 +11,7 @@ from bs4 import BeautifulSoup from json import loads from common import get_html -from qq import video_from_url, video_from_vid +from lib.qq import video_from_url, video_from_vid # Plugin constants __addon__ = xbmcaddon.Addon() diff --git a/plugin.video.qq/lib/__init__.py b/plugin.video.qq/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plugin.video.cntv-video/lib/qq.py b/plugin.video.qq/lib/qq.py similarity index 100% rename from plugin.video.cntv-video/lib/qq.py rename to plugin.video.qq/lib/qq.py diff --git a/plugin.video.cntv-video/lib/qq2.py b/plugin.video.qq/lib/qq2.py similarity index 100% rename from plugin.video.cntv-video/lib/qq2.py rename to plugin.video.qq/lib/qq2.py diff --git a/plugin.video.qq/plugin.video.qq-1.0.4.zip b/plugin.video.qq/plugin.video.qq-1.1.0.zip similarity index 82% rename from plugin.video.qq/plugin.video.qq-1.0.4.zip rename to plugin.video.qq/plugin.video.qq-1.1.0.zip index 62d83f5..de9b70d 100644 Binary files a/plugin.video.qq/plugin.video.qq-1.0.4.zip and b/plugin.video.qq/plugin.video.qq-1.1.0.zip differ diff --git a/plugin.video.rrsp/addon.xml b/plugin.video.rrsp/addon.xml index 559849c..0c305c4 100644 --- a/plugin.video.rrsp/addon.xml +++ b/plugin.video.rrsp/addon.xml @@ -1,15 +1,17 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.rrsp" name="人人视频" - version="1.0.6" + version="1.1.0" provider-name="yfang1644"> <requires> <import addon="script.module.xbmcswift2" version="2.4.0"/> - <import addon="plugin.video.cntv-video" version="1.0.6"/> - </requires> + <import addon="script.module.getutl" version="1.0.0"/> + <import addon="plugin.video.youku" version="1.1.0"/> + <import addon="plugin.video.letv" version="2.1.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <summary lang="zh-CN">人人视频</summary> <description>人人视频</description> diff --git a/plugin.video.rrsp/default.py b/plugin.video.rrsp/default.py index 93fd80a..380a98d 100644 --- a/plugin.video.rrsp/default.py +++ b/plugin.video.rrsp/default.py @@ -7,7 +7,7 @@ ADDON = xbmcaddon.Addon() ADDON_PATH = ADDON.getAddonInfo('path').decode("utf-8") -sys.path.append(os.path.join(ADDON_PATH, 'resources', 'lib')) +sys.path.append(os.path.join(ADDON_PATH, 'lib')) from xbmcswift2 import Plugin, ListItem, xbmc, xbmcgui diff --git a/plugin.video.rrsp/lib/__init__.py b/plugin.video.rrsp/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plugin.video.rrsp/resources/lib/acfun.py b/plugin.video.rrsp/lib/acfun.py similarity index 100% rename from plugin.video.rrsp/resources/lib/acfun.py rename to plugin.video.rrsp/lib/acfun.py diff --git a/plugin.video.rrsp/resources/lib/rrmj.py b/plugin.video.rrsp/lib/rrmj.py similarity index 100% rename from plugin.video.rrsp/resources/lib/rrmj.py rename to plugin.video.rrsp/lib/rrmj.py diff --git a/plugin.video.rrsp/plugin.video.rrsp-1.0.6.zip b/plugin.video.rrsp/plugin.video.rrsp-1.1.0.zip similarity index 94% rename from plugin.video.rrsp/plugin.video.rrsp-1.0.6.zip rename to plugin.video.rrsp/plugin.video.rrsp-1.1.0.zip index af6ff9b..212446a 100644 Binary files a/plugin.video.rrsp/plugin.video.rrsp-1.0.6.zip and b/plugin.video.rrsp/plugin.video.rrsp-1.1.0.zip differ diff --git a/plugin.video.sohuvideo/addon.xml b/plugin.video.sohuvideo/addon.xml index cd6ee30..05cc330 100644 --- a/plugin.video.sohuvideo/addon.xml +++ b/plugin.video.sohuvideo/addon.xml @@ -1,17 +1,22 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.sohuvideo" name="搜狐视频(SoHu)" - version="2.5.1" - provider-name="Taxigps,yfang1644"> + version="2.6.0" + provider-name="yfang1644"> <requires> <import addon="script.module.xbmcswift2" version="2.4.0"/> <import addon="script.module.beautifulsoup4" version="4.3.2"/> - <import addon="plugin.video.cntv-video" version="1.0.6"/> + <import addon="script.module.geturl" version="1.0.0"/> + <import addon="plugin.video.iqiyi" version="2.3.0"/> + <import addon="plugin.video.youku" version="1.0.0"/> + <import addon="plugin.video.qq" version="1.1.0"/> + <import addon="plugin.video.funshion" version="2.1.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <summary lang="en">SoHu Video plugin</summary> <summary lang="zh">搜狐视频插件</summary> diff --git a/plugin.video.sohuvideo/default.py b/plugin.video.sohuvideo/default.py index 1db5ad8..8156e58 100644 --- a/plugin.video.sohuvideo/default.py +++ b/plugin.video.sohuvideo/default.py @@ -8,7 +8,7 @@ from bs4 import BeautifulSoup from urlparse import urlparse from common import get_html -from sohu import video_from_url, video_from_vid +from lib.sohu import video_from_url from iqiyi import video_from_url as video_from_iqiyi from qq import video_from_url as video_from_qq diff --git a/plugin.video.sohuvideo/lib/__init__.py b/plugin.video.sohuvideo/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plugin.video.cntv-video/lib/sohu.py b/plugin.video.sohuvideo/lib/sohu.py similarity index 100% rename from plugin.video.cntv-video/lib/sohu.py rename to plugin.video.sohuvideo/lib/sohu.py diff --git a/plugin.video.sohuvideo/plugin.video.sohuvideo-2.5.1.zip b/plugin.video.sohuvideo/plugin.video.sohuvideo-2.6.0.zip similarity index 86% rename from plugin.video.sohuvideo/plugin.video.sohuvideo-2.5.1.zip rename to plugin.video.sohuvideo/plugin.video.sohuvideo-2.6.0.zip index c93ce84..3a1879f 100644 Binary files a/plugin.video.sohuvideo/plugin.video.sohuvideo-2.5.1.zip and b/plugin.video.sohuvideo/plugin.video.sohuvideo-2.6.0.zip differ diff --git a/plugin.video.tudou/addon.py b/plugin.video.tudou/addon.py index 0eb3162..bd62a52 100644 --- a/plugin.video.tudou/addon.py +++ b/plugin.video.tudou/addon.py @@ -1,14 +1,13 @@ #!/usr/bin/python # -*- coding: utf-8 -*- -import xbmc -from xbmcswift2 import Plugin, xbmcgui +from xbmcswift2 import Plugin, xbmc, xbmcgui from urllib import quote_plus import re from bs4 import BeautifulSoup from common import get_html, r1 from youku import Youku -from tudou import Tudou +from lib.tudou import Tudou plugin = Plugin() url_for = plugin.url_for @@ -97,6 +96,7 @@ def getyoukulist(url): 'label': title, 'path': url_for('playvideo', url=url), 'is_playable': True, + 'info': {'title': title}, }) else: for item in progs: @@ -110,6 +110,7 @@ def getyoukulist(url): 'path': url_for('playvideo', url=item.a['href']), 'is_playable': True, 'thumbnail': item.img['src'], + 'info': {'title': title} }) soup = tree.find_all('div', {'class': 'items clearfix'}) @@ -291,16 +292,3 @@ def index(): # main programs goes here ######################################### if __name__ == '__main__': plugin.run() - -runlist = { - None: 'mainMenu()', - 'videolist': 'listSubMenu(params)', - 'videolist1': 'listSubMenu1(params)', - 'videolist2': 'listSubMenu2(params)', - 'albumlist': 'albumList(params)', - 'codelist': 'relatedPlayList(params)', - 'playvideo': 'PlayVideo(params)', - 'search': 'searchInTudou(params)', - 'select': 'normalSelect(params)' -} - diff --git a/plugin.video.tudou/addon.xml b/plugin.video.tudou/addon.xml index 63f1234..6b04d16 100644 --- a/plugin.video.tudou/addon.xml +++ b/plugin.video.tudou/addon.xml @@ -1,12 +1,13 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.tudou" name="土豆(Tudou)" - version="1.0.1" + version="1.1.0" provider-name="yfang1644"> <requires> <import addon="script.module.xbmcswift2" version="2.4.0"/> <import addon="script.module.beautifulsoup4" version="4.3.2"/> - <import addon="plugin.video.cntv-video" version="1.0.9"/> + <import addon="script.module.geturl" version="1.0.0"/> + <import addon="plugin.video.youku" version="1.1.0"/> </requires> <extension point="xbmc.python.pluginsource" library="addon.py"> diff --git a/plugin.video.tudou/lib/__init__.py b/plugin.video.tudou/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plugin.video.cntv-video/lib/tudou.py b/plugin.video.tudou/lib/tudou.py similarity index 100% rename from plugin.video.cntv-video/lib/tudou.py rename to plugin.video.tudou/lib/tudou.py diff --git a/plugin.video.tudou/plugin.video.tudou-1.0.1.zip b/plugin.video.tudou/plugin.video.tudou-1.1.0.zip similarity index 92% rename from plugin.video.tudou/plugin.video.tudou-1.0.1.zip rename to plugin.video.tudou/plugin.video.tudou-1.1.0.zip index c9b6992..a89ad81 100644 Binary files a/plugin.video.tudou/plugin.video.tudou-1.0.1.zip and b/plugin.video.tudou/plugin.video.tudou-1.1.0.zip differ diff --git a/plugin.video.tvonline/addon.xml b/plugin.video.tvonline/addon.xml index f59d650..159d36e 100644 --- a/plugin.video.tvonline/addon.xml +++ b/plugin.video.tvonline/addon.xml @@ -1,27 +1,26 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.tvonline" - name="地方电视台直播" version="1.0.0" + name="地方电视台直播" version="1.0.1" provider-name="yfang1644"> - <requires> - <import addon="plugin.video.cntv-video" version="1.0.6"/> - </requires> - - <extension point="xbmc.python.pluginsource" library="default.py"> - <provides>video</provides> - </extension> - - <extension point="xbmc.addon.metadata"> - <summary lang="en">TV Live plugin</summary> - <summary lang="zh">地方电视台直播</summary> - <description lang="en">Stream live Nanjing TV and other local TV programs</description> - <description lang="zh">电视台直播</description> + <requires> + <import addon="script.module.xbmcswift2" version="2.4.0"/> + <import addon="script.module.geturl" version="1.0.0"/> + </requires> + <extension point="xbmc.python.pluginsource" library="default.py"> + <provides>video</provides> + </extension> + <extension point="xbmc.addon.metadata"> + <summary lang="en">TV Live plugin</summary> + <summary lang="zh">地方电视台直播</summary> + <description lang="en">Stream live Nanjing TV and other local TV programs</description> + <description lang="zh">电视台直播</description> <disclaimer lang="en">http://www.nbs.cn, http://www.haoqu.net/3/</disclaimer> - <language></language> - <license>GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007</license> - <forum></forum> - <website></website> + <language></language> + <license>GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007</license> + <forum></forum> + <website></website> <source>https://github.com/yfang1644/kodi_plugins/plugin.video.tvonline</source> <email>yfang1644@gmail.com</email> - <platform>all</platform> - </extension> + <platform>all</platform> + </extension> </addon> diff --git a/plugin.video.tvonline/default.py b/plugin.video.tvonline/default.py index 937773d..caba055 100644 --- a/plugin.video.tvonline/default.py +++ b/plugin.video.tvonline/default.py @@ -6,7 +6,6 @@ import xbmcplugin import xbmcaddon import urllib2 -import urllib import urlparse import re import sys diff --git a/plugin.video.tvonline/plugin.video.tvonline-1.0.0.zip b/plugin.video.tvonline/plugin.video.tvonline-1.0.1.zip similarity index 96% rename from plugin.video.tvonline/plugin.video.tvonline-1.0.0.zip rename to plugin.video.tvonline/plugin.video.tvonline-1.0.1.zip index fad3a0a..a54ea30 100644 Binary files a/plugin.video.tvonline/plugin.video.tvonline-1.0.0.zip and b/plugin.video.tvonline/plugin.video.tvonline-1.0.1.zip differ diff --git a/plugin.video.yinyuetai/addon.py b/plugin.video.yinyuetai/addon.py new file mode 100644 index 0000000..f620097 --- /dev/null +++ b/plugin.video.yinyuetai/addon.py @@ -0,0 +1,164 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +from xbmcswift2 import Plugin, xbmcgui +import xbmcaddon +from urllib import urlencode +from json import loads +from common import get_html +from yinyuetai import video_from_vid + +########################################################################## +# 音悦台MV +########################################################################## + +__addon__ = xbmcaddon.Addon() + +plugin = Plugin() +url_for = plugin.url_for + +@plugin.route('/playvideo/<vid>') +def playvideo(vid): + v_url = video_from_vid(vid) + url = 'stack://' + ' , '.join(v_url) + plugin.set_resolved_url(url) + + +@plugin.route('/setfilters') +def setfilters(): +# a=ML + AREA_LIST = {'全部': '0', '内地':'ML', '港台':'HT', '欧美':'US', + '韩国': 'KR', '日本':'JP', '二次元':'ACG','其他': 'Other'} +# p=Boy + PERSONS = {'全部': '0', '男艺人': 'Boy', '女艺人': 'Girl', + '乐队组合': 'Combo', '其他': 'Other'} + +# c=hd, shd..., 画质 + dialog = xbmcgui.Dialog() + + title = u'艺人地区' + keyword = AREA_LIST.keys() + sel = dialog.select(title, keyword) + area = '0' if sel < 0 else AREA_LIST[keyword[sel]] + + title = u'艺人类别' + keyword = PERSONS.keys() + sel = dialog.select(title, keyword) + person = '0' if sel < 0 else PERSONS[keyword[sel]] + return videolist(sid=0, tid=0, page=1, area=area, person=person) + + +@plugin.route('/videolist/<sid>/<tid>/<page>/<area>/<person>') +def videolist(sid, tid, page, area, person): + plugin.set_content('videos') + res = int(__addon__.getSetting('video_resolution')) + reslist = ('hd', 'shd', 'sh') + + page = int(page) + req = { + 'sid': sid, + 'tid': tid, + 'a': '' if area == '0' else area, + 'p': '' if person == '0' else person, + 'c': reslist[res], + 's': '', + 'pageSize': 20, + 'page': page + } + + data = urlencode(req) + mvapi = 'http://mvapi.yinyuetai.com/mvchannel/so?' + html = get_html(mvapi + data) + results = loads(html) + totalpage = int(results['pageInfo']['pageCount']) + results = results['result'] + + items = [] + if page > 1: + items.append({ + 'label': u'上一页 ({}/{})'.format(page-1, totalpage), + 'path': url_for('videolist', + sid=sid, + tid=tid, + page=page-1, + area=area, + person=person) + }) + + for item in results: + d = item.get('duration', '0:0:0') + duration = 0 + for t in d.split(':'): + duration = duration*60 + int(t) + + items.append({ + 'label': item['title'], + 'path': url_for('playvideo', vid=item['videoId']), + 'thumbnail': item['image'], + 'is_playable': True, + 'info': {'title': item['title'], + 'plot': item['description'], + 'duration': duration} + }) + if page < totalpage: + items.append({ + 'label': u'下一页 ({}/{})'.format(page+1, totalpage), + 'path': url_for('videolist', + sid=sid, + tid=tid, + page=page+1, + area=area, + person=person) + }) + + return items + + +@plugin.route('/mainlist/<sid>/<tid>/<page>/<area>/<person>') +def mainlist(sid, tid, page, area, person): + catapi = 'http://mvapi.yinyuetai.com/cata/get-cata?cataId=%s' + items = [{ + 'label': u'[选择地区/类别]', + 'path': url_for('setfilters') + }] + + html = get_html(catapi % sid) + catas = loads(html)['catas'] + catas.insert(0, {'cataName': u'全部', 'cataId': -1}) + for item in catas: + tid = item['cataId'] + tid = tid if int(tid) > 0 else 0 + items.append({ + 'label': item['cataName'], + 'path': url_for('videolist', sid=sid, tid=tid, page=page, area=area, person=person) + }) + return items + + +@plugin.route('/') +def root(): + items = [ + ('全部', '0'), + ('音乐视频', '3'), + ('现场/live','4'), + ('娱乐视频', '9'), + ('舞蹈', '5'), + ('演奏', '6'), + ('ACG', '7'), + ('戏剧', '8')] + + for (name, sid) in items: + path = 'videolist' if sid == '0' else 'mainlist' + yield { + 'label': name, + 'path': url_for(path, + sid=sid, + tid='0', + page=1, + area='0', + person='0') + } + + +if __name__ == '__main__': + plugin.run() diff --git a/plugin.video.yinyuetai/addon.xml b/plugin.video.yinyuetai/addon.xml index c08dc93..d5d6e96 100644 --- a/plugin.video.yinyuetai/addon.xml +++ b/plugin.video.yinyuetai/addon.xml @@ -1,16 +1,19 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.yinyuetai" name="音悦台MV(YinYueTai)" - version="1.8.1" + version="1.9.0" provider-name="yfang1644"> <requires> - <import addon="plugin.video.cntv-video" version="1.0.6"/> + <import addon="script.module.xbmcswift2" version="2.4.0"/> + <import addon="script.module.beautifulsoup4" version="4.3.2"/> + <import addon="script.module.geturl" version="1.0.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <summary lang="en">YinYueTai video plugin</summary> <summary lang="zh">音悦台视频插件</summary> diff --git a/plugin.video.yinyuetai/default.py b/plugin.video.yinyuetai/default.py index f620097..669653c 100644 --- a/plugin.video.yinyuetai/default.py +++ b/plugin.video.yinyuetai/default.py @@ -2,18 +2,15 @@ # -*- coding: utf-8 -*- from xbmcswift2 import Plugin, xbmcgui -import xbmcaddon from urllib import urlencode from json import loads from common import get_html -from yinyuetai import video_from_vid +from lib.yinyuetai import video_from_vid ########################################################################## # 音悦台MV ########################################################################## -__addon__ = xbmcaddon.Addon() - plugin = Plugin() url_for = plugin.url_for @@ -51,7 +48,7 @@ def setfilters(): @plugin.route('/videolist/<sid>/<tid>/<page>/<area>/<person>') def videolist(sid, tid, page, area, person): plugin.set_content('videos') - res = int(__addon__.getSetting('video_resolution')) + res = int(plugin.addon.getSetting('video_resolution')) reslist = ('hd', 'shd', 'sh') page = int(page) diff --git a/plugin.video.yinyuetai/lib/__init__.py b/plugin.video.yinyuetai/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plugin.video.cntv-video/lib/yinyuetai.py b/plugin.video.yinyuetai/lib/yinyuetai.py similarity index 100% rename from plugin.video.cntv-video/lib/yinyuetai.py rename to plugin.video.yinyuetai/lib/yinyuetai.py diff --git a/plugin.video.yinyuetai/plugin.video.yinyuetai-1.8.1.zip b/plugin.video.yinyuetai/plugin.video.yinyuetai-1.9.0.zip similarity index 77% rename from plugin.video.yinyuetai/plugin.video.yinyuetai-1.8.1.zip rename to plugin.video.yinyuetai/plugin.video.yinyuetai-1.9.0.zip index d1ec755..1928903 100644 Binary files a/plugin.video.yinyuetai/plugin.video.yinyuetai-1.8.1.zip and b/plugin.video.yinyuetai/plugin.video.yinyuetai-1.9.0.zip differ diff --git a/plugin.video.yongjiu/addon.xml b/plugin.video.yongjiu/addon.xml index ff30fc2..10fd853 100644 --- a/plugin.video.yongjiu/addon.xml +++ b/plugin.video.yongjiu/addon.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.yongjiu" name="永久资源" - version="1.0.2" + version="1.1.0" provider-name="yfang1644"> <requires> <import addon="script.module.xbmcswift2" version="2.4.0"/> <import addon="script.module.beautifulsoup4" version="4.3.2"/> - <import addon="plugin.video.cntv-video" version="1.0.6"/> + <import addon="script.module.geturl" version="1.0.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> diff --git a/plugin.video.yongjiu/default.py b/plugin.video.yongjiu/default.py index 499c012..f04c512 100644 --- a/plugin.video.yongjiu/default.py +++ b/plugin.video.yongjiu/default.py @@ -1,11 +1,7 @@ #!/usr/bin/python # -*- coding: utf8 -*- -import os -import sys -import xbmcaddon - -from xbmcswift2 import Plugin, ListItem, xbmc, xbmcgui +from xbmcswift2 import Plugin, ListItem, xbmc from bs4 import BeautifulSoup from urlparse import urlparse from json import loads diff --git a/plugin.video.yongjiu/plugin.video.yongjiu-1.0.2.zip b/plugin.video.yongjiu/plugin.video.yongjiu-1.1.0.zip similarity index 73% rename from plugin.video.yongjiu/plugin.video.yongjiu-1.0.2.zip rename to plugin.video.yongjiu/plugin.video.yongjiu-1.1.0.zip index 224f11d..7c92f7d 100644 Binary files a/plugin.video.yongjiu/plugin.video.yongjiu-1.0.2.zip and b/plugin.video.yongjiu/plugin.video.yongjiu-1.1.0.zip differ diff --git a/plugin.video.youku/addon.xml b/plugin.video.youku/addon.xml index a845544..482e6b6 100644 --- a/plugin.video.youku/addon.xml +++ b/plugin.video.youku/addon.xml @@ -1,14 +1,15 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.youku" - name="优酷视频" version="1.0.0" + name="优酷视频" version="1.1.0" provider-name="yfang1644"> <requires> <import addon="script.module.xbmcswift2" version="2.4.0"/> - <import addon="plugin.video.cntv-video" version="1.0.6"/> + <import addon="script.module.geturl" version="1.0.0"/> </requires> <extension point="xbmc.python.pluginsource" library="default.py"> <provides>video</provides> </extension> + <extension point="xbmc.python.module" library="lib"/> <extension point="xbmc.addon.metadata"> <language></language> <summary lang="en">YouKu Video (plain version)</summary> @@ -16,7 +17,7 @@ <description lang="en">YouKu is china's largest video sharing site.</description> <description lang="zh">优酷视频</description> <source>https://github.com/yfang1644/kodi_plugins/plugin.video.youku</source> - <email>yfang1644@gmail.com</email> + <email>yfang1644@gmail.com</email> <platform>all</platform> - </extension> + </extension> </addon> diff --git a/plugin.video.youku/default.py b/plugin.video.youku/default.py index 77f0f19..622eeb5 100644 --- a/plugin.video.youku/default.py +++ b/plugin.video.youku/default.py @@ -5,7 +5,7 @@ from urllib import quote_plus, urlencode from json import loads from common import get_html, match1 -from youku import video_from_vid +from lib.youku import video_from_vid HOST = 'http://tv.api.3g.youku.com' BASEIDS = { @@ -18,7 +18,6 @@ 'launcher': 0 } - ######################################################################## # 优酷 www.youku.com ######################################################################## @@ -49,7 +48,6 @@ def playvideo(videoid): level = int(plugin.addon.getSetting('resolution')) urls = video_from_vid(videoid, level=level) - stackurl = 'stack://' + ' , '.join(urls) plugin.set_resolved_url(stackurl) diff --git a/plugin.video.youku/lib/__init__.py b/plugin.video.youku/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/plugin.video.cntv-video/lib/youku.py b/plugin.video.youku/lib/youku.py similarity index 97% rename from plugin.video.cntv-video/lib/youku.py rename to plugin.video.youku/lib/youku.py index af58e09..d822941 100644 --- a/plugin.video.cntv-video/lib/youku.py +++ b/plugin.video.youku/lib/youku.py @@ -40,8 +40,9 @@ def __init__(self, *args): # Found in http://g.alicdn.com/player/ykplayer/0.5.28/youku-player.min.js # grep -oE '"[0-9a-zA-Z+/=]{256}"' youku-player.min.js self.params = { - ('0808', self.ckey_mobile), - ('0590', self.ckey_default) + ('0515', self.ckey_default), + ('0516', self.ckey_default), + ('0517', self.ckey_default) } self.title = '' diff --git a/plugin.video.youku/plugin.video.youku-1.0.0.zip b/plugin.video.youku/plugin.video.youku-1.1.0.zip similarity index 91% rename from plugin.video.youku/plugin.video.youku-1.0.0.zip rename to plugin.video.youku/plugin.video.youku-1.1.0.zip index 5fa654d..c436bec 100644 Binary files a/plugin.video.youku/plugin.video.youku-1.0.0.zip and b/plugin.video.youku/plugin.video.youku-1.1.0.zip differ diff --git a/plugin.video.youkutv/addon.py b/plugin.video.youkutv/addon.py index a3864cf..5c75984 100644 --- a/plugin.video.youkutv/addon.py +++ b/plugin.video.youkutv/addon.py @@ -7,7 +7,7 @@ import xbmc from json import loads import sys -import urllib +from urllib import quote_plus import urllib2 import re import os @@ -752,7 +752,7 @@ def updateContent(self): try: url = HOST + 'tv/top/shows?' + IDS + '&top_id=' + self.sdata for k in self.urlArgs: - url = url + '&' + k + '=' + urllib.quote_plus(self.urlArgs[k]) + url = url + '&' + k + '=' + quote_plus(self.urlArgs[k]) data = GetHttpData(url) if data.get('status', '') != 'success': @@ -860,7 +860,7 @@ def updateContent(self): try: url = HOST + 'layout/smarttv/item_list?' + IDS + '&cid=' + self.sdata for k in self.urlArgs: - url = url + '&' + k + '=' + urllib.quote_plus(self.urlArgs[k]) + url = url + '&' + k + '=' + quote_plus(self.urlArgs[k]) data = GetHttpData(url) if 'status' not in data: @@ -1008,7 +1008,7 @@ def updateContent(self): try: url = HOST + 'layout/smarttv/item_list?' + IDS for k in self.urlArgs: - url = url + '&' + k + '=' + urllib.quote_plus(self.urlArgs[k]) + url = url + '&' + k + '=' + quote_plus(self.urlArgs[k]) data = GetHttpData(url) if data.get('status', '') != 'success': @@ -1172,7 +1172,7 @@ def initShow(self): if self.showInited: return - url = HOST + 'layout/smarttv/showsearch?copyright_status=1&video_type=1&keyword=' + urllib.quote_plus(self.sdata) + '&' + IDS + url = HOST + 'layout/smarttv/showsearch?copyright_status=1&video_type=1&keyword=' + quote_plus(self.sdata) + '&' + IDS data = GetHttpData(url) if data.get('status', '') != 'success': @@ -1192,9 +1192,9 @@ def updateContent(self): self.showBusy() try: - url = HOST + 'openapi-wireless/videos/search/' + urllib.quote_plus(self.sdata) + '?' + IDS + url = HOST + 'openapi-wireless/videos/search/' + quote_plus(self.sdata) + '?' + IDS for k in self.urlArgs: - url = url + '&' + k + '=' + urllib.quote_plus(self.urlArgs[k]) + url = url + '&' + k + '=' + quote_plus(self.urlArgs[k]) data = GetHttpData(url) if data.get('status', '') != 'success': @@ -1341,7 +1341,7 @@ def updateContent(self): data = GetHttpData(HOST + 'openapi-wireless/keywords/recommend?' + IDS) title_key = 'title' else: - data = GetHttpData(HOST + 'openapi-wireless/keywords/suggest?' + IDS + '&keywords=' + urllib.quote_plus(self.keywords)) + data = GetHttpData(HOST + 'openapi-wireless/keywords/suggest?' + IDS + '&keywords=' + quote_plus(self.keywords)) title_key = 'keyword' if data.get('status', '') != 'success': diff --git a/plugin.video.youkutv/addon.xml b/plugin.video.youkutv/addon.xml index 27e15fe..87636e4 100644 --- a/plugin.video.youkutv/addon.xml +++ b/plugin.video.youkutv/addon.xml @@ -1,11 +1,12 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.youkutv" - name="YouKu TV" version="1.7.9" + name="YouKu TV" version="1.8.0" provider-name="catro, yfang1644"> <requires> <import addon="xbmc.python" version="2.1.0"/> <import addon="script.common.plugin.cache" version="0.9.1"/> - <import addon="plugin.video.cntv-video" version="1.0.6"/> + <import addon="script.module.geturl" version="1.0.0"/> + <import addon="plugin.video.youku" version="1.1.0"/> </requires> <extension point="xbmc.python.script" library="addon.py"> <provides>video</provides> diff --git a/plugin.video.youkutv/plugin.video.youkutv-1.7.9.zip b/plugin.video.youkutv/plugin.video.youkutv-1.8.0.zip similarity index 97% rename from plugin.video.youkutv/plugin.video.youkutv-1.7.9.zip rename to plugin.video.youkutv/plugin.video.youkutv-1.8.0.zip index 446bba6..2e0afa9 100644 Binary files a/plugin.video.youkutv/plugin.video.youkutv-1.7.9.zip and b/plugin.video.youkutv/plugin.video.youkutv-1.8.0.zip differ diff --git a/script.module.geturl/addon.xml b/script.module.geturl/addon.xml new file mode 100644 index 0000000..dd05e40 --- /dev/null +++ b/script.module.geturl/addon.xml @@ -0,0 +1,16 @@ +<?xml version='1.0' encoding='UTF-8' standalone='yes'?> +<addon id="script.module.geturl" + name="CHVideo getURL" + provider-name="yfang1644" + version="1.0.0"> + <requires> + <import addon="xbmc.python" version="2.24.0" /> + </requires> + <extension point="xbmc.python.module" library="lib" /> + <extension point="xbmc.addon.metadata"> + <platform>all</platform> + <summary lang="en">Common module for chinese video/audio api.</summary> + <source>https://github.com/yfang1644/kodi_plugins/script.module.geturl</source> + <email>yfang1644@gmail.com</email> + </extension> +</addon> diff --git a/script.module.geturl/changelog.txt b/script.module.geturl/changelog.txt new file mode 100644 index 0000000..c0336b9 --- /dev/null +++ b/script.module.geturl/changelog.txt @@ -0,0 +1,2 @@ +[B]Version 1.0.0[/B] +- 2018.08.25 Initial geturl diff --git a/plugin.video.cntv-video/lib/common.py b/script.module.geturl/lib/common.py similarity index 100% rename from plugin.video.cntv-video/lib/common.py rename to script.module.geturl/lib/common.py diff --git a/script.module.geturl/script.module.geturl-1.0.0.zip b/script.module.geturl/script.module.geturl-1.0.0.zip new file mode 100644 index 0000000..f0012e6 Binary files /dev/null and b/script.module.geturl/script.module.geturl-1.0.0.zip differ