The branch, frodo has been updated
via 0ce1a8089367077b2beca0ccc6463951d8e664b7 (commit)
from b2fd683d998915caa11b002ebea06afc54e39c1a (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=0ce1a8089367077b2beca0ccc6463951d8e664b7
commit 0ce1a8089367077b2beca0ccc6463951d8e664b7
Author: Martijn Kaijser <[email protected]>
Date: Tue May 13 09:25:32 2014 +0200
[plugin.audio.mixcloud] 1.1.3
diff --git a/plugin.audio.mixcloud/README b/plugin.audio.mixcloud/README
index 12fd2a0..31f1168 100644
--- a/plugin.audio.mixcloud/README
+++ b/plugin.audio.mixcloud/README
@@ -1,8 +1,17 @@
============================================
-XBMC Mixcloud Plugin - jackyNIX/Bochi
+
+XBMC Mixcloud Plugin - jackyNIX
+
+============================================
+
+Contributors:
+ - jackyNIX
+ - Bochi
+ - SilentException
+
============================================
-Current version: 1.1.1 frodo
+Current version: 1.1.3 frodo
============================================
diff --git a/plugin.audio.mixcloud/addon.xml b/plugin.audio.mixcloud/addon.xml
index 65b3cb7..8eb8526 100644
--- a/plugin.audio.mixcloud/addon.xml
+++ b/plugin.audio.mixcloud/addon.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.audio.mixcloud"
name="MixCloud"
- version="1.1.1"
- provider-name="jackyNIX/Bochi">
+ version="1.1.3"
+ provider-name="jackyNIX">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
<import addon="script.module.simplejson" version="2.0.10"/>
@@ -21,8 +21,8 @@
<description lang="de">Mixcloud erfindet Radio neu. Höre Radioshows,
Podcasts und DJ Mixe wann immer Du willst.</description>
<platform>all</platform>
<language></language>
- <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
+ <license>GNU GENERAL PUBLIC LICENSE. Version 3, 29 June 2007</license>
<forum>http://forum.xbmc.org/showthread.php?tid=116386</forum>
<source>https://github.com/jackyNIX/xbmc-mixcloud-plugin</source>
</extension>
-</addon>
+</addon>
\ No newline at end of file
diff --git a/plugin.audio.mixcloud/changelog.txt
b/plugin.audio.mixcloud/changelog.txt
index 02256dd..8c0c9c6 100644
--- a/plugin.audio.mixcloud/changelog.txt
+++ b/plugin.audio.mixcloud/changelog.txt
@@ -1,3 +1,9 @@
+1.1.3
+- Added local resolver (tnx to SilentException)
+
+1.1.2
+- Fixed playback of incorrect tracks (tnx to SilentException)
+
1.1.1
- Modified getstream url
@@ -9,8 +15,7 @@
- Added French localisation
1.0.0
-- Bochi joined the project
-- Fixed streaming
+- Fixed streaming (tnx to Bochi)
- Added debug option (disabled by default)
- Added localisation (English, Dutch)
- Added to official dharma repository
diff --git a/plugin.audio.mixcloud/default.py b/plugin.audio.mixcloud/default.py
index 94f25e5..bf4bd5f 100644
--- a/plugin.audio.mixcloud/default.py
+++ b/plugin.audio.mixcloud/default.py
@@ -26,12 +26,16 @@ along with XBMC MixCloud Plugin. If not, see
<http://www.gnu.org/licenses/>.
import sys,time
import xbmc,xbmcgui,xbmcplugin,xbmcaddon
import urllib,urllib2
+import base64
import simplejson as json
import re
import sys
+from itertools import cycle, izip
+
URL_PLUGIN= 'plugin://music/MixCloud/'
+URL_MIXCLOUD= 'http://www.mixcloud.com/'
URL_API= 'http://api.mixcloud.com/'
URL_CATEGORIES='http://api.mixcloud.com/categories/'
URL_HOT= 'http://api.mixcloud.com/popular/hot/'
@@ -84,11 +88,20 @@ STR_TRACKNUMBER= u'tracknumber'
STR_TYPE= u'type'
STR_USER= u'user'
STR_YEAR= u'year'
+STR_IMAGE= u'image'
+STR_THUMBNAIL= u'thumbnail'
+STR_STREAMURL= u'stream_url'
STR_THUMB_SIZES=
{0:u'small',1:u'thumbnail',2:u'medium',3:u'large',4:u'extra_large'}
+class Resolver:
+ local=0
+ offliberty=1
+
+
+
plugin_handle=int(sys.argv[1])
__addon__ =xbmcaddon.Addon('plugin.audio.mixcloud')
@@ -97,6 +110,7 @@ __addon__ =xbmcaddon.Addon('plugin.audio.mixcloud')
debugenabled=(__addon__.getSetting('debug')=='true')
limit= (1+int(__addon__.getSetting('page_limit')))*10
thumb_size= STR_THUMB_SIZES[int(__addon__.getSetting('thumb_size'))]
+resolver= int(__addon__.getSetting('resolver'))
@@ -248,8 +262,13 @@ def show_history_search_menu(offset):
def play_cloudcast(key):
url=get_stream(key)
if url:
-
xbmcplugin.setResolvedUrl(handle=plugin_handle,succeeded=True,listitem=xbmcgui.ListItem(path=url))
+ infolabels=get_cloudcast(URL_API[:-1]+key,{},True)
+
listitem=xbmcgui.ListItem(label=infolabels[STR_TITLE],label2=infolabels[STR_ARTIST],iconImage=infolabels[STR_THUMBNAIL],thumbnailImage=infolabels[STR_THUMBNAIL],path=url)
+ listitem.setInfo(type='Music',infoLabels=infolabels)
+
xbmcplugin.setResolvedUrl(handle=plugin_handle,succeeded=True,listitem=listitem)
add_to_settinglist('play_history_list',key,'play_history_max')
+ if debugenabled:
+ print('MIXCLOUD playing '+url)
else:
xbmcplugin.setResolvedUrl(handle=plugin_handle,succeeded=False,listitem=xbmcgui.ListItem())
@@ -274,13 +293,14 @@ def get_cloudcasts(url,parameters):
json_tracknumber=0
for json_cloudcast in json_data:
json_tracknumber=json_tracknumber+1
- if add_cloudcast(json_tracknumber,json_cloudcast,total):
+ infolabels = add_cloudcast(json_tracknumber,json_cloudcast,total);
+ if len(infolabels)>0:
found=found+1
return found
-def get_cloudcast(url,parameters,index=1,total=0):
+def get_cloudcast(url,parameters,index=1,total=0,forinfo=False):
if len(parameters)>0:
url=url+'?'+urllib.urlencode(parameters)
if debugenabled:
@@ -288,10 +308,11 @@ def get_cloudcast(url,parameters,index=1,total=0):
h=urllib2.urlopen(url)
content=h.read()
json_cloudcast=json.loads(content)
- return add_cloudcast(index,json_cloudcast,total)
+ return add_cloudcast(index,json_cloudcast,total,forinfo)
-def add_cloudcast(index,json_cloudcast,total):
+
+def add_cloudcast(index,json_cloudcast,total,forinfo=False):
if STR_NAME in json_cloudcast and json_cloudcast[STR_NAME]:
json_name=json_cloudcast[STR_NAME]
json_key=''
@@ -317,32 +338,82 @@ def add_cloudcast(index,json_cloudcast,total):
json_pictures=json_cloudcast[STR_PICTURES]
if thumb_size in json_pictures and json_pictures[thumb_size]:
json_image=json_pictures[thumb_size]
-
add_audio_item({STR_COUNT:index,STR_TRACKNUMBER:index,STR_TITLE:json_name,STR_ARTIST:json_username,STR_DURATION:json_length,STR_YEAR:json_year,STR_DATE:json_date},
- {STR_MODE:MODE_PLAY,STR_KEY:json_key},
- json_image,
- total)
- return True
+ infolabels =
{STR_COUNT:index,STR_TRACKNUMBER:index,STR_TITLE:json_name,STR_ARTIST:json_username,STR_DURATION:json_length,STR_YEAR:json_year,STR_DATE:json_date,STR_THUMBNAIL:json_image}
+ if not forinfo:
+ add_audio_item(infolabels,
+ {STR_MODE:MODE_PLAY,STR_KEY:json_key},
+ infolabels[STR_THUMBNAIL],
+ total)
+
+ return infolabels
else:
- return False
-
+ return {}
-def get_stream(cloudcast_key):
- ck="http://www.mixcloud.com"+cloudcast_key
+
+def get_stream_offliberty(cloudcast_key):
+ ck=URL_MIXCLOUD[:-1]+cloudcast_key
if debugenabled:
print('MIXCLOUD '+'resolving cloudcast stream for '+ck)
for retry in range(1, 10):
+ try:
# request = urllib2.Request('http://offliberty.com/off.php',
'track=%s&refext=' % ck)
- request = urllib2.Request('http://offliberty.com/off54.php',
'track=%s&refext=' % ck)
- request.add_header('Referer', 'http://offliberty.com/')
- response = urllib2.urlopen(request)
- data=response.read()
- match=re.search('HREF="(.*)" class="download"', data)
- if match:
- return match.group(1)
+# request = urllib2.Request('http://offliberty.com/off54.php',
'track=%s&refext=' % ck)
+# request.add_header('Referer', 'http://offliberty.com/')
+ values={
+ 'track' : ck,
+ 'refext' : ''
+ }
+ headers={
+ 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.27 Safari/537.36',
+ 'Referer' : 'http://offliberty.com/'
+ }
+ postdata = urllib.urlencode(values)
+ request = urllib2.Request('http://offliberty.com/off54.php',
postdata, headers, 'http://offliberty.com/')
+ response = urllib2.urlopen(request)
+ data=response.read()
+ match=re.search('HREF="(.*)" class="download"', data)
+ if match:
+ return match.group(1)
+ elif debugenabled:
+ print('wrong response try=%s code=%s len=%s, trying again...'
% (retry, response.getcode(), len(data)))
+ except:
+ if debugenabled:
+ print('unexpected error try=%s error=%s, trying again...' %
(retry, sys.exc_info()[0]))
+
+
+
+def get_stream_local(cloudcast_key):
+ ck=URL_MIXCLOUD[:-1]+cloudcast_key
+ if debugenabled:
+ print('MIXCLOUD '+'locally resolving cloudcast stream for '+ck)
+ headers={
+ 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/35.0.1916.27 Safari/537.36',
+ 'Referer' : URL_MIXCLOUD
+ }
+ request = urllib2.Request(ck, headers=headers,
origin_req_host=URL_MIXCLOUD)
+ response = urllib2.urlopen(request)
+ data=response.read()
+ match=re.search('m-p-ref="x_cloudcast_page" m-play-info="(.*)" m-preview',
data)
+ if match:
+ playInfo=base64.b64decode(match.group(1))
+
magicString=base64.b64decode('cGxlYXNlZG9udGRvd25sb2Fkb3VybXVzaWN0aGVhcnRpc3Rzd29udGdldHBhaWQ=')
+ playInfoJSON=''.join(chr(ord(a) ^ ord(b)) for a,b in
zip(playInfo,cycle(magicString)))
+ json_content=json.loads(playInfoJSON)
+ if STR_STREAMURL in json_content and json_content[STR_STREAMURL]:
+ return json_content[STR_STREAMURL]
elif debugenabled:
- print('wrong response try=%s code=%s len=%s, trying again...' %
(retry, response.getcode(), len(data)))
-
+ print('unable to resolve')
+ elif debugenabled:
+ print('unable to resolve')
+
+
+
+def get_stream(cloudcast_key):
+ resolvers={Resolver.local : get_stream_local,
+ Resolver.offliberty : get_stream_offliberty}
+ return resolvers[resolver](cloudcast_key)
+
def get_categories(url):
diff --git a/plugin.audio.mixcloud/resources/language/Dutch/strings.xml
b/plugin.audio.mixcloud/resources/language/Dutch/strings.xml
index 187abce..887bb04 100644
--- a/plugin.audio.mixcloud/resources/language/Dutch/strings.xml
+++ b/plugin.audio.mixcloud/resources/language/Dutch/strings.xml
@@ -19,6 +19,7 @@
<string id="30201">Maximum cloudcasts per pagina</string>
<string id="30202">Grootte van afbeeldingen</string>
<string id="30203">Debug modus</string>
+ <string id="30211">Resolver</string>
<!-- history settings -->
<string id="30220">Geschiedenis</string>
<string id="30221">Maximum afgespeelde cloudcasts</string>
diff --git a/plugin.audio.mixcloud/resources/language/English/strings.xml
b/plugin.audio.mixcloud/resources/language/English/strings.xml
index babaeec..dbe19e8 100644
--- a/plugin.audio.mixcloud/resources/language/English/strings.xml
+++ b/plugin.audio.mixcloud/resources/language/English/strings.xml
@@ -19,6 +19,7 @@
<string id="30201">Maximum cloudcasts on page</string>
<string id="30202">Download thumbnail size</string>
<string id="30203">Debug mode</string>
+ <string id="30211">Resolver</string>
<!-- history settings -->
<string id="30220">History</string>
<string id="30221">Maximum played cloudcasts</string>
diff --git a/plugin.audio.mixcloud/resources/language/French/strings.xml
b/plugin.audio.mixcloud/resources/language/French/strings.xml
index 3ad9f43..beaf1ba 100644
--- a/plugin.audio.mixcloud/resources/language/French/strings.xml
+++ b/plugin.audio.mixcloud/resources/language/French/strings.xml
@@ -19,6 +19,7 @@
<string id="30201">Nombre maximal de cloudcasts par page</string>
<string id="30202">Dimensions des icônes téléchargés</string>
<string id="30203">Mode debug</string>
+ <string id="30211">Resolver</string>
<!-- history settings -->
<string id="30220">Histoire</string>
<string id="30221">Nombre maximal de cloudcasts écoutés</string>
diff --git a/plugin.audio.mixcloud/resources/language/German/strings.xml
b/plugin.audio.mixcloud/resources/language/German/strings.xml
index b027e32..fd6591f 100644
--- a/plugin.audio.mixcloud/resources/language/German/strings.xml
+++ b/plugin.audio.mixcloud/resources/language/German/strings.xml
@@ -19,7 +19,8 @@
<string id="30201">Maximale Cloudcasts pro Seite</string>
<string id="30202">GröÃe der Vorschaubilder</string>
<string id="30203">Debug Modus</string>
- <!-- history settings -->
+ <string id="30211">Resolver</string>
+<!-- history settings -->
<string id="30220">Verlauf</string>
<string id="30221">Maximale Gespielte Cloudcasts</string>
<string id="30222">Maximale Suchanfragen</string>
diff --git a/plugin.audio.mixcloud/resources/settings.xml
b/plugin.audio.mixcloud/resources/settings.xml
index 612eab2..a4eeb28 100644
--- a/plugin.audio.mixcloud/resources/settings.xml
+++ b/plugin.audio.mixcloud/resources/settings.xml
@@ -5,6 +5,7 @@
<category label="30200">
<setting id="page_limit" type="enum" label="30201" values="10|20|30|40|50"
default="1" />
<setting id="thumb_size" type="enum" label="30202" values="very
small|small|medium|large|extra large" default="2" />
+ <setting id="resolver" type="enum" label="30211" values="local|offliberty"
default="0" />
<setting type="sep" />
<setting id="debug" type="bool" label="30203" default="false" />
</category>
-----------------------------------------------------------------------
Summary of changes:
plugin.audio.mixcloud/README | 13 ++-
plugin.audio.mixcloud/addon.xml | 10 +-
plugin.audio.mixcloud/changelog.txt | 9 +-
plugin.audio.mixcloud/default.py | 117 ++++++++++++++++----
.../resources/language/Dutch/strings.xml | 1 +
.../resources/language/English/strings.xml | 1 +
.../resources/language/French/strings.xml | 1 +
.../resources/language/German/strings.xml | 3 +-
plugin.audio.mixcloud/resources/settings.xml | 1 +
9 files changed, 123 insertions(+), 33 deletions(-)
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons