summaryrefslogtreecommitdiff
path: root/plugin.video.wakanim
diff options
context:
space:
mode:
authorMrKrabat <MrKrabat@users.noreply.github.com>2017-10-12 14:29:33 +0200
committerMrKrabat <MrKrabat@users.noreply.github.com>2017-10-20 20:46:29 +0200
commit31c3f02f2687b4b47d0b0fd6d336ab59df21b5be (patch)
treec4b7715717fd0cfbc6bed88e36bea401089299fa /plugin.video.wakanim
parentf9a09137e968901c8bc5995f10212c1c2bac26e2 (diff)
[plugin.video.wakanim] v0.5.0
Diffstat (limited to 'plugin.video.wakanim')
-rw-r--r--plugin.video.wakanim/README.md11
-rw-r--r--plugin.video.wakanim/addon.xml7
-rw-r--r--plugin.video.wakanim/changelog.txt16
-rw-r--r--plugin.video.wakanim/resources/language/resource.language.de_de/strings.po34
-rw-r--r--plugin.video.wakanim/resources/language/resource.language.en_gb/strings.po32
-rw-r--r--plugin.video.wakanim/resources/language/resource.language.fr_fr/strings.po36
-rw-r--r--plugin.video.wakanim/resources/lib/cmdargs.py30
-rw-r--r--plugin.video.wakanim/resources/lib/login.py1
-rw-r--r--plugin.video.wakanim/resources/lib/netapi.py187
-rw-r--r--plugin.video.wakanim/resources/lib/view.py165
-rw-r--r--plugin.video.wakanim/resources/lib/wakanim.py25
-rw-r--r--plugin.video.wakanim/resources/media/screenshot-01.jpgbin0 -> 361928 bytes
-rw-r--r--plugin.video.wakanim/resources/media/screenshot-02.jpgbin0 -> 410309 bytes
-rw-r--r--plugin.video.wakanim/resources/media/screenshot-03.jpgbin0 -> 469164 bytes
-rw-r--r--plugin.video.wakanim/resources/settings.xml2
15 files changed, 245 insertions, 301 deletions
diff --git a/plugin.video.wakanim/README.md b/plugin.video.wakanim/README.md
index b6aa249..ea4a596 100644
--- a/plugin.video.wakanim/README.md
+++ b/plugin.video.wakanim/README.md
@@ -25,18 +25,15 @@ What this plugin currently can do:
- [x] Supports Wakanim France, Germany and Nordic
- [x] Login with your account
- [x] Search for animes
-- [x] Show "My Downloads" (untested)
-- [x] Show "My Collection" (untested)
+- [x] Show "My Downloads"
+- [x] Show "My Collection"
- [x] Show/browse all available anime
- [x] Show/browse all seasons/arcs of an anime
- [x] Show/browse all episodes of an season/arc
- [x] Display various informations (Kodi displays not all we provide)
+- [x] Reactivate videos/streams
+- [x] Watch videos you have bought
- [x] Watch videos with premium subscription
-
-What is planned for the future:
-- [ ] Watch videos you have bought (deactivated, untested)
-- [ ] Select video resolution (only for videos you bought, streams are adaptive)
-
***
_This website and addon is not affiliated with Wakanim._
diff --git a/plugin.video.wakanim/addon.xml b/plugin.video.wakanim/addon.xml
index c876a46..77ef39f 100644
--- a/plugin.video.wakanim/addon.xml
+++ b/plugin.video.wakanim/addon.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.wakanim" name="Wakanim" version="0.3.0" provider-name="MrKrabat">
+<addon id="plugin.video.wakanim" name="Wakanim" version="0.5.0" provider-name="MrKrabat">
<requires>
<import addon="xbmc.python" version="2.25.0"/>
<import addon="script.module.beautifulsoup4" version="4.3.2"/>
@@ -19,7 +19,7 @@
<disclaimer lang="en_GB">WARNING: You MUST be a PREMIUM member or BUY videos to use this plugin</disclaimer>
<disclaimer lang="de_DE">HINWEIS: Du MUSST PREMIUM Mitglied sein oder Videos KAUFEN um dieses Plugin zu benutzen</disclaimer>
<disclaimer lang="fr_FR">AVERTISSEMENT: VOUS DEVEZ être un membre PREMIUM ou ACHETER des vidéos pour utiliser ce plugin</disclaimer>
- <news>v0.3.0 (2017.10.03)[CR]- Added nordic support</news>
+ <news>v0.5.0 (2017.10.10)[CR]- Removed internal server redirect</news>
<license>GNU Affero General Public License, v3</license>
<forum>https://www.kodinerds.net/index.php/Thread/58348-Release-Wakanim-tv/</forum>
<website>https://www.wakanim.tv/</website>
@@ -28,6 +28,9 @@
<assets>
<icon>icon.png</icon>
<fanart>fanart.jpg</fanart>
+ <screenshot>resources/media/screenshot-01.jpg</screenshot>
+ <screenshot>resources/media/screenshot-02.jpg</screenshot>
+ <screenshot>resources/media/screenshot-03.jpg</screenshot>
</assets>
</extension>
</addon>
diff --git a/plugin.video.wakanim/changelog.txt b/plugin.video.wakanim/changelog.txt
index 7e52415..f879a30 100644
--- a/plugin.video.wakanim/changelog.txt
+++ b/plugin.video.wakanim/changelog.txt
@@ -1,3 +1,19 @@
+v0.5.0 (2017.10.10)
+- Removed internal server redirect
+
+v0.4.0 (2017.10.10)
+- Added screenshots
+- Small optimations
+- Internal rewrites
+- Fixed possible encoding problem
+
+v0.3.2 (2017.10.08)
+- Fix playback not possible due security changes
+- Fix playback bought videos
+
+v0.3.1 (2017.10.07)
+- Cleanup of never implemented feature
+
v0.3.0 (2017.10.03)
- Added nordic support
diff --git a/plugin.video.wakanim/resources/language/resource.language.de_de/strings.po b/plugin.video.wakanim/resources/language/resource.language.de_de/strings.po
index 98aab0a..16fcfd2 100644
--- a/plugin.video.wakanim/resources/language/resource.language.de_de/strings.po
+++ b/plugin.video.wakanim/resources/language/resource.language.de_de/strings.po
@@ -24,26 +24,6 @@ msgctxt "#30002"
msgid "Password"
msgstr "Passwort"
-msgctxt "#30003"
-msgid "Video quality"
-msgstr "Video Qualität"
-
-msgctxt "#30004"
-msgid "720p (HD)"
-msgstr "720p (HD)"
-
-msgctxt "#30005"
-msgid "1080p (FullHD)"
-msgstr "1080p (FullHD)"
-
-msgctxt "#30006"
-msgid "1440p (QHD 2K)"
-msgstr "1440p (QHD 2K)"
-
-msgctxt "#30007"
-msgid "2160p (UDH 4K)"
-msgstr "2160p (UDH 4K)"
-
msgctxt "#30010"
msgid "Region"
msgstr "Region"
@@ -79,6 +59,10 @@ msgctxt "#30023"
msgid "My collection"
msgstr "Meine Sammlung"
+msgctxt "#30024"
+msgid "Watch trailer"
+msgstr "Trailer ansehen"
+
# Wakanim Messages
@@ -90,10 +74,14 @@ msgctxt "#30041"
msgid "An error occurred"
msgstr "Ein Fehler ist aufgetreten"
+msgctxt "#30042"
+msgid "Reactivation failed of this video"
+msgstr "Reaktivierung fehlgeschlagen dieses Videos"
+
msgctxt "#30043"
-msgid "You need to be premium or own this video"
+msgid "You need to be a premium member or own this video"
msgstr "Du musst premium nutzer sein oder das Video gekauft haben"
msgctxt "#30044"
-msgid "Failed to play video or stream"
-msgstr "Fehlgeschlagen das Video oder den Stream abzuspielen"
+msgid "Failed to play video"
+msgstr "Fehlgeschlagen das Video abzuspielen"
diff --git a/plugin.video.wakanim/resources/language/resource.language.en_gb/strings.po b/plugin.video.wakanim/resources/language/resource.language.en_gb/strings.po
index 89aae68..cdff971 100644
--- a/plugin.video.wakanim/resources/language/resource.language.en_gb/strings.po
+++ b/plugin.video.wakanim/resources/language/resource.language.en_gb/strings.po
@@ -24,26 +24,6 @@ msgctxt "#30002"
msgid "Password"
msgstr ""
-msgctxt "#30003"
-msgid "Video quality"
-msgstr ""
-
-msgctxt "#30004"
-msgid "720p (HD)"
-msgstr ""
-
-msgctxt "#30005"
-msgid "1080p (FullHD)"
-msgstr ""
-
-msgctxt "#30006"
-msgid "1440p (QHD 2K)"
-msgstr ""
-
-msgctxt "#30007"
-msgid "2160p (UDH 4K)"
-msgstr ""
-
msgctxt "#30010"
msgid "Region"
msgstr ""
@@ -60,6 +40,10 @@ msgctxt "#30013"
msgid "Sweden, Norway, Iceland, Finland, Denmark"
msgstr ""
+msgctxt "#30024"
+msgid "Watch trailer"
+msgstr ""
+
# Wakanim Menue
@@ -90,10 +74,14 @@ msgctxt "#30041"
msgid "An error occurred"
msgstr ""
+msgctxt "#30042"
+msgid "Reactivation failed of this video"
+msgstr ""
+
msgctxt "#30043"
-msgid "You need to be premium or own this video"
+msgid "You need to be a premium member or own this video"
msgstr ""
msgctxt "#30044"
-msgid "Failed to play video or stream"
+msgid "Failed to play video"
msgstr ""
diff --git a/plugin.video.wakanim/resources/language/resource.language.fr_fr/strings.po b/plugin.video.wakanim/resources/language/resource.language.fr_fr/strings.po
index 15d0e24..a9d0ba3 100644
--- a/plugin.video.wakanim/resources/language/resource.language.fr_fr/strings.po
+++ b/plugin.video.wakanim/resources/language/resource.language.fr_fr/strings.po
@@ -24,26 +24,6 @@ msgctxt "#30002"
msgid "Password"
msgstr "Mot de passe"
-msgctxt "#30003"
-msgid "Video quality"
-msgstr "Qualité vidéo"
-
-msgctxt "#30004"
-msgid "720p (HD)"
-msgstr "720p (HD)"
-
-msgctxt "#30005"
-msgid "1080p (FullHD)"
-msgstr "1080p (FullHD)"
-
-msgctxt "#30006"
-msgid "1440p (QHD 2K)"
-msgstr "1440p (QHD 2K)"
-
-msgctxt "#30007"
-msgid "2160p (UDH 4K)"
-msgstr "2160p (UDH 4K)"
-
msgctxt "#30010"
msgid "Region"
msgstr "Région"
@@ -79,6 +59,10 @@ msgctxt "#30023"
msgid "My collection"
msgstr "Ma collection"
+msgctxt "#30024"
+msgid "Watch trailer"
+msgstr "Regarde la bande-annonce"
+
# Wakanim Messages
@@ -90,10 +74,14 @@ msgctxt "#30041"
msgid "An error occurred"
msgstr "Une erreur s'est produite"
+msgctxt "#30042"
+msgid "Reactivation failed of this video"
+msgstr "La réactivation a échoué de cette vidéo"
+
msgctxt "#30043"
-msgid "You need to be premium or own this video"
-msgstr "Vous devez être premium ou posséder cette vidéo"
+msgid "You need to be a premium member or own this video"
+msgstr "Vous devez être un membre premium ou posséder cette vidéo"
msgctxt "#30044"
-msgid "Failed to play video or stream"
-msgstr "Impossible de lire de la vidéo ou du flux"
+msgid "Failed to play video"
+msgstr "Impossible de lire de la vidéo"
diff --git a/plugin.video.wakanim/resources/lib/cmdargs.py b/plugin.video.wakanim/resources/lib/cmdargs.py
index fbd358e..9a0ac61 100644
--- a/plugin.video.wakanim/resources/lib/cmdargs.py
+++ b/plugin.video.wakanim/resources/lib/cmdargs.py
@@ -17,33 +17,26 @@
import sys
import urllib
+import urlparse
-def parse_args():
- """Decode arguments.
+def parse():
+ """Decode arguments
"""
if (sys.argv[2]):
- return Args(**dict([p.split("=")
- for p in sys.argv[2][1:].split("&")]))
-
+ return Args(urlparse.parse_qs(sys.argv[2][1:]))
else:
- # Args will turn the "None" into None.
- # Don't simply define it as None because unquote_plus in updateArgs
- # will throw an exception.
- # This is a pretty ugly solution.
- return Args(mode = "None",
- url = "None",
- name = "None")
+ return Args({})
class Args(object):
- """Arguments class.
+ """Arguments class
Hold all arguments passed to the script and also persistent user data and
reference to the addon. It is intended to hold all data necessary for the
script.
"""
- def __init__(self, *args, **kwargs):
- """Initialize arguments object.
+ def __init__(self, kwargs):
+ """Initialize arguments object
Hold also references to the addon which can't be kept at module level.
"""
self._addon = sys.modules["__main__"]._addon
@@ -52,8 +45,7 @@ class Args(object):
self._cj = None
for key, value in kwargs.iteritems():
- if value == "None":
- kwargs[key] = None
- else:
- kwargs[key] = urllib.unquote_plus(kwargs[key])
+ if value:
+ kwargs[key] = urllib.unquote_plus(value[0])
+
self.__dict__.update(kwargs)
diff --git a/plugin.video.wakanim/resources/lib/login.py b/plugin.video.wakanim/resources/lib/login.py
index b5920ea..4d92a54 100644
--- a/plugin.video.wakanim/resources/lib/login.py
+++ b/plugin.video.wakanim/resources/lib/login.py
@@ -40,6 +40,7 @@ def login(username, password, args):
# lets urllib2 handle cookies
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36")]
+ opener.addheaders = [("Accept-Charset", "utf-8")]
urllib2.install_opener(opener)
# check if session exists
diff --git a/plugin.video.wakanim/resources/lib/netapi.py b/plugin.video.wakanim/resources/lib/netapi.py
index 32804c5..334279a 100644
--- a/plugin.video.wakanim/resources/lib/netapi.py
+++ b/plugin.video.wakanim/resources/lib/netapi.py
@@ -16,12 +16,14 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import re
+import sys
import urllib
import urllib2
from bs4 import BeautifulSoup
import xbmc
import xbmcgui
+import xbmcplugin
import login
import view
@@ -45,19 +47,17 @@ def showCatalog(args):
thumb = "https:" + thumb
view.add_item(args,
- {"url": li.a["href"],
- "title": li.find("div", {"class": "slider_item_description"}).span.strong.string.encode("utf-8"),
- "mode": "list_season",
- "thumb": thumb,
- "fanart_image": thumb,
- "episode": li.find("p", {"class": "tooltip_text"}).strong.string.split(" ")[0],
- "season": li.find("span", {"class": "tooltip_season"}).string.split(" ")[0],
- "rating": str(10 - len(star) * 2),
- "plot": plot.contents[3].string.strip().encode("utf-8"),
- "year": li.time.string},
+ {"url": li.a["href"],
+ "title": li.find("div", {"class": "slider_item_description"}).span.strong.string.strip().encode("utf-8"),
+ "tvshowtitle": li.find("div", {"class": "slider_item_description"}).span.strong.string.strip().encode("utf-8"),
+ "mode": "list_season",
+ "thumb": thumb,
+ "fanart": thumb,
+ "rating": str(10 - len(star) * 2),
+ "plot": plot.contents[3].string.strip().encode("utf-8"),
+ "year": li.time.string.strip().encode("utf-8")},
isFolder=True, mediatype="video")
-
view.endofdirectory()
@@ -87,19 +87,16 @@ def searchAnime(args):
thumb = "https:" + thumb
view.add_item(args,
- {"url": li.a["href"],
- "title": li.find("div", {"class": "slider_item_description"}).span.strong.string.encode("utf-8"),
- "mode": "list_season",
- "thumb": thumb,
- "fanart_image": thumb,
- "episode": li.find("p", {"class": "tooltip_text"}).strong.string.split(" ")[0],
- "season": li.find("span", {"class": "tooltip_season"}).string.split(" ")[0],
- "rating": str(10 - len(star)*2),
- "plot": plot.contents[3].string.strip().encode("utf-8"),
- "year": li.time.string},
+ {"url": li.a["href"],
+ "title": li.find("div", {"class": "slider_item_description"}).span.strong.string.strip().encode("utf-8"),
+ "mode": "list_season",
+ "thumb": thumb,
+ "fanart": thumb,
+ "rating": str(10 - len(star) * 2),
+ "plot": plot.contents[3].string.strip().encode("utf-8"),
+ "year": li.time.string.strip().encode("utf-8")},
isFolder=True, mediatype="video")
-
view.endofdirectory()
@@ -122,14 +119,13 @@ def myDownloads(args):
thumb = "https:" + thumb
view.add_item(args,
- {"url": div.a["href"].replace("mydownloads/detail", "catalogue/show"),
- "title": div.find("h3", {"class": "big-item_title"}).string.strip().encode("utf-8"),
- "mode": "list_season",
- "thumb": thumb,
- "fanart_image": thumb},
+ {"url": div.a["href"].replace("mydownloads/detail", "catalogue/show"),
+ "title": div.find("h3", {"class": "big-item_title"}).string.strip().encode("utf-8"),
+ "mode": "list_season",
+ "thumb": thumb,
+ "fanart": thumb},
isFolder=True, mediatype="video")
-
view.endofdirectory()
@@ -151,14 +147,13 @@ def myCollection(args):
thumb = "https:" + thumb
view.add_item(args,
- {"url": div.a["href"].replace("collection/detail", "catalogue/show"),
- "title": div.find("h3", {"class": "big-item_title"}).string.strip().encode("utf-8"),
- "mode": "list_season",
- "thumb": thumb,
- "fanart_image": thumb},
+ {"url": div.a["href"].replace("collection/detail", "catalogue/show"),
+ "title": div.find("h3", {"class": "big-item_title"}).string.strip().encode("utf-8"),
+ "mode": "list_season",
+ "thumb": thumb,
+ "fanart": thumb},
isFolder=True, mediatype="video")
-
view.endofdirectory()
@@ -170,25 +165,47 @@ def listSeason(args):
soup = BeautifulSoup(html, "html.parser")
+ date = soup.find_all("span", {"class": "border-list_text"})[0].find_all("span")
+ year = date[2].string.strip().encode("utf-8")
+ date = year + "-" + date[1].string.strip().encode("utf-8") + "-" + date[0].string.strip().encode("utf-8")
+ originaltitle = soup.find_all("span", {"class": "border-list_text"})[1].string.strip().encode("utf-8")
+ plot = soup.find("div", {"class": "serie_description"}).string.strip().encode("utf-8")
+ credits = soup.find("div", {"class": "serie_description_more"}).p.string.strip().encode("utf-8")
+ trailer = soup.find("div", {"class": "TrailerEp-iframeWrapperRatio"})
+ try:
+ trailer = trailer.iframe["src"]
+ trailer = "plugin://plugin.video.youtube/play/?video_id=" + re.search(r"(?:\.be/|/embed)/?([^&=%:/\?]{11})", trailer).group(1)
+ view.add_item(args,
+ {"url": trailer,
+ "mode": "trailer",
+ "thumb": args.thumb.replace(" ", "%20"),
+ "fanart": args.fanart.replace(" ", "%20"),
+ "title": args._addon.getLocalizedString(30024)},
+ isFolder=False, mediatype="video")
+ except AttributeError:
+ trailer = ""
+
for section in soup.find_all("h2", {"class": "slider-section_title"}):
if not section.span:
continue
title = section.get_text()[6:].strip()
view.add_item(args,
- {"url": args.url,
- "title": title.encode("utf-8"),
- "mode": "list_episodes",
- "season": title.encode("utf-8"),
- "thumb": args.icon,
- "fanart_image": args.fanart,
- "episode": args.episode,
- "rating": args.rating,
- "plot": args.plot,
- "year": args.year},
+ {"url": args.url,
+ "title": title.encode("utf-8"),
+ "mode": "list_episodes",
+ "thumb": args.thumb.replace(" ", "%20"),
+ "fanart": args.fanart.replace(" ", "%20"),
+ "season": title.encode("utf-8"),
+ "plot": plot,
+ "plotoutline": getattr(args, "plot", ""),
+ "year": year,
+ "premiered": date,
+ "trailer": trailer,
+ "originaltitle": originaltitle,
+ "credits": credits},
isFolder=True, mediatype="video")
-
view.endofdirectory()
@@ -200,7 +217,7 @@ def listEpisodes(args):
soup = BeautifulSoup(html, "html.parser")
- for season in soup.findAll(text=args.season):
+ for season in soup.findAll(text=args.title):
parent = season.find_parent("li")
if not parent:
continue
@@ -210,18 +227,13 @@ def listEpisodes(args):
thumb = "https:" + thumb
view.add_item(args,
- {"url": parent.a["href"],
- "title": parent.img["alt"].encode("utf-8"),
- "mode": "videoplay",
- "thumb": thumb,
- "fanart_image": args.fanart,
- "episode": args.episode,
- "rating": args.rating,
- "plot": args.plot,
- "year": args.year},
+ {"url": parent.a["href"],
+ "title": parent.img["alt"].encode("utf-8"),
+ "mode": "videoplay",
+ "thumb": args.thumb.replace(" ", "%20"),
+ "fanart": args.fanart.replace(" ", "%20")},
isFolder=False, mediatype="video")
-
view.endofdirectory()
@@ -239,36 +251,28 @@ def startplayback(args):
xbmcgui.Dialog().ok(args._addonname, args._addon.getLocalizedString(30043))
return
- # prefer using download able videos
- if "episode_download_buttons" in html and 1==0: # TODO
- """
- div = soup.find("div", {"class": "episode_download_buttons"})
- if div:
- for file in reversed(div.find_all("a")):
- try:
- url = "https://www.wakanim.tv" + file["href"] + login.getCookie(args)
- item = xbmcgui.ListItem(args.name, path=url)
- item.setInfo(type="Video", infoLabels={"Title": args.name,
- "TVShowTitle": args.name,
- "episode": args.episode,
- "rating": args.rating,
- "plot": args.plot,
- "year": args.year,
- "studio": args.studio})
- item.setThumbnailImage(args.icon)
- xbmc.Player().play(url, item)
- return
- except:
- pass
- else:
- xbmc.log("[PLUGIN] %s: Failed to play video" % args._addonname, xbmc.LOGERROR)
- xbmcgui.Dialog().ok(args._addonname, args._addon.getLocalizedString(30044))
- """
+ # check if we have to reactivate video
+ if "reactivate" in html:
+ # reactivate video
+ a = soup.find("div", {"id": "jwplayer-container"}).a["href"]
+ response = urllib2.urlopen("https://www.wakanim.tv" + a)
+ html = response.read()
+
+ # reload page
+ response = urllib2.urlopen("https://www.wakanim.tv" + args.url)
+ html = response.read()
+ soup = BeautifulSoup(html, "html.parser")
+
+ # check if successfull
+ if "reactivate" in html:
+ xbmc.log("[PLUGIN] %s: Reactivation failed '%s'" % (args._addonname, args.url), xbmc.LOGERROR)
+ xbmcgui.Dialog().ok(args._addonname, args._addon.getLocalizedString(30042))
+ return
- # using stream with hls
- elif ("Unser Player ist in der Beta-Phase. Klicke hier, um den alten Player zu benutzen" in html) or ("Changer de lecteur" in html) or ("Our player is in beta, click here to go back to the old one" in html):
+ # using stream with hls+aes
+ if ("Unser Player ist in der Beta-Phase. Klicke hier, um den alten Player zu benutzen" in html) or ("Changer de lecteur" in html) or ("Our player is in beta, click here to go back to the old one" in html):
# streaming is only for premium subscription
- if ("<span>Kostenlos</span>" in html) or ("<span>Gratuit</span>" in html) or ("<span>Free</span>" in html):
+ if (("<span>Kostenlos</span>" in html) or ("<span>Gratuit</span>" in html) or ("<span>Free</span>" in html)) and not ("episode_premium_title" in html):
xbmc.log("[PLUGIN] %s: You need to own this video or be a premium member '%s'" % (args._addonname, args.url), xbmc.LOGERROR)
xbmcgui.Dialog().ok(args._addonname, args._addon.getLocalizedString(30043))
return
@@ -278,19 +282,14 @@ def startplayback(args):
matches = re.search(regex, html).group(1)
if matches:
- # file url
+ # manifest url
url = "https://www.wakanim.tv" + matches
# play stream
- item = xbmcgui.ListItem(args.name, path=url + login.getCookie(args))
- item.setInfo(type="Video", infoLabels={"Title": args.name,
- "TVShowTitle": args.name,
- "episode": args.episode,
- "rating": args.rating,
- "plot": args.plot,
- "year": args.year})
- item.setThumbnailImage(args.icon)
- xbmc.Player().play(url + login.getCookie(args), item)
+ item = xbmcgui.ListItem(getattr(args, "title", "Title not provided"), path=url + login.getCookie(args))
+ item.setMimeType("application/vnd.apple.mpegurl")
+ item.setContentLookup(False)
+ xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
else:
xbmc.log("[PLUGIN] %s: Failed to play stream" % args._addonname, xbmc.LOGERROR)
xbmcgui.Dialog().ok(args._addonname, args._addon.getLocalizedString(30044))
diff --git a/plugin.video.wakanim/resources/lib/view.py b/plugin.video.wakanim/resources/lib/view.py
index a3ef988..c8a00ff 100644
--- a/plugin.video.wakanim/resources/lib/view.py
+++ b/plugin.video.wakanim/resources/lib/view.py
@@ -15,7 +15,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import re
import sys
import urllib
@@ -24,53 +23,52 @@ import xbmcgui
import xbmcplugin
+# keys allowed in setInfo
+types = ["count", "size", "date", "genre", "year", "episode", "season", "top250", "tracknumber",
+ "rating", "userrating", "watched", "playcount", "overlay", "cast", "castandrole", "director",
+ "mpaa", "plot", "plotoutline", "title", "originaltitle", "sorttitle", "duration", "studio",
+ "tagline", "writer", "tvshowtitle", "premiered", "status", "code", "aired", "credits", "lastplayed",
+ "album", "artist", "votes", "trailer", "dateadded", "mediatype"]
+
def endofdirectory():
- # Sort methods are required in library mode
+ # sort methods are required in library mode
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_NONE)
- # Let xbmc know the script is done adding items to the list
- dontAddToHierarchy = False
- xbmcplugin.endOfDirectory(handle = int(sys.argv[1]), updateListing = dontAddToHierarchy)
+ # let xbmc know the script is done adding items to the list
+ xbmcplugin.endOfDirectory(handle = int(sys.argv[1]))
-def add_item(args, info, isFolder=True, total_items=0, queued=False, rex=re.compile(r"(?<=mode=)[^&]*"), mediatype="video"):
+def add_item(args, info, isFolder=True, total_items=0, mediatype="video"):
"""Add item to directory listing.
"""
- # Defaults in dict. Use "None" instead of None so it is compatible for
- info = set_info_defaults(args, info)
- u = build_url(info)
-
- # Create list item
- li = xbmcgui.ListItem(label = info["title"],
- iconImage = info["thumb"],
- thumbnailImage = info["thumb"])
+
+ # create list item
+ li = xbmcgui.ListItem(label = info["title"])
+
+ # get infoLabels
+ infoLabels = make_infolabel(args, info)
+ infoLabels["genre"] = "Anime"
+
+ # get url
+ u = build_url(args, info)
+
if isFolder:
- li.setInfo(type = mediatype,
- infoLabels = {"title": info["title"],
- "plot": info["plot"],
- "year": info["year"],
- "episode": info["episode"],
- "season": info["season"],
- "rating": info["rating"],
- "genre": "Anime"})
+ # directory
+ li.setInfo(mediatype, infoLabels)
else:
- li.setInfo(type = mediatype,
- infoLabels = {"mediatype": "video",
- "title": info["title"],
- "plot": info["plot"],
- "year": info["year"],
- "episode": info["episode"],
- "season": info["season"],
- "rating": info["rating"],
- "genre": "Anime"})
-
- li.setArt({"thumb": info["thumb"],
- "poster": info["thumb"],
- "banner": info["thumb"],
- "fanart": info["fanart_image"],
- "icon": info["thumb"]})
-
- # Add item to list
+ # playable video
+ infoLabels["mediatype"] = "video"
+ li.setInfo(mediatype, infoLabels)
+ li.setProperty("IsPlayable", "true")
+
+ # set media image
+ li.setArt({"thumb": info.get("thumb", "DefaultFolder.png"),
+ "poster": info.get("thumb", "DefaultFolder.png"),
+ "banner": info.get("thumb", "DefaultFolder.png"),
+ "fanart": info.get("fanart", xbmc.translatePath(args._addon.getAddonInfo("fanart"))),
+ "icon": info.get("thumb", "DefaultFolder.png")})
+
+ # add item to list
xbmcplugin.addDirectoryItem(handle = int(sys.argv[1]),
url = u,
listitem = li,
@@ -78,60 +76,35 @@ def add_item(args, info, isFolder=True, total_items=0, queued=False, rex=re.comp
totalItems = total_items)
-def build_url(info):
- # Create params for xbmcplugin module
- s = sys.argv[0] +\
- "?url=" + urllib.quote_plus(info["url"]) +\
- "&mode=" + urllib.quote_plus(info["mode"]) +\
- "&name=" + urllib.quote_plus(info["title"]) +\
- "&id=" + urllib.quote_plus(info["id"]) +\
- "&count=" + urllib.quote_plus(info["count"]) +\
- "&series_id=" + urllib.quote_plus(info["series_id"]) +\
- "&filterx=" + urllib.quote_plus(info["filterx"]) +\
- "&offset=" + urllib.quote_plus(info["offset"]) +\
- "&icon=" + urllib.quote_plus(info["thumb"]) +\
- "&complete=" + urllib.quote_plus(info["complete"]) +\
- "&fanart=" + urllib.quote_plus(info["fanart_image"]) +\
- "&season=" + urllib.quote_plus(info["season"]) +\
- "&media_type=" + urllib.quote_plus(info["media_type"]) +\
- "&year=" + urllib.quote_plus(info["year"]) +\
- "&playhead=" + urllib.quote_plus(info["playhead"]) +\
- "&duration=" + urllib.quote_plus(info["duration"]) +\
- "&episode=" + urllib.quote_plus(info["episode"]) +\
- "&rating=" + urllib.quote_plus(info["rating"]) +\
- "&plot=" + urllib.quote_plus(info["plot"])
- return s
-
-
-def set_info_defaults(args, info):
- # Defaults in dict. Use "None" instead of None so it is compatible for
- # quote_plus in parseArgs.
- info.setdefault("url", "None")
- info.setdefault("thumb", "DefaultFolder.png")
- info.setdefault("fanart_image",
- xbmc.translatePath(args._addon.getAddonInfo("fanart")))
- info.setdefault("count", "0")
- info.setdefault("filterx", "None")
- info.setdefault("id", "None")
- info.setdefault("series_id", "None")
- info.setdefault("offset", "0")
- info.setdefault("season", "1")
- info.setdefault("series_id", "0")
- info.setdefault("page_url", "None")
- info.setdefault("complete", "True")
- info.setdefault("media_type", "None")
- info.setdefault("title", "None")
- info.setdefault("year", "0")
- info.setdefault("playhead", "0")
- info.setdefault("duration", "0")
- info.setdefault("episode", "0")
- info.setdefault("plot", "None")
- info.setdefault("percent", "0")
- info.setdefault("ordering", "0")
- info.setdefault("rating", "0")
- info.setdefault("studio", "None")
- # And set all None to "None"
- for key, value in info.items():
- if value == None:
- info[key] = "None"
- return info
+def build_url(args, info):
+ """Create url
+ """
+ s = ""
+ # step 1 copy new information from info
+ for key, value in info.iteritems():
+ if value:
+ s = s + "&" + key + "=" + urllib.quote_plus(value)
+
+ # step 2 copy old information from args, but don't append twice
+ for key, value in args.__dict__.iteritems():
+ if value and key in types and not "&" + str(key) + "=" in s:
+ s = s + "&" + key + "=" + urllib.quote_plus(value)
+
+ return sys.argv[0] + "?" + s[1:]
+
+
+def make_infolabel(args, info):
+ """Generate infoLabels from existing dict
+ """
+ infoLabels = {}
+ # step 1 copy new information from info
+ for key, value in info.iteritems():
+ if value and key in types:
+ infoLabels[key] = value
+
+ # step 2 copy old information from args, but don't overwrite
+ for key, value in args.__dict__.iteritems():
+ if value and key in types and key not in infoLabels:
+ infoLabels[key] = value
+
+ return infoLabels
diff --git a/plugin.video.wakanim/resources/lib/wakanim.py b/plugin.video.wakanim/resources/lib/wakanim.py
index 5ff9a05..3c53fcb 100644
--- a/plugin.video.wakanim/resources/lib/wakanim.py
+++ b/plugin.video.wakanim/resources/lib/wakanim.py
@@ -30,7 +30,7 @@ import view
def main():
"""Main function for the addon
"""
- args = cmdargs.parse_args()
+ args = cmdargs.parse()
# check if account is set
username = args._addon.getSetting("wakanim_username")
@@ -70,20 +70,18 @@ def check_mode(args):
"""
if hasattr(args, "mode"):
mode = args.mode
- else:
+ elif hasattr(args, "id"):
# call from other plugin
mode = "videoplay"
- args.name = "Video"
- args.episode, args.rating, args.plot, args.year, args.icon = ("None",) * 5
-
- if hasattr(args, "id"):
- args.url = "/" + args._country + "/v2/catalogue/episode/" + args.id
- elif hasattr(args, "url"):
- args.url = args.url[22:]
- else:
- mode = None
+ args.url = "/" + args._country + "/v2/catalogue/episode/" + args.id
+ elif hasattr(args, "id"):
+ # call from other plugin
+ mode = "videoplay"
+ args.url = args.url[22:]
+ else:
+ mode = None
- if mode is None:
+ if not mode:
showMainMenue(args)
elif mode == "catalog":
netapi.showCatalog(args)
@@ -99,6 +97,9 @@ def check_mode(args):
netapi.listEpisodes(args)
elif mode == "videoplay":
netapi.startplayback(args)
+ elif mode == "trailer":
+ item = xbmcgui.ListItem(getattr(args, "title", "Title not provided"), path=args.url)
+ xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
else:
# unkown mode
xbmc.log("[PLUGIN] %s: Failed in check_mode '%s'" % (args._addonname, str(mode)), xbmc.LOGERROR)
diff --git a/plugin.video.wakanim/resources/media/screenshot-01.jpg b/plugin.video.wakanim/resources/media/screenshot-01.jpg
new file mode 100644
index 0000000..d6f468c
--- /dev/null
+++ b/plugin.video.wakanim/resources/media/screenshot-01.jpg
Binary files differ
diff --git a/plugin.video.wakanim/resources/media/screenshot-02.jpg b/plugin.video.wakanim/resources/media/screenshot-02.jpg
new file mode 100644
index 0000000..1ae92a1
--- /dev/null
+++ b/plugin.video.wakanim/resources/media/screenshot-02.jpg
Binary files differ
diff --git a/plugin.video.wakanim/resources/media/screenshot-03.jpg b/plugin.video.wakanim/resources/media/screenshot-03.jpg
new file mode 100644
index 0000000..d1a2035
--- /dev/null
+++ b/plugin.video.wakanim/resources/media/screenshot-03.jpg
Binary files differ
diff --git a/plugin.video.wakanim/resources/settings.xml b/plugin.video.wakanim/resources/settings.xml
index 9cdfd96..bc00cb9 100644
--- a/plugin.video.wakanim/resources/settings.xml
+++ b/plugin.video.wakanim/resources/settings.xml
@@ -4,6 +4,4 @@
<setting type="sep" />
<setting id="wakanim_username" type="text" label="30001" default=""/>
<setting id="wakanim_password" type="text" label="30002" option="hidden" default=""/>
- <setting type="sep" />
- <setting id="video_quality" type="select" lvalues="30005|30004" label="30003" default="0"/>
</settings>