4 Commits

Author SHA1 Message Date
stabbedbybrick
da17ff8d36 Better support for standalone episodes 2023-09-27 10:47:02 +02:00
stabbedbybrick
0ccacf0947 update version 2023-09-27 10:46:14 +02:00
stabbedbybrick
556bbe11f0 update 2023-09-26 21:28:30 +02:00
stabbedbybrick
f2da6c967b update readme 2023-09-26 19:57:34 +02:00
3 changed files with 11 additions and 17 deletions

View File

@@ -1,7 +1,7 @@
### Freevine v0.5.0-beta (20230926)
### Freevine
Download videos from free streaming services
#### Features:
- [x] Movies & TV-series
- [x] Episode selection and batch options
- [x] Quality selection
@@ -10,13 +10,12 @@
- [x] Config file with settings for download path, file format, subtitle options etc.
#### Supported services:
(Premium content on any service is not supported)
ROKU: 1080p, DD5.1
CTV: 1080p, DD5.1
ALL4: 1080p, AAC2.0
MY5: 1080p, AAC2.0*
MY5: 1080p, AAC2.0
UKTV: 1080p, AAC2.0
STV: 1080p, AAC2.0
CRKL: 1080p, AAC2.0
@@ -24,10 +23,8 @@
TUBI: 720p, AAC2.0
PLUTO: 720p, AAC2.0
*Read --help for more info
#### Required tools:
* [Python 3.10+](https://www.python.org/)
* [Pywidevine](https://www.mediafire.com/file/y7o57xs6pazx0rc/pywidevine.zip/)
@@ -43,14 +40,12 @@
* [mp4decrypt](https://www.bento4.com/downloads/)
#### Installation:
1. Install Python (check 'Add to PATH' if on Windows)
2. Place pywidevine folder inside Freevine folder
3. Place N_m3u8DL-RE, ffmpeg, mkvmerge, mp4decrypt inside Freevine folder OR add to PATH
4. Install necessary Python modules: `pip install -r requirements.txt`
#### Usage:
python freevine.py --help (READ THIS!)
Examples:
@@ -62,7 +57,6 @@
python freevine.py --titles URL
#### Notes:
> It's still in early beta. Expect bugs here and there
> Free streaming services are known for having gaps in their library and odd labels

View File

@@ -1 +1 @@
__version__ = "v0.5.0-beta (20230926)"
__version__ = "v0.5.2-beta (20230927)"

View File

@@ -39,12 +39,12 @@ from helpers.config import Config
class CHANNEL5(Config):
def __init__(self, config, srvc, **kwargs):
def __init__(self, config, srvc, **kwargs) -> None:
super().__init__(config, srvc, **kwargs)
self.get_options()
def get_data(self, url: str) -> dict:
def get_data(self, url: str) -> json:
show = urlparse(url).path.split("/")[2]
url = self.srvc["my5"]["api"]["content"].format(show=show)
@@ -59,8 +59,8 @@ class CHANNEL5(Config):
id_=None,
service="MY5",
title=episode.get("sh_title"),
season=int(episode["sea_num"]),
number=int(episode["ep_num"]),
season=episode.get("sea_num") or 0,
number=episode.get("ep_num") or 0,
name=episode.get("title"),
year=None,
data=episode.get("id"),
@@ -88,7 +88,7 @@ class CHANNEL5(Config):
]
)
def decrypt_data(self, media: str) -> tuple:
def decrypt_data(self, media: str) -> dict:
key = base64.b64decode(self.srvc["my5"]["keys"]["aes"])
r = self.client.get(media)
@@ -140,7 +140,7 @@ class CHANNEL5(Config):
array_of_bytes.extend(bytes.fromhex(kid.replace("-", "")))
return base64.b64encode(bytes.fromhex(array_of_bytes.hex())).decode("utf-8")
def get_mediainfo(self, manifest: str, quality: str) -> str:
def get_mediainfo(self, manifest: str, quality: str) -> tuple:
self.soup = BeautifulSoup(self.client.get(manifest), "xml")
pssh = self.get_pssh(self.soup)
elements = self.soup.find_all("Representation")
@@ -159,7 +159,7 @@ class CHANNEL5(Config):
return heights[0], pssh
def get_content(self, url: str) -> object:
def get_content(self, url: str) -> tuple[Movies | Series, str]:
if self.movie:
with self.console.status("Fetching titles..."):
content = self.get_movies(self.url)