The branch, eden has been updated
via 1b46af3d3caa6312cad17595cbfcb2f1baec71b6 (commit)
from 36157dbfaadb5283c179c82be4d1ce7c6ed3db2b (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=1b46af3d3caa6312cad17595cbfcb2f1baec71b6
commit 1b46af3d3caa6312cad17595cbfcb2f1baec71b6
Author: beenje <[email protected]>
Date: Thu Aug 29 21:05:47 2013 +0200
[plugin.video.dailymotion_com] updated to version 1.1.2
diff --git a/plugin.video.dailymotion_com/addon.xml
b/plugin.video.dailymotion_com/addon.xml
index b35b3ae..139230f 100644
--- a/plugin.video.dailymotion_com/addon.xml
+++ b/plugin.video.dailymotion_com/addon.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
-<addon id="plugin.video.dailymotion_com" name="DailyMotion.com"
version="1.1.1" provider-name="AddonScriptorDE">
+<addon id="plugin.video.dailymotion_com" name="DailyMotion.com"
version="1.1.2" provider-name="AddonScriptorDE">
<requires>
<import addon="xbmc.python" version="2.0"/>
+ <import addon="script.module.simple.downloader" version="0.9.4"/>
</requires>
<extension point="xbmc.python.pluginsource" library="default.py">
<provides>video</provides>
diff --git a/plugin.video.dailymotion_com/changelog.txt
b/plugin.video.dailymotion_com/changelog.txt
index b8f2c32..4aade9e 100644
--- a/plugin.video.dailymotion_com/changelog.txt
+++ b/plugin.video.dailymotion_com/changelog.txt
@@ -32,3 +32,8 @@
1.1.1 / 2.1.1
- Bugfix with context menu
- Some other small improvements
+1.1.2 / 2.1.2
+- Changed default view
+- Fixed encoding problem
+- Added download function
+- Added user-playlist browsing
diff --git a/plugin.video.dailymotion_com/default.py
b/plugin.video.dailymotion_com/default.py
index 2e7bc4a..fa3b843 100644
--- a/plugin.video.dailymotion_com/default.py
+++ b/plugin.video.dailymotion_com/default.py
@@ -1,23 +1,25 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
+import socket
import urllib
import urllib2
-import socket
import xbmcplugin
import xbmcaddon
import xbmcgui
import sys
import os
import re
+import json
import base64
import datetime
+import unicodedata
+import SimpleDownloader
familyFilter = "1"
socket.setdefaulttimeout(60)
pluginhandle = int(sys.argv[1])
-addonID = 'plugin.video.dailymotion_com'
-addon = xbmcaddon.Addon(addonID)
-translation = addon.getLocalizedString
+addon = xbmcaddon.Addon()
+addonID = addon.getAddonInfo('id')
channelFavsFile =
xbmc.translatePath("special://profile/addon_data/"+addonID+"/"+addonID+".favorites")
familyFilterFile =
xbmc.translatePath("special://profile/addon_data/"+addonID+"/family_filter_off")
@@ -27,9 +29,10 @@ if os.path.exists(familyFilterFile):
while (not
os.path.exists(xbmc.translatePath("special://profile/addon_data/"+addonID+"/settings.xml"))):
addon.openSettings()
-forceViewMode = addon.getSetting("forceViewMode") == "true"
-viewMode = str(addon.getSetting("viewMode"))
+forceViewModeNew = addon.getSetting("forceViewModeNew") == "true"
+viewModeNew = str(addon.getSetting("viewModeNew"))
maxVideoQuality = addon.getSetting("maxVideoQuality")
+downloadDir = addon.getSetting("downloadDir")
qual = ["480p", "720p", "1080p"]
maxVideoQuality = qual[int(maxVideoQuality)]
language = addon.getSetting("language")
@@ -39,6 +42,7 @@ dmUser = addon.getSetting("dmUser")
itemsPerPage = addon.getSetting("itemsPerPage")
itemsPage = ["25", "50", "75", "100"]
itemsPerPage = itemsPage[int(itemsPerPage)]
+urlMain = "https://api.dailymotion.com"
def index():
@@ -50,59 +54,55 @@ def index():
addDir(translation(30007), "", 'sortUsers1', "")
addDir(translation(30042), "ALL", 'listGroups', "")
addDir(translation(30002), "", 'search', "")
- addDir(translation(30003), "", 'listLive', "")
+ addDir(translation(30003),
urlMain+"/videos?fields=id,thumbnail_large_url%2Ctitle%2Cviews_last_hour&filters=live&sort=visited-hour&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listLive', "")
addDir(translation(30039), '3D:ALL', 'sortVideos1', '', '')
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def personalMain():
- addDir(translation(30041),
"https://api.dailymotion.com/user/"+dmUser+"/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listVideos', "")
- addDir(translation(30035),
"https://api.dailymotion.com/user/"+dmUser+"/following?fields=username,avatar_large_url,videos_total,views_total&sort=popular&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listUsers', "")
- addDir(translation(30036),
"https://api.dailymotion.com/user/"+dmUser+"/subscriptions?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listVideos', "")
- addDir(translation(30037),
"https://api.dailymotion.com/user/"+dmUser+"/favorites?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listVideos', "")
- addDir(translation(30038),
"https://api.dailymotion.com/user/"+dmUser+"/playlists?fields=id,name,videos_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listUserPlaylists', "")
- addDir(translation(30042),
"https://api.dailymotion.com/user/"+dmUser+"/groups?fields=id,name,description&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listGroups', "")
+ addDir(translation(30041),
urlMain+"/user/"+dmUser+"/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listVideos', "")
+ addDir(translation(30035),
urlMain+"/user/"+dmUser+"/following?fields=username,avatar_large_url,videos_total,views_total&sort=popular&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listUsers', "")
+ addDir(translation(30036),
urlMain+"/user/"+dmUser+"/subscriptions?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listVideos', "")
+ addDir(translation(30037),
urlMain+"/user/"+dmUser+"/favorites?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listVideos', "")
+ addDir(translation(30038),
urlMain+"/user/"+dmUser+"/playlists?fields=id,name,videos_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listUserPlaylists', "")
+ addDir(translation(30042),
urlMain+"/user/"+dmUser+"/groups?fields=id,name,description&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listGroups', "")
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def listUserPlaylists(url):
content = getUrl(url)
- match = re.compile('{"id":"(.+?)","name":"(.+?)","videos_total":(.+?)}',
re.DOTALL).findall(content)
- for id, title, vids in match:
- addDir(title+" ("+vids+")",
urllib.quote_plus(id+"_"+dmUser+"_"+title), 'showPlaylist', '')
- match = re.compile('"page":(.+?),', re.DOTALL).findall(content)
- currentPage = int(match[0])
- nextPage = currentPage+1
- if '"has_more":true' in content:
+ content = json.loads(content)
+ for item in content['list']:
+ id = item['id']
+ title = item['name'].encode('utf-8')
+ vids = item['videos_total']
+ addDir(title+" ("+str(vids)+")",
urllib.quote_plus(str(id)+"_"+dmUser+"_"+title), 'showPlaylist', '')
+ if content['has_more']:
+ currentPage = content['page']
+ nextPage = currentPage+1
addDir(translation(30001)+" ("+str(nextPage)+")",
url.replace("page="+str(currentPage), "page="+str(nextPage)),
'listUserPlaylists', "")
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def listGroups(url):
if url == "ALL":
- url =
"https://api.dailymotion.com/groups?fields=id,name,description&sort=recent&filters=featured&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
+ url =
urlMain+"/groups?fields=id,name,description&sort=recent&filters=featured&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
content = getUrl(url)
- match = re.compile('{"id":"(.+?)","name":"(.+?)","description":(.+?)}',
re.DOTALL).findall(content)
- for id, title, desc in match:
- addDir(cleanTitle(title), "group:"+id, 'sortVideos1', '', desc)
- match = re.compile('"page":(.+?),', re.DOTALL).findall(content)
- currentPage = int(match[0])
- nextPage = currentPage+1
- if '"has_more":true' in content:
+ content = json.loads(content)
+ for item in content['list']:
+ id = item['id']
+ title = item['name'].encode('utf-8')
+ desc = item['description'].encode('utf-8')
+ addDir(title, "group:"+id, 'sortVideos1', '', desc)
+ if content['has_more']:
+ currentPage = content['page']
+ nextPage = currentPage+1
addDir(translation(30001)+" ("+str(nextPage)+")",
url.replace("page="+str(currentPage), "page="+str(nextPage)), 'listGroups', "")
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def showPlaylist(id):
- url =
"https://api.dailymotion.com/playlist/"+id+"/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
+ url =
urlMain+"/playlist/"+id+"/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
listVideos(url)
@@ -116,36 +116,35 @@ def favouriteUsers():
addUserFavDir(user, 'owner:'+user, 'sortVideos1', thumb)
fh.close()
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def listChannels():
- content =
getUrl("https://api.dailymotion.com/channels?family_filter="+familyFilter+"&localization="+language)
- match = re.compile('{"id":"(.+?)","name":"(.+?)","description":"(.+?)"}',
re.DOTALL).findall(content)
- for id, title, desc in match:
+ content =
getUrl(urlMain+"/channels?family_filter="+familyFilter+"&localization="+language)
+ content = json.loads(content)
+ for item in content['list']:
+ id = item['id']
+ title = item['name'].encode('utf-8')
+ desc = item['description'].encode('utf-8')
addDir(title, 'channel:'+id, 'sortVideos1', '', desc)
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def sortVideos1(url):
type = url[:url.find(":")]
id = url[url.find(":")+1:]
if type == "3D":
- url =
"https://api.dailymotion.com/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&filters=3d&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
+ url =
urlMain+"/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&filters=3d&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
elif type == "group":
- url =
"https://api.dailymotion.com/group/"+id+"/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
+ url =
urlMain+"/group/"+id+"/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
else:
- url =
"https://api.dailymotion.com/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&"+type+"="+id+"&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
+ url =
urlMain+"/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&"+type+"="+id+"&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
addDir(translation(30008), url, 'listVideos', "")
addDir(translation(30009), url.replace("sort=recent", "sort=visited"),
'sortVideos2', "")
addDir(translation(30020), url.replace("sort=recent", "sort=commented"),
'sortVideos2', "")
addDir(translation(30010), url.replace("sort=recent", "sort=rated"),
'sortVideos2', "")
+ if type == "owner":
+ addDir("- "+translation(30038),
urlMain+"/user/"+id+"/playlists?fields=id,name,videos_total&sort=recent&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1",
'listUserPlaylists', "")
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def sortVideos2(url):
@@ -154,19 +153,15 @@ def sortVideos2(url):
addDir(translation(30013), url.replace("sort=visited",
"sort=visited-month").replace("sort=commented",
"sort=commented-month").replace("sort=rated", "sort=rated-month"),
"listVideos", "")
addDir(translation(30014), url, 'listVideos', "")
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def sortUsers1():
- url =
"https://api.dailymotion.com/users?fields=username,avatar_large_url,videos_total,views_total&sort=popular&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
+ url =
urlMain+"/users?fields=username,avatar_large_url,videos_total,views_total&sort=popular&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1"
addDir(translation(30040), url, 'sortUsers2', "")
addDir(translation(30016), url+"&filters=featured", 'sortUsers2', "")
addDir(translation(30017), url+"&filters=official", 'sortUsers2', "")
addDir(translation(30018), url+"&filters=creative", 'sortUsers2', "")
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def sortUsers2(url):
@@ -174,61 +169,83 @@ def sortUsers2(url):
addDir(translation(30020), url.replace("sort=popular", "sort=commented"),
'listUsers', "")
addDir(translation(30021), url.replace("sort=popular", "sort=rated"),
'listUsers', "")
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def listVideos(url):
+ xbmcplugin.setContent(pluginhandle, "episodes")
content = getUrl(url)
- match =
re.compile('{"description":"(.*?)","duration":(.+?),"id":"(.+?)","owner.username":"(.+?)","taken_time":(.+?),"thumbnail_large_url":"(.*?)","title":"(.+?)","views_total":(.+?)}',
re.DOTALL).findall(content)
- for desc, duration, id, user, date, thumb, title, views in match:
+ content = json.loads(content)
+ count = 1
+ for item in content['list']:
+ id = item['id']
+ title = item['title'].encode('utf-8')
+ desc = item['description'].encode('utf-8')
+ duration = item['duration']
+ user = item['owner.username']
+ date = item['taken_time']
+ thumb = item['thumbnail_large_url']
+ views = item['views_total']
duration = str(int(duration)/60+1)
try:
date =
datetime.datetime.fromtimestamp(int(date)).strftime('%Y-%m-%d')
except:
date = ""
- desc = "User: "+user+" | "+views+" Views | "+date+"\n"+desc
+ temp = ("User: "+user+" | "+str(views)+" Views |
"+date).encode('utf-8')
+ try:
+ desc = temp+"\n"+desc
+ except:
+ desc = ""
if user == "hulu":
pass
elif user == "cracklemovies":
pass
elif user == "ARTEplus7":
- addLink(cleanTitle(title), id, 'playArte', thumb.replace("\\",
""), user, desc, duration)
+ addLink(title, id, 'playArte', thumb.replace("\\", ""), user,
desc, duration, date, count)
+ count+=1
else:
- addLink(cleanTitle(title), id, 'playVideo', thumb.replace("\\",
""), user, desc, duration)
- match = re.compile('"page":(.+?),', re.DOTALL).findall(content)
- currentPage = int(match[0])
- nextPage = currentPage+1
- if '"has_more":true' in content:
+ addLink(title, id, 'playVideo', thumb.replace("\\", ""), user,
desc, duration, date, count)
+ count+=1
+ if content['has_more']:
+ currentPage = content['page']
+ nextPage = currentPage+1
addDir(translation(30001)+" ("+str(nextPage)+")",
url.replace("page="+str(currentPage), "page="+str(nextPage)), 'listVideos', "")
+ if forceViewModeNew:
+ xbmc.executebuiltin('Container.SetViewMode('+viewModeNew+')')
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
def listUsers(url):
content = getUrl(url)
- match =
re.compile('{"username":"(.+?)","avatar_large_url":"(.*?)","videos_total":(.+?),"views_total":(.+?)}',
re.DOTALL).findall(content)
- for user, thumb, videos, views in match:
- addUserDir(cleanTitle(user), 'owner:'+user, 'sortVideos1',
thumb.replace("\\", ""), "Views: "+views+"\nVideos: "+videos)
- match = re.compile('"page":(.+?),', re.DOTALL).findall(content)
- currentPage = int(match[0])
- nextPage = currentPage+1
- if '"has_more":true' in content:
+ content = json.loads(content)
+ for item in content['list']:
+ user = item['username'].encode('utf-8')
+ thumb = item['avatar_large_url']
+ videos = item['videos_total']
+ views = item['views_total']
+ addUserDir(user, 'owner:'+user, 'sortVideos1', thumb.replace("\\",
""), "Views: "+str(views)+"\nVideos: "+str(videos))
+ if content['has_more']:
+ currentPage = content['page']
+ nextPage = currentPage+1
addDir(translation(30001)+" ("+str(nextPage)+")",
url.replace("page="+str(currentPage), "page="+str(nextPage)), 'listUsers', "")
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
-def listLive():
- content =
getUrl("https://api.dailymotion.com/videos?fields=id,thumbnail_large_url%2Ctitle%2Cviews_last_hour&filters=live&sort=visited-hour&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language)
- match =
re.compile('\\{"id":"(.+?)","thumbnail_large_url":"(.+?)","title":"(.+?)","views_last_hour":(.+?)\\}',
re.DOTALL).findall(content)
- for id, thumb, title, views in match:
- addLiveLink(cleanTitle(title), id, 'playLiveVideo',
thumb.replace("\\", ""), views)
+def listLive(url):
+ content = getUrl(url)
+ content = json.loads(content)
+ for item in content['list']:
+ title = item['title'].encode('utf-8')
+ id = item['id']
+ thumb = item['thumbnail_large_url']
+ views = item['views_last_hour']
+ addLiveLink(title, id, 'playLiveVideo', thumb.replace("\\", ""), views)
+ if content['has_more']:
+ currentPage = content['page']
+ nextPage = currentPage+1
+ addDir(translation(30001)+" ("+str(nextPage)+")",
url.replace("page="+str(currentPage), "page="+str(nextPage)), 'listLive', "")
xbmcplugin.endOfDirectory(pluginhandle)
- if forceViewMode:
- xbmc.executebuiltin('Container.SetViewMode('+viewMode+')')
+ if forceViewModeNew:
+ xbmc.executebuiltin('Container.SetViewMode('+viewModeNew+')')
def search():
@@ -236,7 +253,7 @@ def search():
keyboard.doModal()
if keyboard.isConfirmed() and keyboard.getText():
search_string = keyboard.getText().replace(" ", "+")
-
listVideos("https://api.dailymotion.com/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&search="+search_string+"&sort=relevance&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1")
+
listVideos(urlMain+"/videos?fields=description,duration,id,owner.username,taken_time,thumbnail_large_url,title,views_total&search="+search_string+"&sort=relevance&limit="+itemsPerPage+"&family_filter="+familyFilter+"&localization="+language+"&page=1")
def playVideo(id):
@@ -247,7 +264,7 @@ def playVideo(id):
def getStreamUrl(id):
content = getUrl2("http://www.dailymotion.com/embed/video/"+id)
if content.find('"statusCode":410') > 0 or
content.find('"statusCode":403') > 0:
-
xbmc.executebuiltin('XBMC.Notification(Info:,'+str(translation(30022))+'
(DailyMotion)!,5000)')
+ xbmc.executebuiltin('XBMC.Notification(Info:,'+translation(30022)+'
(DailyMotion)!,5000)')
return ""
else:
matchFullHD = re.compile('"stream_h264_hd1080_url":"(.+?)"',
re.DOTALL).findall(content)
@@ -265,14 +282,14 @@ def getStreamUrl(id):
elif matchSD:
url = urllib.unquote_plus(matchSD[0]).replace("\\", "")
elif matchLD:
- url = urllib.unquote_plus(matchSD2[0]).replace("\\", "")
+ url = urllib.unquote_plus(matchLD[0]).replace("\\", "")
return url
def playLiveVideo(id):
content = getUrl2("http://www.dailymotion.com/sequence/"+id)
if content.find('"statusCode":410') > 0 or
content.find('"statusCode":403') > 0:
-
xbmc.executebuiltin('XBMC.Notification(Info:,'+str(translation(30022))+'
(DailyMotion)!,5000)')
+ xbmc.executebuiltin('XBMC.Notification(Info:,'+translation(30022)+'
(DailyMotion)!,5000)')
else:
matchFullHD = re.compile('"hd1080URL":"(.+?)"',
re.DOTALL).findall(content)
matchHD = re.compile('"hd720URL":"(.+?)"', re.DOTALL).findall(content)
@@ -302,6 +319,29 @@ def queueVideo(url, name):
playlist.add(url, listitem)
+def downloadVideo(id):
+ downloader = SimpleDownloader.SimpleDownloader()
+ content = getUrl2("http://www.dailymotion.com/embed/video/"+id)
+ match = re.compile('<title>(.+?)</title>', re.DOTALL).findall(content)
+ global downloadDir
+ while not downloadDir:
+
xbmc.executebuiltin('XBMC.Notification(Download:,'+translation(30110)+'!,5000)')
+ addon.openSettings()
+ downloadDir = addon.getSetting("downloadDir")
+ url = getStreamUrl(id)
+ filename = ""
+ try:
+ filename = (''.join(c for c in unicode(match[0], 'utf-8') if c not in
'/\\:?"*|<>')).strip()
+ except:
+ filename = id
+ filename+=".mp4"
+ if not os.path.exists(os.path.join(downloadDir, filename)):
+ params = { "url": url, "download_path": downloadDir }
+ downloader.download(filename, params)
+ else:
+
xbmc.executebuiltin('XBMC.Notification(Download:,'+translation(30109)+'!,5000)')
+
+
def playArte(id):
try:
content = getUrl("http://www.dailymotion.com/video/"+id)
@@ -326,7 +366,7 @@ def playArte(id):
listitem = xbmcgui.ListItem(path=base+" playpath="+playpath+" swfVfy=1
swfUrl=http://videos.arte.tv/blob/web/i18n/view/player_24-3188338-data-5168030.swf")
xbmcplugin.setResolvedUrl(pluginhandle, True, listitem)
except:
-
xbmc.executebuiltin('XBMC.Notification(Info:,'+str(translation(30022))+'
(Arte)!,5000)')
+ xbmc.executebuiltin('XBMC.Notification(Info:,'+translation(30022)+'
(Arte)!,5000)')
def addFav():
@@ -347,7 +387,7 @@ def addFav():
fh = open(channelFavsFile, 'a')
fh.write(channelEntry+"\n")
fh.close()
-
xbmc.executebuiltin('XBMC.Notification(Info:,'+str(translation(30030))+'!,5000)')
+
xbmc.executebuiltin('XBMC.Notification(Info:,'+translation(30030)+'!,5000)')
def favourites(param):
@@ -367,7 +407,7 @@ def favourites(param):
fh = open(channelFavsFile, 'a')
fh.write(channelEntry+"\n")
fh.close()
-
xbmc.executebuiltin('XBMC.Notification(Info:,'+str(translation(30030))+'!,5000)')
+
xbmc.executebuiltin('XBMC.Notification(Info:,'+translation(30030)+'!,5000)')
elif mode == "REMOVE":
refresh = param[param.find("###REFRESH###=")+14:]
refresh = refresh[:refresh.find("###USER###=")]
@@ -382,21 +422,8 @@ def favourites(param):
xbmc.executebuiltin("Container.Refresh")
-def cleanTitle(title):
- #test = u"\u00a1\u00a1\u00a1\u00a1\u00a1".encode('utf8')
- #title = unicode(title)
- #title = u"%s" % (title)
- #title = title.encode('utf-8')
- title = decodeUnicode(title)
- title = title.replace("\\", "").strip()
- return title
-
-
-def decodeUnicode(content):
- uc = {"\u00a0": " ", "\u00a1": "¡", "\u00a2": "¢", "\u00a3": "£",
"\u00a4": "¤", "\u00a5": "¥", "\u00a6": "¦", "\u00a7": "§", "\u00a9": "©",
"\u00aa": "ª", "\u00ab": "«", "\u00ac": "¬", "\u00ae": "®", "\u00b0": "°",
"\u00b1": "±", "\u00b2": "²", "\u00b3": "³", "\u00b5": "µ", "\u00b6": "¶",
"\u00b7": "·", "\u00b8": "¸", "\u00b9": "¹", "\u00ba": "º", "\u00bb": "»",
"\u00bc": "¼", "\u00bd": "½", "\u00be": "¾", "\u00bf": "¿", "\u00c0": "Ã",
"\u00c1": "Ã", "\u00c2": "Ã", "\u00c3": "Ã", "\u00c4": "Ã", "\u00c5": "Ã
",
"\u00c6": "Ã", "\u00c7": "Ã", "\u00c8": "Ã", "\u00c9": "Ã", "\u00ca": "Ã",
"\u00cb": "Ã", "\u00cc": "Ã", "\u00cd": "Ã", "\u00ce": "Ã", "\u00cf": "Ã",
"\u00d0": "Ã", "\u00d1": "Ã", "\u00d2": "Ã", "\u00d3": "Ã", "\u00d4": "Ã",
"\u00d5": "Ã", "\u00d6": "Ã", "\u00d7": "Ã", "\u00d8": "Ã", "\u00d9": "Ã",
"\u00da": "Ã", "\u00db": "Ã", "\u00dc": "Ã", "\u00dd": "Ã", "\u00de": "Ã",
"\u00df": "Ã", "\u00e0": "Ã ", "\u00e1": "
á", "\u00e2": "â", "\u00e3": "ã", "\u00e4": "ä", "\u00e5": "å", "\u00e6":
"æ", "\u00e7": "ç", "\u00e8": "è", "\u00e9": "é", "\u00ea": "ê", "\u00eb":
"ë", "\u00ec": "ì", "\u00ed": "Ã", "\u00ee": "î", "\u00ef": "ï", "\u00f0":
"ð", "\u00f1": "ñ", "\u00f2": "ò", "\u00f3": "ó", "\u00f4": "ô", "\u00f5":
"õ", "\u00f6": "ö", "\u00f7": "÷", "\u00f8": "ø", "\u00f9": "ù", "\u00fa":
"ú", "\u00fb": "û", "\u00fc": "ü", "\u00fd": "ý", "\u00fe": "þ", "\u00ff":
"ÿ", "\u0100": "Ä", "\u0101": "Ä", "\u0102": "Ä", "\u0103": "Ä", "\u0104":
"Ä", "\u0105": "Ä
", "\u0106": "Ä", "\u0107": "Ä", "\u0108": "Ä", "\u0109":
"Ä", "\u010c": "Ä", "\u010d": "Ä", "\u010e": "Ä", "\u010f": "Ä", "\u0110":
"Ä", "\u0111": "Ä", "\u0112": "Ä", "\u0113": "Ä", "\u0114": "Ä", "\u0115":
"Ä", "\u0118": "Ä", "\u0119": "Ä", "\u011a": "Ä", "\u011b": "Ä", "\u011c":
"Ä", "\u011d": "Ä", "\u011e": "Ä", "\u011f": "Ä", "\u0122": "Ä¢", "\u0123":
"ģ", "\u0124": "Ĥ", "\u0125": "ĥ",
"\u0126": "Ħ", "\u0127": "ħ", "\u0128": "Ĩ", "\u0129": "ĩ", "\u012a":
"Ī", "\u012b": "Ä«", "\u012c": "Ĭ", "\u012d": "Ä", "\u012e": "Ä®", "\u012f":
"į", "\u0131": "ı", "\u0134": "Ĵ", "\u0135": "ĵ", "\u0136": "Ķ", "\u0137":
"ķ", "\u0138": "ĸ", "\u0139": "Ĺ", "\u013a": "ĺ", "\u013b": "Ļ", "\u013c":
"ļ", "\u013d": "Ľ", "\u013e": "ľ", "\u0141": "Å", "\u0142": "Å", "\u0143":
"Å", "\u0144": "Å", "\u0145": "Å
",
"\u0146":"Å","\u0147":"Å","\u0148":"Å","\u014a":"Å","\u014b":"Å","\u014c":"Å","\u014d":"Å","\u014e":"Å","\u014f":"Å","\u0150":"Å","\u0151":"Å","\u0152":"Å","\u0153":"Å","\u0154":"Å","\u0155":"Å","\u0156":"Å","\u0157":"Å","\u0158":"Å","\u0159":"Å","\u015a":"Å","\u015b":"Å","\u015c":"Å","\u015d":"Å","\u015e":"Å","\u015f":"Å","\u0160":"Å
","\u0161":"Å¡","\u0162":"Å¢","\u0163":"Å£","\u0164":"Ť","\u0165":"Å¥","\u0166":"Ŧ","\u0167":"ŧ","\u0168":"Ũ","\u0169":"Å©","\u016a":"Ū","\u016b":"Å«","\u016c":"Ŭ","\u016d":"Å","\u016e":"Å®","\u01
6f":"ů","\u0170":"Ű","\u0171":"ű","\u0172":"Ų","\u0173":"ų","\u0174":"Å´","\u0175":"ŵ","\u0176":"Ŷ","\u0177":"Å·","\u0178":"Ÿ","\u0179":"Ź","\u017a":"ź","\u017d":"Ž","\u017e":"ž","\u017f":"Å¿","\u0180":"Æ","\u0197":"Æ","\u01b5":"Ƶ","\u01b6":"ƶ","\u01cd":"Ç","\u01ce":"Ç","\u01cf":"Ç","\u01d0":"Ç","\u01d1":"Ç","\u01d2":"Ç","\u01d3":"Ç","\u01d4":"Ç","\u01e4":"Ǥ","\u01e5":"Ç¥","\u01e6":"Ǧ","\u01e7":"ǧ","\u01e8":"Ǩ","\u01e9":"Ç©","\u01ea":"Ǫ","\u01eb":"Ç«","\u01f0":"ǰ","\u01f4":"Ç´","\u01f5":"ǵ","\u01f8":"Ǹ","\u01f9":"ǹ","\u021e":"È","\u021f":"È","\u0228":"Ȩ","\u0229":"È©","\u0232":"Ȳ","\u0233":"ȳ","\u0259":"É","\u0268":"ɨ","\u1e10":"á¸","\u1e11":"á¸","\u1e20":"á¸
","\u1e21":"ḡ","\u1e26":"Ḧ","\u1e27":"ḧ","\u1e28":"Ḩ","\u1e29":"ḩ","\u1e30":"Ḱ","\u1e31":"ḱ","\u1e3e":"Ḿ","\u1e3f":"ḿ","\u1e54":"á¹","\u1e55":"á¹","\u1e7c":"á¹¼","\u1e7d":"á¹½","\u1e80":"áº","\u1e81":"áº","\u1e82":"áº","\u1e83":"áº","\u1e84":"áº","\u1e85":"áº
",
"\u1e8c":"áº","\u1e8d":"áº","\u1e90":"áº","\u1e91":"áº","\u1e97":"áº","\u1e98":"áº","\u1e99":"áº","\u1ebc":"Ẽ","\u1ebd":"ẽ","\u1ef2":"Ỳ","\u1ef3":"ỳ","\u1ef8":"Ỹ","\u1ef9":"ỹ","\u2008":"â","\u2013":"â","\u2014":"â","\u2018":"â","\u2019":"â","\u201a":"â","\u201c":"â","\u201d":"â","\u201e":"â","\u2030":"â°","\u2039":"â¹","\u203a":"âº","\u2070":"â°","\u2071":"â±","\u2074":"â´","\u2075":"âµ","\u2076":"â¶","\u2077":"â·","\u2078":"â¸","\u2079":"â¹","\u207a":"âº","\u207c":"â¼","\u207d":"â½","\u207e":"â¾","\u207f":"â¿","\u2080":"â","\u2081":"â","\u2082":"â","\u2083":"â","\u2084":"â","\u2085":"â
","\u2086":"â","\u2087":"â","\u2088":"â","\u2089":"â","\u208a":"â","\u208c":"â","\u208d":"â","\u208e":"â","\u20a0":"â
","\u20a1":"â¡","\u20a2":"â¢","\u20a3":"â£","\u20a4":"â¤","\u20a5":"â¥","\u20a6":"â¦","\u20a7":"â§","\u20a8":"â¨","\u20a9":"â©","\u20ab":"â«","\u20ac":"â¬","\u2120":"â
","\u2122":"â¢","\u301d
":"ã","\u301e":"ã"}
- for key, value in uc.iteritems():
- content = content.replace(key, value)
- return content
+def translation(id):
+ return addon.getLocalizedString(id).encode('utf-8')
def getUrl(url):
@@ -433,17 +460,18 @@ def parameters_string_to_dict(parameters):
return paramDict
-def addLink(name, url, mode, iconimage, user, desc, duration):
+def addLink(name, url, mode, iconimage, user, desc, duration, date, nr):
u = sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)
ok = True
liz = xbmcgui.ListItem(name, iconImage="DefaultVideo.png",
thumbnailImage=iconimage)
- liz.setInfo(type="Video", infoLabels={"Title": name, "Plot": desc,
"Duration": duration})
+ liz.setInfo(type="Video", infoLabels={"Title": name, "Plot": desc,
"Aired": date, "Duration": duration, "Episode": nr})
liz.setProperty('IsPlayable', 'true')
entries = []
+ entries.append((translation(30044),
'RunPlugin(plugin://'+addonID+'/?mode=downloadVideo&url='+urllib.quote_plus(url)+')',))
+ entries.append((translation(30043),
'RunPlugin(plugin://'+addonID+'/?mode=queueVideo&url='+urllib.quote_plus(u)+'&name='+urllib.quote_plus(name)+')',))
if dmUser == "":
playListInfos =
"###MODE###=ADD###USER###="+user+"###THUMB###=DefaultVideo.png###END###"
entries.append((translation(30028),
'XBMC.RunPlugin(plugin://plugin.video.dailymotion_com/?mode=favourites&url='+urllib.quote_plus(playListInfos)+')',))
- entries.append((translation(30043),
'RunPlugin(plugin://'+addonID+'/?mode=queueVideo&url='+urllib.quote_plus(u)+'&name='+urllib.quote_plus(name)+')',))
liz.addContextMenuItems(entries)
ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u,
listitem=liz)
return ok
@@ -509,7 +537,7 @@ name = urllib.unquote_plus(params.get('name', ''))
if mode == 'listVideos':
listVideos(url)
elif mode == 'listLive':
- listLive()
+ listLive(url)
elif mode == 'listUsers':
listUsers(url)
elif mode == 'listChannels':
@@ -546,6 +574,8 @@ elif mode == 'playArte':
playArte(url)
elif mode == "queueVideo":
queueVideo(url, name)
+elif mode == "downloadVideo":
+ downloadVideo(url)
elif mode == 'search':
search()
else:
diff --git
a/plugin.video.dailymotion_com/resources/language/English/strings.xml
b/plugin.video.dailymotion_com/resources/language/English/strings.xml
index 0f46460..7a8673c 100644
--- a/plugin.video.dailymotion_com/resources/language/English/strings.xml
+++ b/plugin.video.dailymotion_com/resources/language/English/strings.xml
@@ -24,9 +24,9 @@
<string id="30022">Video not available</string>
<string id="30023">Added</string>
<string id="30024">Favourites</string>
- <string id="30028">Add user to favs</string>
- <string id="30029">Remove from addon favs</string>
- <string id="30030">Added user to favs</string>
+ <string id="30028">Add user to favourites</string>
+ <string id="30029">Remove from favourites</string>
+ <string id="30030">Added user to favourites</string>
<string id="30031">Are you over 18 and would like to turn off the family
filter?</string>
<string id="30032">Turn the family filter on?</string>
<string id="30033">Add user</string>
@@ -40,6 +40,7 @@
<string id="30041">Videos</string>
<string id="30042">Groups</string>
<string id="30043">Add to queue</string>
+ <string id="30044">Download video</string>
<string id="30101">Country</string>
<string id="30102">Force View</string>
<string id="30103">ViewID</string>
@@ -47,4 +48,7 @@
<string id="30105">Maximum resolution</string>
<string id="30106">Dailymotion Username</string>
<string id="30107">Items per page</string>
+ <string id="30108">Download directory</string>
+ <string id="30109">File already exists</string>
+ <string id="30110">Choose download directory</string>
</strings>
diff --git a/plugin.video.dailymotion_com/resources/language/German/strings.xml
b/plugin.video.dailymotion_com/resources/language/German/strings.xml
index ee217fc..6ea0676 100644
--- a/plugin.video.dailymotion_com/resources/language/German/strings.xml
+++ b/plugin.video.dailymotion_com/resources/language/German/strings.xml
@@ -3,12 +3,16 @@
<string id="30001">Nächste Seite</string>
<string id="30101">Land</string>
<string id="30023">Hinzugefuegt</string>
- <string id="30028">User zu Favs hinzufügen</string>
- <string id="30029">Aus Addon Favs entfernen</string>
- <string id="30030">User zu Favs hinzugefuegt</string>
+ <string id="30028">User zu Favoriten hinzufügen</string>
+ <string id="30029">Aus Favoriten entfernen</string>
+ <string id="30030">User zu Favoriten hinzugefuegt</string>
<string id="30033">User hinzufügen</string>
- <string id="30043">Zu Wiedergabeliste hinzufügen</string>
+ <string id="30043">In Abspielliste einreihen</string>
+ <string id="30044">Video runterladen</string>
<string id="30102">View erzwingen</string>
<string id="30105">Maximale Aufösung</string>
<string id="30107">Einträge pro Seite</string>
+ <string id="30108">Downloadverzeichnis</string>
+ <string id="30109">Datei existiert bereits</string>
+ <string id="30110">Downloadverzeichnis wählen</string>
</strings>
diff --git a/plugin.video.dailymotion_com/resources/settings.xml
b/plugin.video.dailymotion_com/resources/settings.xml
index d1909fc..cbe7951 100644
--- a/plugin.video.dailymotion_com/resources/settings.xml
+++ b/plugin.video.dailymotion_com/resources/settings.xml
@@ -2,7 +2,8 @@
<setting id="dmUser" type="text" label="30106" default=""/>
<setting id="itemsPerPage" type="enum" label="30107" values="25|50|75|100"
default="1"/>
<setting id="maxVideoQuality" type="enum" label="30105"
values="480p|720p|1080p" default="1"/>
+ <setting id="downloadDir" type="folder" label="30108" default=""/>
<setting id="language" type="enum" label="30101"
values="International|Argentina|Australia|Belgique (FR)|Belgie
(NL)|Brasil|Canada (English)|Canada (Francais)|Deutschland|Espana (ES)|Espana
(CA)|Greece|France|India|Ireland|Italia|Mexico|Maroc|Nederland|Oesterreich|Polska|Portugal|Russia|Romania|Suisse
(FR)|Schweiz (DE)|Svizzera (IT)|Tunisie|Türkiye|United Kingdom|United
States|Viet Nam|Japan|China" default="0"/>
- <setting id="forceViewMode" type="bool" label="30102" default="false"/>
- <setting id="viewMode" type="number" label="30103" default="500"/>
+ <setting id="forceViewModeNew" type="bool" label="30102" default="true"/>
+ <setting id="viewModeNew" type="number" label="30103" default="504"/>
</settings>
-----------------------------------------------------------------------
Summary of changes:
plugin.video.dailymotion_com/addon.xml | 3 +-
plugin.video.dailymotion_com/changelog.txt | 5 +
plugin.video.dailymotion_com/default.py | 248 +++++++++++---------
.../resources/language/English/strings.xml | 10 +-
.../resources/language/German/strings.xml | 12 +-
.../resources/settings.xml | 5 +-
6 files changed, 164 insertions(+), 119 deletions(-)
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
Learn the latest--Visual Studio 2012, SharePoint 2013, SQL 2012, more!
Discover the easy way to master current and previous Microsoft technologies
and advance your career. Get an incredible 1,500+ hours of step-by-step
tutorial videos with LearnDevNow. Subscribe today and save!
http://pubads.g.doubleclick.net/gampad/clk?id=58040911&iu=/4140/ostg.clktrk
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons