StreamingCommunity 3.3.5__tar.gz → 3.3.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of StreamingCommunity might be problematic. Click here for more details.
- {streamingcommunity-3.3.5/StreamingCommunity.egg-info → streamingcommunity-3.3.6}/PKG-INFO +38 -51
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/README.md +37 -50
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/altadefinizione/__init__.py +17 -18
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/altadefinizione/series.py +4 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/animeunity/__init__.py +14 -15
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/animeunity/serie.py +1 -1
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/animeworld/__init__.py +15 -13
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/animeworld/serie.py +1 -1
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/crunchyroll/__init__.py +16 -17
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/crunchyroll/series.py +6 -1
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/guardaserie/__init__.py +17 -19
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/guardaserie/series.py +4 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/guardaserie/site.py +2 -7
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/mediasetinfinity/__init__.py +15 -15
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/mediasetinfinity/series.py +4 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/mediasetinfinity/site.py +12 -2
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/mediasetinfinity/util/ScrapeSerie.py +67 -98
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/raiplay/__init__.py +15 -15
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/raiplay/series.py +5 -1
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/streamingcommunity/__init__.py +16 -14
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/streamingwatch/__init__.py +12 -12
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/streamingwatch/series.py +4 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Template/Class/SearchType.py +0 -1
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Template/Util/manage_ep.py +1 -11
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Template/site.py +2 -3
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/Downloader/DASH/downloader.py +55 -17
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/Downloader/DASH/segments.py +73 -17
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/Downloader/HLS/downloader.py +282 -152
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/Downloader/HLS/segments.py +1 -5
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/FFmpeg/capture.py +1 -1
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/FFmpeg/command.py +6 -6
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/FFmpeg/util.py +11 -30
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/M3U8/estimator.py +27 -13
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Upload/update.py +2 -2
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Upload/version.py +1 -1
- streamingcommunity-3.3.6/StreamingCommunity/Util/installer/__init__.py +11 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/installer/device_install.py +1 -1
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/os.py +2 -6
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/table.py +40 -8
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/run.py +15 -8
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6/StreamingCommunity.egg-info}/PKG-INFO +38 -51
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity.egg-info/SOURCES.txt +1 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/LICENSE +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/MANIFEST.in +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Player/Helper/Vixcloud/util.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Player/hdplayer.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Player/mediapolisvod.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Player/supervideo.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Player/sweetpixel.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Player/vixcloud.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/altadefinizione/film.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/altadefinizione/site.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/altadefinizione/util/ScrapeSerie.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/animeunity/film.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/animeunity/site.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/animeworld/film.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/animeworld/site.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/animeworld/util/ScrapeSerie.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/crunchyroll/film.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/crunchyroll/site.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/crunchyroll/util/ScrapeSerie.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/crunchyroll/util/get_license.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/mediasetinfinity/film.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/mediasetinfinity/util/fix_mpd.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/mediasetinfinity/util/get_license.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/raiplay/film.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/raiplay/site.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/raiplay/util/ScrapeSerie.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/raiplay/util/get_license.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/streamingcommunity/film.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/streamingcommunity/series.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/streamingcommunity/site.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/streamingwatch/film.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/streamingwatch/site.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Site/streamingwatch/util/ScrapeSerie.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Template/Util/__init__.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Template/__init__.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Api/Template/config_loader.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/Downloader/DASH/cdm_helpher.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/Downloader/DASH/decrypt.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/Downloader/DASH/parser.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/Downloader/MP4/downloader.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/Downloader/TOR/downloader.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/Downloader/__init__.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/FFmpeg/__init__.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/M3U8/__init__.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/M3U8/decryptor.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/M3U8/parser.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/M3U8/url_fixer.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/TMBD/__init__.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/TMBD/obj_tmbd.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Lib/TMBD/tmdb.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/TelegramHelp/__init__.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/TelegramHelp/config.json +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/TelegramHelp/telegram_bot.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/color.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/config_json.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/headers.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/http_client.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/installer/bento4_install.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/installer/binary_paths.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/installer/ffmpeg_install.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/logger.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/Util/message.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/__init__.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity/global_search.py +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity.egg-info/dependency_links.txt +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity.egg-info/entry_points.txt +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity.egg-info/requires.txt +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/StreamingCommunity.egg-info/top_level.txt +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/requirements.txt +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/setup.cfg +0 -0
- {streamingcommunity-3.3.5 → streamingcommunity-3.3.6}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: StreamingCommunity
|
|
3
|
-
Version: 3.3.
|
|
3
|
+
Version: 3.3.6
|
|
4
4
|
Home-page: https://github.com/Arrowar/StreamingCommunity
|
|
5
5
|
Author: Arrowar
|
|
6
6
|
Project-URL: Bug Reports, https://github.com/Arrowar/StreamingCommunity/issues
|
|
@@ -45,7 +45,9 @@ Dynamic: requires-python
|
|
|
45
45
|
[](https://github.com/Arrowar/StreamingCommunity/blob/main/LICENSE)
|
|
46
46
|
|
|
47
47
|
## 💝 Support the Project
|
|
48
|
-
|
|
48
|
+
<a href='https://ko-fi.com/E1E11LVC83' target='_blank'>
|
|
49
|
+
<img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi4.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' />
|
|
50
|
+
</a>
|
|
49
51
|
|
|
50
52
|
## 🚀 Download & Install
|
|
51
53
|
[](https://github.com/Arrowar/StreamingCommunity/releases/latest/download/StreamingCommunity_win.exe)
|
|
@@ -62,50 +64,44 @@ Dynamic: requires-python
|
|
|
62
64
|
---
|
|
63
65
|
|
|
64
66
|
## 📖 Table of Contents
|
|
65
|
-
- [Installation](#
|
|
66
|
-
- [Quick Start](#quick-start)
|
|
67
|
-
- [Downloaders](#downloaders)
|
|
68
|
-
- [Configuration](#configuration)
|
|
69
|
-
- [Login](.github/.site/login.md)
|
|
70
|
-
- [
|
|
71
|
-
- [
|
|
72
|
-
- [
|
|
73
|
-
- [
|
|
74
|
-
- [
|
|
75
|
-
- [
|
|
67
|
+
- ⚙️ [Installation](#installation)
|
|
68
|
+
- 🚀 [Quick Start](#quick-start)
|
|
69
|
+
- 📥 [Downloaders](#downloaders)
|
|
70
|
+
- 🛠️ [Configuration](#configuration)
|
|
71
|
+
- 🔐 [Login](.github/.site/login.md)
|
|
72
|
+
- 🌐 [Domain](https://arrowar.github.io/StreamingCommunity)
|
|
73
|
+
- 💡 [Usage Examples](#usage-examples)
|
|
74
|
+
- 🔍 [Global Search](#global-search)
|
|
75
|
+
- 🧩 [Advanced Features](#advanced-options)
|
|
76
|
+
- 🐳 [Deployment](#docker)
|
|
77
|
+
- 🎓 [Tutorials](#tutorials)
|
|
78
|
+
- 🔗 [Related Projects](#useful-project)
|
|
76
79
|
|
|
77
80
|
---
|
|
78
81
|
|
|
79
|
-
##
|
|
82
|
+
## Installation
|
|
80
83
|
|
|
81
|
-
|
|
84
|
+
### Prerequisites
|
|
85
|
+
Make sure you have Python installed on your system:
|
|
86
|
+
- **Windows**: Download from [python.org](https://python.org) or install via Microsoft Store
|
|
87
|
+
- **Linux**: `sudo apt install python3 python3-pip` (Ubuntu/Debian) or equivalent for your distro
|
|
88
|
+
- **MacOS**: `brew install python3` or download from [python.org](https://python.org)
|
|
82
89
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
90
|
+
### Dependencies
|
|
91
|
+
```bash
|
|
92
|
+
# Windows
|
|
86
93
|
pip install -r requirements.txt
|
|
87
|
-
```
|
|
88
94
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
```bash
|
|
95
|
+
# Linux/MacOS
|
|
92
96
|
pip3 install -r requirements.txt
|
|
93
|
-
# or alternatively:
|
|
94
|
-
python3 -m pip install -r requirements.txt
|
|
95
97
|
```
|
|
96
98
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
### On Windows:
|
|
101
|
-
|
|
102
|
-
```powershell
|
|
99
|
+
### Update
|
|
100
|
+
```bash
|
|
101
|
+
# Windows
|
|
103
102
|
python update.py
|
|
104
|
-
```
|
|
105
103
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
```bash
|
|
104
|
+
# Linux/MacOS
|
|
109
105
|
python3 update.py
|
|
110
106
|
```
|
|
111
107
|
|
|
@@ -113,26 +109,17 @@ python3 update.py
|
|
|
113
109
|
|
|
114
110
|
## Quick Start
|
|
115
111
|
|
|
116
|
-
|
|
112
|
+
**Via pip installation:**
|
|
117
113
|
```bash
|
|
118
114
|
StreamingCommunity
|
|
119
115
|
```
|
|
120
|
-
to start the application.
|
|
121
|
-
|
|
122
|
-
Run the script:
|
|
123
|
-
```bash
|
|
124
|
-
python run_streaming.py
|
|
125
|
-
```
|
|
126
116
|
|
|
127
117
|
**Manual execution:**
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
```powershell
|
|
118
|
+
```bash
|
|
119
|
+
# Windows
|
|
131
120
|
python test_run.py
|
|
132
|
-
```
|
|
133
121
|
|
|
134
|
-
|
|
135
|
-
```bash
|
|
122
|
+
# Linux/MacOS
|
|
136
123
|
python3 test_run.py
|
|
137
124
|
```
|
|
138
125
|
|
|
@@ -155,7 +142,7 @@ downloader = HLS_Downloader(
|
|
|
155
142
|
downloader.download()
|
|
156
143
|
```
|
|
157
144
|
|
|
158
|
-
See [HLS example](./Test/
|
|
145
|
+
See [HLS example](./Test/Downloads//HLS.py) for complete usage.
|
|
159
146
|
|
|
160
147
|
<summary>📽️ MP4</summary>
|
|
161
148
|
|
|
@@ -172,7 +159,7 @@ downloader = MP4_downloader(
|
|
|
172
159
|
downloader.download()
|
|
173
160
|
```
|
|
174
161
|
|
|
175
|
-
See [MP4 example](./Test/
|
|
162
|
+
See [MP4 example](./Test/Downloads/MP4.py) for complete usage.
|
|
176
163
|
|
|
177
164
|
<summary>🧲 TOR</summary>
|
|
178
165
|
|
|
@@ -188,7 +175,7 @@ client.add_magnet_link("magnet:?xt=urn:btih:example_hash&dn=example_name", save_
|
|
|
188
175
|
client.start_download()
|
|
189
176
|
```
|
|
190
177
|
|
|
191
|
-
See [Torrent example](./Test/
|
|
178
|
+
See [Torrent example](./Test/Downloads/TOR.py) for complete usage.
|
|
192
179
|
|
|
193
180
|
<summary>🎞️ DASH</summary>
|
|
194
181
|
|
|
@@ -210,7 +197,7 @@ if dash_process.download_and_decrypt():
|
|
|
210
197
|
dash_process.get_status()
|
|
211
198
|
```
|
|
212
199
|
|
|
213
|
-
See [DASH example](./Test/
|
|
200
|
+
See [DASH example](./Test/Downloads/DASH.py) for complete usage.
|
|
214
201
|
|
|
215
202
|
---
|
|
216
203
|
|
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
[](https://github.com/Arrowar/StreamingCommunity/blob/main/LICENSE)
|
|
8
8
|
|
|
9
9
|
## 💝 Support the Project
|
|
10
|
-
|
|
10
|
+
<a href='https://ko-fi.com/E1E11LVC83' target='_blank'>
|
|
11
|
+
<img height='36' style='border:0px;height:36px;' src='https://storage.ko-fi.com/cdn/kofi4.png?v=6' border='0' alt='Buy Me a Coffee at ko-fi.com' />
|
|
12
|
+
</a>
|
|
11
13
|
|
|
12
14
|
## 🚀 Download & Install
|
|
13
15
|
[](https://github.com/Arrowar/StreamingCommunity/releases/latest/download/StreamingCommunity_win.exe)
|
|
@@ -24,50 +26,44 @@
|
|
|
24
26
|
---
|
|
25
27
|
|
|
26
28
|
## 📖 Table of Contents
|
|
27
|
-
- [Installation](#
|
|
28
|
-
- [Quick Start](#quick-start)
|
|
29
|
-
- [Downloaders](#downloaders)
|
|
30
|
-
- [Configuration](#configuration)
|
|
31
|
-
- [Login](.github/.site/login.md)
|
|
32
|
-
- [
|
|
33
|
-
- [
|
|
34
|
-
- [
|
|
35
|
-
- [
|
|
36
|
-
- [
|
|
37
|
-
- [
|
|
29
|
+
- ⚙️ [Installation](#installation)
|
|
30
|
+
- 🚀 [Quick Start](#quick-start)
|
|
31
|
+
- 📥 [Downloaders](#downloaders)
|
|
32
|
+
- 🛠️ [Configuration](#configuration)
|
|
33
|
+
- 🔐 [Login](.github/.site/login.md)
|
|
34
|
+
- 🌐 [Domain](https://arrowar.github.io/StreamingCommunity)
|
|
35
|
+
- 💡 [Usage Examples](#usage-examples)
|
|
36
|
+
- 🔍 [Global Search](#global-search)
|
|
37
|
+
- 🧩 [Advanced Features](#advanced-options)
|
|
38
|
+
- 🐳 [Deployment](#docker)
|
|
39
|
+
- 🎓 [Tutorials](#tutorials)
|
|
40
|
+
- 🔗 [Related Projects](#useful-project)
|
|
38
41
|
|
|
39
42
|
---
|
|
40
43
|
|
|
41
|
-
##
|
|
44
|
+
## Installation
|
|
42
45
|
|
|
43
|
-
|
|
46
|
+
### Prerequisites
|
|
47
|
+
Make sure you have Python installed on your system:
|
|
48
|
+
- **Windows**: Download from [python.org](https://python.org) or install via Microsoft Store
|
|
49
|
+
- **Linux**: `sudo apt install python3 python3-pip` (Ubuntu/Debian) or equivalent for your distro
|
|
50
|
+
- **MacOS**: `brew install python3` or download from [python.org](https://python.org)
|
|
44
51
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
52
|
+
### Dependencies
|
|
53
|
+
```bash
|
|
54
|
+
# Windows
|
|
48
55
|
pip install -r requirements.txt
|
|
49
|
-
```
|
|
50
56
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
```bash
|
|
57
|
+
# Linux/MacOS
|
|
54
58
|
pip3 install -r requirements.txt
|
|
55
|
-
# or alternatively:
|
|
56
|
-
python3 -m pip install -r requirements.txt
|
|
57
59
|
```
|
|
58
60
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
### On Windows:
|
|
63
|
-
|
|
64
|
-
```powershell
|
|
61
|
+
### Update
|
|
62
|
+
```bash
|
|
63
|
+
# Windows
|
|
65
64
|
python update.py
|
|
66
|
-
```
|
|
67
65
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
```bash
|
|
66
|
+
# Linux/MacOS
|
|
71
67
|
python3 update.py
|
|
72
68
|
```
|
|
73
69
|
|
|
@@ -75,26 +71,17 @@ python3 update.py
|
|
|
75
71
|
|
|
76
72
|
## Quick Start
|
|
77
73
|
|
|
78
|
-
|
|
74
|
+
**Via pip installation:**
|
|
79
75
|
```bash
|
|
80
76
|
StreamingCommunity
|
|
81
77
|
```
|
|
82
|
-
to start the application.
|
|
83
|
-
|
|
84
|
-
Run the script:
|
|
85
|
-
```bash
|
|
86
|
-
python run_streaming.py
|
|
87
|
-
```
|
|
88
78
|
|
|
89
79
|
**Manual execution:**
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
```powershell
|
|
80
|
+
```bash
|
|
81
|
+
# Windows
|
|
93
82
|
python test_run.py
|
|
94
|
-
```
|
|
95
83
|
|
|
96
|
-
|
|
97
|
-
```bash
|
|
84
|
+
# Linux/MacOS
|
|
98
85
|
python3 test_run.py
|
|
99
86
|
```
|
|
100
87
|
|
|
@@ -117,7 +104,7 @@ downloader = HLS_Downloader(
|
|
|
117
104
|
downloader.download()
|
|
118
105
|
```
|
|
119
106
|
|
|
120
|
-
See [HLS example](./Test/
|
|
107
|
+
See [HLS example](./Test/Downloads//HLS.py) for complete usage.
|
|
121
108
|
|
|
122
109
|
<summary>📽️ MP4</summary>
|
|
123
110
|
|
|
@@ -134,7 +121,7 @@ downloader = MP4_downloader(
|
|
|
134
121
|
downloader.download()
|
|
135
122
|
```
|
|
136
123
|
|
|
137
|
-
See [MP4 example](./Test/
|
|
124
|
+
See [MP4 example](./Test/Downloads/MP4.py) for complete usage.
|
|
138
125
|
|
|
139
126
|
<summary>🧲 TOR</summary>
|
|
140
127
|
|
|
@@ -150,7 +137,7 @@ client.add_magnet_link("magnet:?xt=urn:btih:example_hash&dn=example_name", save_
|
|
|
150
137
|
client.start_download()
|
|
151
138
|
```
|
|
152
139
|
|
|
153
|
-
See [Torrent example](./Test/
|
|
140
|
+
See [Torrent example](./Test/Downloads/TOR.py) for complete usage.
|
|
154
141
|
|
|
155
142
|
<summary>🎞️ DASH</summary>
|
|
156
143
|
|
|
@@ -172,7 +159,7 @@ if dash_process.download_and_decrypt():
|
|
|
172
159
|
dash_process.get_status()
|
|
173
160
|
```
|
|
174
161
|
|
|
175
|
-
See [DASH example](./Test/
|
|
162
|
+
See [DASH example](./Test/Downloads/DASH.py) for complete usage.
|
|
176
163
|
|
|
177
164
|
---
|
|
178
165
|
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
import subprocess
|
|
5
|
-
from urllib.parse import quote_plus
|
|
6
5
|
|
|
7
6
|
|
|
8
7
|
# External library
|
|
@@ -101,10 +100,13 @@ def process_search_result(select_title, selections=None):
|
|
|
101
100
|
episode_selection = selections.get('episode')
|
|
102
101
|
|
|
103
102
|
download_series(select_title, season_selection, episode_selection)
|
|
103
|
+
media_search_manager.clear()
|
|
104
|
+
table_show_manager.clear()
|
|
104
105
|
return True
|
|
105
106
|
|
|
106
107
|
else:
|
|
107
108
|
download_film(select_title)
|
|
109
|
+
table_show_manager.clear()
|
|
108
110
|
return True
|
|
109
111
|
|
|
110
112
|
# search("Game of Thrones", selections={"season": "1", "episode": "1-3"})
|
|
@@ -122,40 +124,37 @@ def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_
|
|
|
122
124
|
bot = None
|
|
123
125
|
if site_constant.TELEGRAM_BOT:
|
|
124
126
|
bot = get_bot_instance()
|
|
125
|
-
|
|
127
|
+
|
|
126
128
|
if direct_item:
|
|
127
129
|
select_title = MediaItem(**direct_item)
|
|
128
|
-
process_search_result(select_title, selections)
|
|
129
|
-
return
|
|
130
|
-
|
|
130
|
+
result = process_search_result(select_title, selections)
|
|
131
|
+
return result
|
|
132
|
+
|
|
131
133
|
# Get the user input for the search term
|
|
132
134
|
actual_search_query = get_user_input(string_to_search)
|
|
133
135
|
|
|
134
|
-
# Handle
|
|
136
|
+
# Handle empty input
|
|
135
137
|
if not actual_search_query:
|
|
136
138
|
if bot:
|
|
137
|
-
if actual_search_query is None:
|
|
139
|
+
if actual_search_query is None:
|
|
138
140
|
bot.send_message("Search term not provided or operation cancelled. Returning.", None)
|
|
139
|
-
return
|
|
140
|
-
|
|
141
|
-
#
|
|
142
|
-
len_database = title_search(
|
|
141
|
+
return False
|
|
142
|
+
|
|
143
|
+
# Search on database
|
|
144
|
+
len_database = title_search(actual_search_query)
|
|
143
145
|
|
|
144
146
|
# If only the database is needed, return the manager
|
|
145
147
|
if get_onlyDatabase:
|
|
146
148
|
return media_search_manager
|
|
147
|
-
|
|
149
|
+
|
|
148
150
|
if len_database > 0:
|
|
149
151
|
select_title = get_select_title(table_show_manager, media_search_manager, len_database)
|
|
150
|
-
process_search_result(select_title, selections)
|
|
151
|
-
return
|
|
152
|
+
result = process_search_result(select_title, selections)
|
|
153
|
+
return result
|
|
152
154
|
|
|
153
155
|
else:
|
|
154
156
|
if bot:
|
|
155
157
|
bot.send_message(f"No results found for: '{actual_search_query}'", None)
|
|
156
158
|
else:
|
|
157
159
|
console.print(f"\n[red]Nothing matching was found for[white]: [purple]{actual_search_query}")
|
|
158
|
-
|
|
159
|
-
# Do not call search() recursively here to avoid infinite loops on no results.
|
|
160
|
-
# The flow should return to the caller (e.g., main menu in run.py).
|
|
161
|
-
return
|
|
160
|
+
return False
|
|
@@ -109,6 +109,10 @@ def download_episode(index_season_selected: int, scrape_serie: GetSerieInfo, dow
|
|
|
109
109
|
episodes = scrape_serie.getEpisodeSeasons(index_season_selected)
|
|
110
110
|
episodes_count = len(episodes)
|
|
111
111
|
|
|
112
|
+
if episodes_count == 0:
|
|
113
|
+
console.print(f"[red]No episodes found for season {index_season_selected}")
|
|
114
|
+
return
|
|
115
|
+
|
|
112
116
|
if download_all:
|
|
113
117
|
for i_episode in range(1, episodes_count + 1):
|
|
114
118
|
path, stopped = download_video(index_season_selected, i_episode, scrape_serie)
|
|
@@ -104,6 +104,8 @@ def process_search_result(select_title, selections=None):
|
|
|
104
104
|
episode_selection = selections.get('episode')
|
|
105
105
|
|
|
106
106
|
download_series(select_title, season_selection, episode_selection)
|
|
107
|
+
media_search_manager.clear()
|
|
108
|
+
table_show_manager.clear()
|
|
107
109
|
return True
|
|
108
110
|
|
|
109
111
|
def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_item: dict = None, selections: dict = None):
|
|
@@ -120,40 +122,37 @@ def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_
|
|
|
120
122
|
bot = None
|
|
121
123
|
if site_constant.TELEGRAM_BOT:
|
|
122
124
|
bot = get_bot_instance()
|
|
123
|
-
|
|
125
|
+
|
|
124
126
|
if direct_item:
|
|
125
127
|
select_title = MediaItem(**direct_item)
|
|
126
|
-
process_search_result(select_title, selections)
|
|
127
|
-
return
|
|
128
|
+
result = process_search_result(select_title, selections)
|
|
129
|
+
return result
|
|
128
130
|
|
|
129
131
|
# Get the user input for the search term
|
|
130
132
|
actual_search_query = get_user_input(string_to_search)
|
|
131
133
|
|
|
132
|
-
# Handle
|
|
134
|
+
# Handle empty input
|
|
133
135
|
if not actual_search_query:
|
|
134
136
|
if bot:
|
|
135
|
-
if actual_search_query is None:
|
|
137
|
+
if actual_search_query is None:
|
|
136
138
|
bot.send_message("Search term not provided or operation cancelled. Returning.", None)
|
|
137
|
-
return
|
|
138
|
-
|
|
139
|
-
#
|
|
139
|
+
return False
|
|
140
|
+
|
|
141
|
+
# Search on database
|
|
140
142
|
len_database = title_search(actual_search_query)
|
|
141
143
|
|
|
142
144
|
# If only the database is needed, return the manager
|
|
143
145
|
if get_onlyDatabase:
|
|
144
146
|
return media_search_manager
|
|
145
|
-
|
|
147
|
+
|
|
146
148
|
if len_database > 0:
|
|
147
149
|
select_title = get_select_title(table_show_manager, media_search_manager, len_database)
|
|
148
|
-
process_search_result(select_title, selections)
|
|
149
|
-
return
|
|
150
|
+
result = process_search_result(select_title, selections)
|
|
151
|
+
return result
|
|
150
152
|
|
|
151
153
|
else:
|
|
152
154
|
if bot:
|
|
153
155
|
bot.send_message(f"No results found for: '{actual_search_query}'", None)
|
|
154
156
|
else:
|
|
155
157
|
console.print(f"\n[red]Nothing matching was found for[white]: [purple]{actual_search_query}")
|
|
156
|
-
|
|
157
|
-
# Do not call search() recursively here to avoid infinite loops on no results.
|
|
158
|
-
# The flow should return to the caller (e.g., main menu in run.py).
|
|
159
|
-
return
|
|
158
|
+
return False
|
|
@@ -48,7 +48,7 @@ def download_episode(index_select: int, scrape_serie: ScrapeSerieAnime, video_so
|
|
|
48
48
|
|
|
49
49
|
# Get episode information
|
|
50
50
|
obj_episode = scrape_serie.selectEpisode(1, index_select)
|
|
51
|
-
console.print(f"[bold yellow]Download:[/bold yellow] [red]{site_constant.SITE_NAME}[/red] ([cyan]E{obj_episode.number}[/cyan]) \n")
|
|
51
|
+
console.print(f"[bold yellow]Download:[/bold yellow] [red]{site_constant.SITE_NAME}[/red] → [cyan]{scrape_serie.series_name}[/cyan] ([cyan]E{obj_episode.number}[/cyan]) \n")
|
|
52
52
|
|
|
53
53
|
if site_constant.TELEGRAM_BOT:
|
|
54
54
|
bot = get_bot_instance()
|
|
@@ -95,11 +95,15 @@ def process_search_result(select_title, selections=None):
|
|
|
95
95
|
episode_selection = None
|
|
96
96
|
if selections:
|
|
97
97
|
episode_selection = selections.get('episode')
|
|
98
|
+
|
|
98
99
|
download_series(select_title, episode_selection)
|
|
100
|
+
media_search_manager.clear()
|
|
101
|
+
table_show_manager.clear()
|
|
99
102
|
return True
|
|
100
103
|
|
|
101
104
|
else:
|
|
102
105
|
download_film(select_title)
|
|
106
|
+
table_show_manager.clear()
|
|
103
107
|
return True
|
|
104
108
|
|
|
105
109
|
def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_item: dict = None, selections: dict = None):
|
|
@@ -119,36 +123,34 @@ def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_
|
|
|
119
123
|
|
|
120
124
|
if direct_item:
|
|
121
125
|
select_title = MediaItem(**direct_item)
|
|
122
|
-
process_search_result(select_title, selections)
|
|
123
|
-
return
|
|
124
|
-
|
|
126
|
+
result = process_search_result(select_title, selections)
|
|
127
|
+
return result
|
|
128
|
+
|
|
125
129
|
# Get the user input for the search term
|
|
126
130
|
actual_search_query = get_user_input(string_to_search)
|
|
127
131
|
|
|
128
|
-
#
|
|
132
|
+
# Handle empty input
|
|
129
133
|
if not actual_search_query:
|
|
130
134
|
if bot:
|
|
131
135
|
if actual_search_query is None:
|
|
132
136
|
bot.send_message("Search term not provided or operation cancelled. Returning.", None)
|
|
133
|
-
return
|
|
137
|
+
return False
|
|
134
138
|
|
|
139
|
+
# Search on database
|
|
135
140
|
len_database = title_search(actual_search_query)
|
|
136
141
|
|
|
137
142
|
# If only the database is needed, return the manager
|
|
138
143
|
if get_onlyDatabase:
|
|
139
144
|
return media_search_manager
|
|
140
|
-
|
|
145
|
+
|
|
141
146
|
if len_database > 0:
|
|
142
147
|
select_title = get_select_title(table_show_manager, media_search_manager, len_database)
|
|
143
|
-
process_search_result(select_title, selections)
|
|
144
|
-
return
|
|
145
|
-
|
|
148
|
+
result = process_search_result(select_title, selections)
|
|
149
|
+
return result
|
|
150
|
+
|
|
146
151
|
else:
|
|
147
152
|
if bot:
|
|
148
153
|
bot.send_message(f"No results found for: '{actual_search_query}'", None)
|
|
149
154
|
else:
|
|
150
155
|
console.print(f"\n[red]Nothing matching was found for[white]: [purple]{actual_search_query}")
|
|
151
|
-
|
|
152
|
-
# Do not call search() recursively here to avoid infinite loops on no results.
|
|
153
|
-
# The flow should return to the caller (e.g., main menu in run.py).
|
|
154
|
-
return
|
|
156
|
+
return False
|
|
@@ -47,7 +47,7 @@ def download_episode(index_select: int, scrape_serie: ScrapSerie) -> Tuple[str,b
|
|
|
47
47
|
|
|
48
48
|
# Get episode information
|
|
49
49
|
episode_data = scrape_serie.selectEpisode(1, index_select)
|
|
50
|
-
console.print(f"[bold yellow]Download:[/bold yellow] [red]{site_constant.SITE_NAME}[/red] ([cyan]E{index_select+1}[/cyan]) \n")
|
|
50
|
+
console.print(f"[bold yellow]Download:[/bold yellow] [red]{site_constant.SITE_NAME}[/red] → [cyan]{scrape_serie.get_name()}[/cyan] ([cyan]E{str(index_select+1)}[/cyan]) \n")
|
|
51
51
|
|
|
52
52
|
# Define filename and path for the downloaded video
|
|
53
53
|
mp4_name = f"{scrape_serie.get_name()}_EP_{dynamic_format_number(str(index_select+1))}.mp4"
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
import sys
|
|
4
4
|
import subprocess
|
|
5
|
-
from urllib.parse import quote_plus
|
|
6
5
|
|
|
7
6
|
|
|
8
7
|
# External library
|
|
@@ -101,10 +100,13 @@ def process_search_result(select_title, selections=None):
|
|
|
101
100
|
episode_selection = selections.get('episode')
|
|
102
101
|
|
|
103
102
|
download_series(select_title, season_selection, episode_selection)
|
|
103
|
+
media_search_manager.clear()
|
|
104
|
+
table_show_manager.clear()
|
|
104
105
|
return True
|
|
105
106
|
|
|
106
107
|
else:
|
|
107
108
|
download_film(select_title)
|
|
109
|
+
table_show_manager.clear()
|
|
108
110
|
return True
|
|
109
111
|
|
|
110
112
|
# search("Game of Thrones", selections={"season": "1", "episode": "1-3"})
|
|
@@ -122,40 +124,37 @@ def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_
|
|
|
122
124
|
bot = None
|
|
123
125
|
if site_constant.TELEGRAM_BOT:
|
|
124
126
|
bot = get_bot_instance()
|
|
125
|
-
|
|
127
|
+
|
|
126
128
|
if direct_item:
|
|
127
129
|
select_title = MediaItem(**direct_item)
|
|
128
|
-
process_search_result(select_title, selections)
|
|
129
|
-
return
|
|
130
|
+
result = process_search_result(select_title, selections)
|
|
131
|
+
return result
|
|
130
132
|
|
|
131
133
|
# Get the user input for the search term
|
|
132
134
|
actual_search_query = get_user_input(string_to_search)
|
|
133
135
|
|
|
134
|
-
# Handle
|
|
136
|
+
# Handle empty input
|
|
135
137
|
if not actual_search_query:
|
|
136
138
|
if bot:
|
|
137
|
-
if actual_search_query is None:
|
|
139
|
+
if actual_search_query is None:
|
|
138
140
|
bot.send_message("Search term not provided or operation cancelled. Returning.", None)
|
|
139
|
-
return
|
|
140
|
-
|
|
141
|
-
#
|
|
142
|
-
len_database = title_search(
|
|
141
|
+
return False
|
|
142
|
+
|
|
143
|
+
# Search on database
|
|
144
|
+
len_database = title_search(actual_search_query)
|
|
143
145
|
|
|
144
146
|
# If only the database is needed, return the manager
|
|
145
147
|
if get_onlyDatabase:
|
|
146
148
|
return media_search_manager
|
|
147
|
-
|
|
149
|
+
|
|
148
150
|
if len_database > 0:
|
|
149
151
|
select_title = get_select_title(table_show_manager, media_search_manager, len_database)
|
|
150
|
-
process_search_result(select_title, selections)
|
|
151
|
-
return
|
|
152
|
+
result = process_search_result(select_title, selections)
|
|
153
|
+
return result
|
|
152
154
|
|
|
153
155
|
else:
|
|
154
156
|
if bot:
|
|
155
157
|
bot.send_message(f"No results found for: '{actual_search_query}'", None)
|
|
156
158
|
else:
|
|
157
159
|
console.print(f"\n[red]Nothing matching was found for[white]: [purple]{actual_search_query}")
|
|
158
|
-
|
|
159
|
-
# Do not call search() recursively here to avoid infinite loops on no results.
|
|
160
|
-
# The flow should return to the caller (e.g., main menu in run.py).
|
|
161
|
-
return
|
|
160
|
+
return False
|
|
@@ -55,7 +55,8 @@ def download_video(index_season_selected: int, index_episode_selected: int, scra
|
|
|
55
55
|
|
|
56
56
|
# Get episode information
|
|
57
57
|
obj_episode = scrape_serie.selectEpisode(index_season_selected, index_episode_selected-1)
|
|
58
|
-
|
|
58
|
+
|
|
59
|
+
console.print(f"[bold yellow]Download:[/bold yellow] [red]{site_constant.SITE_NAME}[/red] → [cyan]{scrape_serie.series_name}[/cyan] \\ [bold magenta]{obj_episode.get('name')}[/bold magenta] ([cyan]S{index_season_selected}E{index_episode_selected}[/cyan]) \n")
|
|
59
60
|
|
|
60
61
|
# Define filename and path for the downloaded video
|
|
61
62
|
mp4_name = f"{map_episode_title(scrape_serie.series_name, index_season_selected, index_episode_selected, obj_episode.get('name'))}.mp4"
|
|
@@ -117,6 +118,10 @@ def download_episode(index_season_selected: int, scrape_serie: GetSerieInfo, dow
|
|
|
117
118
|
episodes = scrape_serie.getEpisodeSeasons(index_season_selected)
|
|
118
119
|
episodes_count = len(episodes)
|
|
119
120
|
|
|
121
|
+
if episodes_count == 0:
|
|
122
|
+
console.print(f"[red]No episodes found for season {index_season_selected}")
|
|
123
|
+
return
|
|
124
|
+
|
|
120
125
|
if download_all:
|
|
121
126
|
for i_episode in range(1, episodes_count + 1):
|
|
122
127
|
path, stopped = download_video(index_season_selected, i_episode, scrape_serie)
|