1
0
mirror of https://github.com/spaam/svtplay-dl.git synced 2024-11-24 12:15:40 +01:00
svtplay-dl/lib/svtplay_dl/service/cmore.py

139 lines
5.5 KiB
Python
Raw Normal View History

2018-05-13 13:06:45 +02:00
from __future__ import absolute_import, unicode_literals
2017-09-16 23:45:29 +02:00
import re
import copy
2018-01-30 22:07:21 +01:00
from urllib.parse import urljoin, urlparse
2017-09-16 23:45:29 +02:00
from svtplay_dl.service import Service
from svtplay_dl.log import log
2017-09-16 23:45:29 +02:00
from svtplay_dl.fetcher.dash import dashparse
from svtplay_dl.subtitle import subtitle
from svtplay_dl.error import ServiceError
2018-01-30 20:11:37 +01:00
2017-09-16 23:45:29 +02:00
class Cmore(Service):
supported_domains = ['www.cmore.se', 'www.cmore.dk', 'www.cmore.no', 'www.cmore.fi']
2017-09-16 23:45:29 +02:00
def get(self):
2018-05-13 13:06:45 +02:00
if not self.config.get("username") or not self.config.get("password"):
yield ServiceError("You need username and password to download things from this site.")
return
token, message = self._login()
2017-09-16 23:45:29 +02:00
if not token:
yield ServiceError(message)
2017-09-16 23:45:29 +02:00
return
2017-09-16 23:45:29 +02:00
res = self.http.get(self.url)
match = re.search('data-asset-id="([^"]+)"', res.text)
2017-09-16 23:45:29 +02:00
if not match:
yield ServiceError("Can't find video id")
return
tld = self._gettld()
url = "https://restapi.cmore.{0}/api/tve_web/asset/{1}/play.json?protocol=VUDASH".format(tld, match.group(1))
2017-09-16 23:45:29 +02:00
res = self.http.get(url, headers={"authorization": "Bearer {0}".format(token)})
janson = res.json()
if "error" in janson:
yield ServiceError("This video is geoblocked")
return
2017-09-16 23:45:29 +02:00
2018-05-13 13:06:45 +02:00
basename = self._autoname(match.group(1))
self.output["id"] = match.group(1)
if basename is None:
yield ServiceError("Cant find vid id for autonaming")
2017-09-16 23:45:29 +02:00
return
if "drmProtected" in janson["playback"]:
if janson["playback"]["drmProtected"]:
yield ServiceError("DRM protected. Can't do anything")
return
if isinstance(janson["playback"]["items"]["item"], list):
for i in janson["playback"]["items"]["item"]:
if i["mediaFormat"] == "ism":
streams = dashparse(self.config, self.http.request("get", i["url"]), i["url"], output=self.output)
2017-09-16 23:45:29 +02:00
if streams:
for n in list(streams.keys()):
yield streams[n]
if i["mediaFormat"] == "webvtt":
2018-05-08 22:46:11 +02:00
yield subtitle(copy.copy(self.config), "wrst", i["url"])
2017-09-16 23:45:29 +02:00
else:
i = janson["playback"]["items"]["item"]
if i["mediaFormat"] == "ism":
streams = dashparse(self.config, self.http.request("get", i["url"]), i["url"], output=self.output)
2018-05-08 22:48:55 +02:00
for n in list(streams.keys()):
yield streams[n]
2017-09-16 23:45:29 +02:00
def _autoname(self, vid):
url = "https://restapi.cmore.{0}/api/tve_web/asset/{1}.json?expand=metadata".format(self._gettld(), vid)
2017-09-16 23:45:29 +02:00
res = self.http.get(url)
janson = res.json()["asset"]["metadata"]
if isinstance(janson["title"], list):
for i in janson["title"]:
if self._gettld() == "se":
if i["@xml:lang"] == "sv_SE":
name = i["$"]
elif self._gettld() == "dk":
if i["@xml:lang"] == "da_DK":
name = i["$"]
elif self._gettld() == "no":
if i["@xml:lang"] == "nb_NO":
name = i["$"]
elif self._gettld() == "fi":
if i["@xml:lang"] == "fi_FI":
name = i["$"]
else:
name = janson["title"]["$"]
2017-09-16 23:45:29 +02:00
if "season" in janson:
2018-05-13 13:06:45 +02:00
self.output["season"] = int(janson["season"]["$"])
self.output["episode"] = int(janson["episode"]["$"])
self.output["title"] = name
return self.output["title"]
2017-09-16 23:45:29 +02:00
2018-05-13 13:06:45 +02:00
def find_all_episodes(self, config):
2017-09-16 23:45:29 +02:00
episodes = []
token, message = self._login()
if not token:
log.error(message)
return
2017-09-16 23:45:29 +02:00
res = self.http.get(self.url)
tags = re.findall('<a class="card__link" href="([^"]+)"', res.text)
for i in tags:
url = urljoin("https://www.cmore.{}/".format(self._gettld()), i)
2017-09-16 23:45:29 +02:00
if url not in episodes:
episodes.append(url)
2018-05-13 13:06:45 +02:00
if config.get("all_last") > 0:
return sorted(episodes[-config.get("all_last"):])
2017-09-16 23:45:29 +02:00
return sorted(episodes)
def _gettld(self):
if isinstance(self.url, list):
parse = urlparse(self.url[0])
else:
parse = urlparse(self.url)
return re.search('\.(\w{2})$', parse.netloc).group(1)
2017-09-16 23:45:29 +02:00
def _login(self):
tld = self._gettld()
url = "https://www.cmore.{}/login".format(tld)
2017-09-16 23:45:29 +02:00
res = self.http.get(url, cookies=self.cookies)
2018-05-22 00:02:20 +02:00
if self.config.get("cmoreoperator"):
post = {"username": self.config.get("username"), "password": self.config.get("password"),
"operator": self.config.get("cmoreoperator"), "country_code": tld}
2017-09-19 00:30:11 +02:00
else:
2018-05-22 00:02:20 +02:00
post = {"username": self.config.get("username"), "password": self.config.get("password")}
res = self.http.post("https://account.cmore.{}/session?client=cmore-web-prod".format(tld), json=post, cookies=self.cookies)
2017-09-19 00:30:11 +02:00
if res.status_code >= 400:
return None, "Wrong username or password"
2017-09-16 23:45:29 +02:00
janson = res.json()
token = janson["data"]["vimond_token"]
return token, None
2017-09-19 00:30:11 +02:00
def operatorlist(self):
res = self.http.get("https://tve.cmore.se/country/{0}/operator?client=cmore-web".format(self._gettld()))
for i in res.json()["data"]["operators"]:
print("operator: '{0}'".format(i["name"].lower()))