Compare commits
4 Commits
v0.5.1-bet
...
v0.5.2-bet
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
da17ff8d36 | ||
|
|
0ccacf0947 | ||
|
|
556bbe11f0 | ||
|
|
f2da6c967b |
12
README.md
12
README.md
@@ -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
|
||||
|
||||
@@ -1 +1 @@
|
||||
__version__ = "v0.5.0-beta (20230926)"
|
||||
__version__ = "v0.5.2-beta (20230927)"
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user