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/viaplay.py

180 lines
6.5 KiB
Python
Raw Normal View History

2013-03-02 21:26:28 +01:00
# ex:ts=4:sw=4:sts=4:et
# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
# pylint has issues with urlparse: "some types could not be inferred"
# pylint: disable=E1103
2014-06-07 20:43:40 +02:00
import copy
2020-05-03 11:31:38 +02:00
import hashlib
2019-08-25 00:40:39 +02:00
import json
2020-05-03 11:31:38 +02:00
import logging
2019-08-25 00:40:39 +02:00
import re
2018-01-30 22:07:21 +01:00
from urllib.parse import urlparse
2019-08-25 00:40:39 +02:00
from svtplay_dl.error import ServiceError
2015-10-24 21:55:33 +02:00
from svtplay_dl.fetcher.hls import hlsparse
2019-08-25 00:40:39 +02:00
from svtplay_dl.service import OpenGraphThumbMixin
from svtplay_dl.service import Service
from svtplay_dl.subtitle import subtitle
2015-09-15 20:10:32 +02:00
2014-01-26 01:54:20 +01:00
class Viaplay(Service, OpenGraphThumbMixin):
supported_domains = [
2019-08-25 00:27:31 +02:00
"tv3play.ee",
"tv3play.lv",
"tv3play.lt",
"tvplay.lv",
"viagame.com",
"juicyplay.se",
"viafree.se",
"viafree.dk",
"viafree.no",
"viafree.fi",
"play.tv3.lt",
"tv3play.tv3.ee",
"tvplay.skaties.lv",
]
def get(self):
2020-05-03 11:31:38 +02:00
login = self._login()
if not login:
yield ServiceError("You need to login")
2014-11-01 21:10:06 +01:00
return
2018-01-30 20:11:37 +01:00
2020-05-03 11:31:38 +02:00
data = self.get_urldata()
match = re.search('}}}},("staticPages".*}}); windo', data)
if not match:
yield ServiceError("Cant find necessary info")
return
2020-05-03 11:31:38 +02:00
janson = json.loads("{}{}".format("{", match.group(1)))
video = None
for play in janson["page"]["blocks"]:
if "componentName" in play and play["componentName"] == "player":
video = play
break
2020-05-03 11:31:38 +02:00
if not video:
yield ServiceError("Can't find video")
2014-11-01 21:10:06 +01:00
return
2020-05-03 11:31:38 +02:00
self._autoname(video)
2020-05-03 11:31:38 +02:00
if "subtitles" in video["_embedded"]["program"] and "subtitlesWebvtt" in video["_embedded"]["program"]["subtitles"]:
yield subtitle(copy.copy(self.config), "wrst", video["_embedded"]["program"]["subtitles"]["subtitlesWebvtt"], output=self.output)
2020-05-03 11:31:38 +02:00
res = self.http.get(video["_embedded"]["program"]["_links"]["streamLink"]["href"])
janson = res.json()
stream = janson["embedded"]["prioritizedStreams"][0]["links"]["stream"]
2020-05-03 11:31:38 +02:00
if video["_embedded"]["program"]["_links"]["streamLink"]:
streams = hlsparse(
self.config,
self.http.request("get", stream["href"]),
stream["href"],
output=self.output,
authorization="MTG-AT {}".format(self.token),
)
2018-05-08 22:48:55 +02:00
for n in list(streams.keys()):
yield streams[n]
2018-05-21 22:56:22 +02:00
def find_all_episodes(self, config):
episodes = []
2020-05-03 11:31:38 +02:00
parse = urlparse(self.url)
data = self.get_urldata()
match = re.search('}}}},("staticPages".*}}); windo', data)
if not match:
logging.error("Cant find necessary info")
return
2020-05-03 11:31:38 +02:00
janson = json.loads("{}{}".format("{", match.group(1)))
seasons = []
2020-05-03 11:31:38 +02:00
if janson["page"]["pageType"] == "player":
res = self.http.get("{}://{}{}".format(parse.scheme, parse.netloc, janson["page"]["blocks"][0]["_links"]["back"]["publicPath"]))
data = res.text
match = re.search('}}}},("staticPages".*}}); windo', data)
if not match:
logging.error("Cant find necessary info")
return
2020-05-03 11:31:38 +02:00
janson = json.loads("{}{}".format("{", match.group(1)))
for i in janson["page"]["blocks"]:
if i["slug"] == "series_header" and "seasons" in i["seriesHeader"]:
for n in i["seriesHeader"]["seasons"]:
seasons.append(n["_links"]["season"]["href"])
break
videos_tmp = []
clips = []
for season in seasons:
res = self.http.get(season)
janson = res.json()
groups = None
for i in janson["_embedded"]["viafreeBlocks"]:
if i["componentName"] == "groups":
groups = i
break
if groups:
for i in groups["_embedded"]["blocks"][0]["_embedded"]["programs"]:
if i["type"] == "episode":
if i["episode"]["episodeNumber"]:
videos_tmp.append(
[
int("{}{}".format(i["episode"]["seasonNumber"], i["episode"]["episodeNumber"])),
"{}://{}{}".format(parse.scheme, parse.netloc, i["publicPath"]),
]
)
elif config.get("include_clips"):
clips.append("{}://{}{}".format(parse.scheme, parse.netloc, i["publicPath"]))
else:
episodes.append("{}://{}{}".format(parse.scheme, parse.netloc, i["publicPath"]))
if videos_tmp:
for i in sorted(videos_tmp, key=lambda x: x[0]):
episodes.append(i[1])
2020-05-03 11:31:38 +02:00
if config.get("all_last") > 0:
return episodes[-config.get("all_last") :]
2018-01-30 20:11:37 +01:00
2020-05-03 11:31:38 +02:00
if clips:
episodes.extend(clips)
return sorted(episodes)
2018-01-30 20:11:37 +01:00
2015-10-24 21:55:33 +02:00
def _autoname(self, dataj):
2020-05-03 11:31:38 +02:00
typ = dataj["_embedded"]["program"]["type"]
title = dataj["_embedded"]["program"]["title"]
2017-02-15 23:15:50 +01:00
2020-05-03 11:31:38 +02:00
vid = dataj["_embedded"]["program"]["guid"]
if re.search("-", vid): # in sports they have "-" in the id..
vid = hashlib.sha256(vid.encode("utf-8")).hexdigest()[:7]
self.output["id"] = vid
2020-05-03 11:31:38 +02:00
if typ == "episode":
program = dataj["_embedded"]["program"][typ]["seriesTitle"]
self.output["season"] = dataj["_embedded"]["program"][typ]["seasonNumber"]
self.output["episode"] = dataj["_embedded"]["program"][typ]["episodeNumber"]
self.output["episodename"] = title
elif typ == "clip":
program = dataj["_embedded"]["program"]["episode"]["seriesTitle"]
self.output["season"] = dataj["_embedded"]["program"]["episode"]["seasonNumber"]
self.output["episodename"] = title
else:
program = title
2017-02-15 23:15:50 +01:00
2018-05-13 13:06:45 +02:00
self.output["title"] = program
2020-05-03 11:31:38 +02:00
def _login(self):
res = self.http.post(
"https://viafree.mtg-api.com/identity/viafree/auth/pwd/sessions",
json={"email": self.config.get("username"), "password": self.config.get("password")},
headers={"Accept": "Application/json"},
)
if res.status_code < 400:
self.userID = res.json()["data"]["userData"]["userId"]
self.token = res.json()["data"]["accessToken"]
return True
return False