StreamingCommunity 1.8.0__py3-none-any.whl → 1.9.2__py3-none-any.whl
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/run.py +18 -13
- {StreamingCommunity-1.8.0.dist-info → StreamingCommunity-1.9.2.dist-info}/METADATA +157 -63
- StreamingCommunity-1.9.2.dist-info/RECORD +7 -0
- {StreamingCommunity-1.8.0.dist-info → StreamingCommunity-1.9.2.dist-info}/WHEEL +1 -1
- {StreamingCommunity-1.8.0.dist-info → StreamingCommunity-1.9.2.dist-info}/entry_points.txt +1 -0
- StreamingCommunity/Src/Api/Player/Helper/Vixcloud/js_parser.py +0 -143
- StreamingCommunity/Src/Api/Player/Helper/Vixcloud/util.py +0 -166
- StreamingCommunity/Src/Api/Player/ddl.py +0 -89
- StreamingCommunity/Src/Api/Player/maxstream.py +0 -151
- StreamingCommunity/Src/Api/Player/supervideo.py +0 -194
- StreamingCommunity/Src/Api/Player/vixcloud.py +0 -224
- StreamingCommunity/Src/Api/Site/1337xx/__init__.py +0 -50
- StreamingCommunity/Src/Api/Site/1337xx/costant.py +0 -15
- StreamingCommunity/Src/Api/Site/1337xx/site.py +0 -84
- StreamingCommunity/Src/Api/Site/1337xx/title.py +0 -66
- StreamingCommunity/Src/Api/Site/altadefinizione/__init__.py +0 -50
- StreamingCommunity/Src/Api/Site/altadefinizione/costant.py +0 -15
- StreamingCommunity/Src/Api/Site/altadefinizione/film.py +0 -69
- StreamingCommunity/Src/Api/Site/altadefinizione/site.py +0 -86
- StreamingCommunity/Src/Api/Site/animeunity/__init__.py +0 -50
- StreamingCommunity/Src/Api/Site/animeunity/anime.py +0 -126
- StreamingCommunity/Src/Api/Site/animeunity/costant.py +0 -15
- StreamingCommunity/Src/Api/Site/animeunity/film_serie.py +0 -131
- StreamingCommunity/Src/Api/Site/animeunity/site.py +0 -165
- StreamingCommunity/Src/Api/Site/animeunity/util/ScrapeSerie.py +0 -97
- StreamingCommunity/Src/Api/Site/bitsearch/__init__.py +0 -51
- StreamingCommunity/Src/Api/Site/bitsearch/costant.py +0 -15
- StreamingCommunity/Src/Api/Site/bitsearch/site.py +0 -84
- StreamingCommunity/Src/Api/Site/bitsearch/title.py +0 -47
- StreamingCommunity/Src/Api/Site/cb01new/__init__.py +0 -51
- StreamingCommunity/Src/Api/Site/cb01new/costant.py +0 -15
- StreamingCommunity/Src/Api/Site/cb01new/film.py +0 -69
- StreamingCommunity/Src/Api/Site/cb01new/site.py +0 -74
- StreamingCommunity/Src/Api/Site/ddlstreamitaly/Player/ScrapeSerie.py +0 -83
- StreamingCommunity/Src/Api/Site/ddlstreamitaly/__init__.py +0 -57
- StreamingCommunity/Src/Api/Site/ddlstreamitaly/costant.py +0 -16
- StreamingCommunity/Src/Api/Site/ddlstreamitaly/series.py +0 -142
- StreamingCommunity/Src/Api/Site/ddlstreamitaly/site.py +0 -93
- StreamingCommunity/Src/Api/Site/ddlstreamitaly/util/ScrapeSerie.py +0 -83
- StreamingCommunity/Src/Api/Site/guardaserie/Player/ScrapeSerie.py +0 -110
- StreamingCommunity/Src/Api/Site/guardaserie/__init__.py +0 -52
- StreamingCommunity/Src/Api/Site/guardaserie/costant.py +0 -15
- StreamingCommunity/Src/Api/Site/guardaserie/series.py +0 -195
- StreamingCommunity/Src/Api/Site/guardaserie/site.py +0 -84
- StreamingCommunity/Src/Api/Site/guardaserie/util/ScrapeSerie.py +0 -110
- StreamingCommunity/Src/Api/Site/mostraguarda/__init__.py +0 -48
- StreamingCommunity/Src/Api/Site/mostraguarda/costant.py +0 -15
- StreamingCommunity/Src/Api/Site/mostraguarda/film.py +0 -94
- StreamingCommunity/Src/Api/Site/piratebays/__init__.py +0 -50
- StreamingCommunity/Src/Api/Site/piratebays/costant.py +0 -15
- StreamingCommunity/Src/Api/Site/piratebays/site.py +0 -89
- StreamingCommunity/Src/Api/Site/piratebays/title.py +0 -45
- StreamingCommunity/Src/Api/Site/streamingcommunity/__init__.py +0 -55
- StreamingCommunity/Src/Api/Site/streamingcommunity/costant.py +0 -15
- StreamingCommunity/Src/Api/Site/streamingcommunity/film.py +0 -70
- StreamingCommunity/Src/Api/Site/streamingcommunity/series.py +0 -203
- StreamingCommunity/Src/Api/Site/streamingcommunity/site.py +0 -126
- StreamingCommunity/Src/Api/Site/streamingcommunity/util/ScrapeSerie.py +0 -113
- StreamingCommunity/Src/Api/Template/Class/SearchType.py +0 -101
- StreamingCommunity/Src/Api/Template/Util/__init__.py +0 -5
- StreamingCommunity/Src/Api/Template/Util/get_domain.py +0 -137
- StreamingCommunity/Src/Api/Template/Util/manage_ep.py +0 -153
- StreamingCommunity/Src/Api/Template/Util/recall_search.py +0 -37
- StreamingCommunity/Src/Api/Template/__init__.py +0 -3
- StreamingCommunity/Src/Api/Template/site.py +0 -87
- StreamingCommunity/Src/Lib/Downloader/HLS/downloader.py +0 -968
- StreamingCommunity/Src/Lib/Downloader/HLS/proxyes.py +0 -110
- StreamingCommunity/Src/Lib/Downloader/HLS/segments.py +0 -540
- StreamingCommunity/Src/Lib/Downloader/MP4/downloader.py +0 -156
- StreamingCommunity/Src/Lib/Downloader/TOR/downloader.py +0 -222
- StreamingCommunity/Src/Lib/Downloader/__init__.py +0 -5
- StreamingCommunity/Src/Lib/Driver/driver_1.py +0 -76
- StreamingCommunity/Src/Lib/FFmpeg/__init__.py +0 -4
- StreamingCommunity/Src/Lib/FFmpeg/capture.py +0 -170
- StreamingCommunity/Src/Lib/FFmpeg/command.py +0 -292
- StreamingCommunity/Src/Lib/FFmpeg/util.py +0 -242
- StreamingCommunity/Src/Lib/M3U8/__init__.py +0 -6
- StreamingCommunity/Src/Lib/M3U8/decryptor.py +0 -129
- StreamingCommunity/Src/Lib/M3U8/estimator.py +0 -173
- StreamingCommunity/Src/Lib/M3U8/parser.py +0 -666
- StreamingCommunity/Src/Lib/M3U8/url_fixer.py +0 -52
- StreamingCommunity/Src/Lib/TMBD/__init__.py +0 -2
- StreamingCommunity/Src/Lib/TMBD/obj_tmbd.py +0 -39
- StreamingCommunity/Src/Lib/TMBD/tmdb.py +0 -346
- StreamingCommunity/Src/Upload/update.py +0 -64
- StreamingCommunity/Src/Upload/version.py +0 -5
- StreamingCommunity/Src/Util/_jsonConfig.py +0 -204
- StreamingCommunity/Src/Util/call_stack.py +0 -42
- StreamingCommunity/Src/Util/color.py +0 -20
- StreamingCommunity/Src/Util/console.py +0 -12
- StreamingCommunity/Src/Util/headers.py +0 -147
- StreamingCommunity/Src/Util/logger.py +0 -53
- StreamingCommunity/Src/Util/message.py +0 -46
- StreamingCommunity/Src/Util/os.py +0 -417
- StreamingCommunity/Src/Util/table.py +0 -163
- StreamingCommunity-1.8.0.dist-info/RECORD +0 -97
- {StreamingCommunity-1.8.0.dist-info → StreamingCommunity-1.9.2.dist-info}/LICENSE +0 -0
- {StreamingCommunity-1.8.0.dist-info → StreamingCommunity-1.9.2.dist-info}/top_level.txt +0 -0
StreamingCommunity/run.py
CHANGED
|
@@ -12,13 +12,13 @@ from typing import Callable
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
# Internal utilities
|
|
15
|
-
from StreamingCommunity.
|
|
16
|
-
from StreamingCommunity.
|
|
17
|
-
from StreamingCommunity.
|
|
18
|
-
from StreamingCommunity.
|
|
19
|
-
from StreamingCommunity.
|
|
20
|
-
from StreamingCommunity.
|
|
21
|
-
from StreamingCommunity.
|
|
15
|
+
from StreamingCommunity.Util.message import start_message
|
|
16
|
+
from StreamingCommunity.Util.console import console, msg
|
|
17
|
+
from StreamingCommunity.Util._jsonConfig import config_manager
|
|
18
|
+
from StreamingCommunity.Upload.update import update as git_update
|
|
19
|
+
from StreamingCommunity.Util.os import os_summary
|
|
20
|
+
from StreamingCommunity.Lib.TMBD import tmdb
|
|
21
|
+
from StreamingCommunity.Util.logger import Logger
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
# Config
|
|
@@ -45,8 +45,13 @@ def load_search_functions():
|
|
|
45
45
|
modules = []
|
|
46
46
|
loaded_functions = {}
|
|
47
47
|
|
|
48
|
-
#
|
|
49
|
-
|
|
48
|
+
# Find api home directory
|
|
49
|
+
if getattr(sys, 'frozen', False): # Modalità PyInstaller
|
|
50
|
+
base_path = os.path.join(sys._MEIPASS, "StreamingCommunity")
|
|
51
|
+
else:
|
|
52
|
+
base_path = os.path.dirname(__file__)
|
|
53
|
+
|
|
54
|
+
api_dir = os.path.join(base_path, 'Api', 'Site')
|
|
50
55
|
init_files = glob.glob(os.path.join(api_dir, '*', '__init__.py'))
|
|
51
56
|
|
|
52
57
|
# Retrieve modules and their indices
|
|
@@ -58,7 +63,7 @@ def load_search_functions():
|
|
|
58
63
|
|
|
59
64
|
try:
|
|
60
65
|
# Dynamically import the module
|
|
61
|
-
mod = importlib.import_module(f'StreamingCommunity.
|
|
66
|
+
mod = importlib.import_module(f'StreamingCommunity.Api.Site.{module_name}')
|
|
62
67
|
|
|
63
68
|
# Get 'indice' from the module
|
|
64
69
|
indice = getattr(mod, 'indice', 0)
|
|
@@ -83,7 +88,7 @@ def load_search_functions():
|
|
|
83
88
|
try:
|
|
84
89
|
|
|
85
90
|
# Dynamically import the module
|
|
86
|
-
mod = importlib.import_module(f'StreamingCommunity.
|
|
91
|
+
mod = importlib.import_module(f'StreamingCommunity.Api.Site.{module_name}')
|
|
87
92
|
|
|
88
93
|
# Get the search function from the module (assuming the function is named 'search' and defined in __init__.py)
|
|
89
94
|
search_function = getattr(mod, 'search')
|
|
@@ -127,7 +132,7 @@ def initialize():
|
|
|
127
132
|
print()
|
|
128
133
|
tmdb.display_trending_tv_shows()
|
|
129
134
|
print()
|
|
130
|
-
|
|
135
|
+
|
|
131
136
|
|
|
132
137
|
def main():
|
|
133
138
|
|
|
@@ -178,7 +183,7 @@ def main():
|
|
|
178
183
|
|
|
179
184
|
# Display the category legend in a single line
|
|
180
185
|
legend_text = " | ".join([f"[{color}]{category.capitalize()}[/{color}]" for category, color in color_map.items()])
|
|
181
|
-
console.print(f"[bold green]Category Legend:[/bold green] {legend_text}")
|
|
186
|
+
console.print(f"\n[bold green]Category Legend:[/bold green] {legend_text}")
|
|
182
187
|
|
|
183
188
|
# Construct the prompt message with color-coded site names
|
|
184
189
|
prompt_message = "[green]Insert category [white](" + ", ".join(
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: StreamingCommunity
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.9.2
|
|
4
|
+
Summary: UNKNOWN
|
|
4
5
|
Home-page: https://github.com/Lovi-0/StreamingCommunity
|
|
5
6
|
Author: Lovi-0
|
|
7
|
+
License: UNKNOWN
|
|
6
8
|
Project-URL: Bug Reports, https://github.com/Lovi-0/StreamingCommunity/issues
|
|
7
9
|
Project-URL: Source, https://github.com/Lovi-0/StreamingCommunity
|
|
8
10
|
Keywords: streaming community
|
|
11
|
+
Platform: UNKNOWN
|
|
9
12
|
Requires-Python: >=3.8
|
|
10
13
|
Description-Content-Type: text/markdown
|
|
11
|
-
License-File: LICENSE
|
|
12
14
|
Requires-Dist: httpx
|
|
13
15
|
Requires-Dist: bs4
|
|
14
16
|
Requires-Dist: rich
|
|
@@ -18,7 +20,8 @@ Requires-Dist: psutil
|
|
|
18
20
|
Requires-Dist: unidecode
|
|
19
21
|
Requires-Dist: jsbeautifier
|
|
20
22
|
Requires-Dist: pathvalidate
|
|
21
|
-
Requires-Dist:
|
|
23
|
+
Requires-Dist: pycryptodome
|
|
24
|
+
Requires-Dist: fake-useragent==1.1.3
|
|
22
25
|
Requires-Dist: qbittorrent-api
|
|
23
26
|
Requires-Dist: python-qbittorrent
|
|
24
27
|
Requires-Dist: googlesearch-python
|
|
@@ -29,25 +32,34 @@ Requires-Dist: googlesearch-python
|
|
|
29
32
|
|
|
30
33
|
A versatile script designed to download films and series from various supported streaming platforms.
|
|
31
34
|
|
|
32
|
-
|
|
35
|
+
# 🤝 Join our Community
|
|
33
36
|
|
|
34
37
|
Chat, contribute, and have fun in our **Git_StreamingCommunity** Discord [Server](https://discord.com/invite/8vV68UGRc7)
|
|
35
38
|
|
|
36
|
-
|
|
39
|
+
# 📋 Table of Contents
|
|
37
40
|
|
|
41
|
+
- [Website available](#website-status)
|
|
38
42
|
- [Installation](#installation)
|
|
39
|
-
- [PyPI Installation](#pypi-installation)
|
|
40
|
-
- [Automatic Installation](#automatic-installation)
|
|
41
|
-
- [Manual Installation](#manual-installation)
|
|
43
|
+
- [PyPI Installation](#1-pypi-installation)
|
|
44
|
+
- [Automatic Installation](#2-automatic-installation)
|
|
45
|
+
- [Manual Installation](#3-manual-installation)
|
|
42
46
|
- [Win 7](https://github.com/Ghost6446/StreamingCommunity_api/wiki/Installation#win-7)
|
|
43
47
|
- [Termux](https://github.com/Ghost6446/StreamingCommunity_api/wiki/Termux)
|
|
44
48
|
- [Configuration](#configuration)
|
|
45
|
-
- [
|
|
49
|
+
- [Default](#default-settings)
|
|
50
|
+
- [Request](#requests-settings)
|
|
51
|
+
- [Browser](#browser-settings)
|
|
52
|
+
- [Download](#m3u8_download-settings)
|
|
53
|
+
- [Parser](#m3u8_parser-settings)
|
|
54
|
+
- [Docker](#docker)
|
|
55
|
+
- [Tutorial](#tutorials)
|
|
46
56
|
- [To Do](#to-do)
|
|
47
57
|
|
|
48
|
-
## 💻 Installation
|
|
49
58
|
|
|
50
|
-
|
|
59
|
+
|
|
60
|
+
# Installation
|
|
61
|
+
|
|
62
|
+
## 1. PyPI Installation
|
|
51
63
|
|
|
52
64
|
Install directly from PyPI:
|
|
53
65
|
|
|
@@ -55,7 +67,7 @@ Install directly from PyPI:
|
|
|
55
67
|
pip install StreamingCommunity
|
|
56
68
|
```
|
|
57
69
|
|
|
58
|
-
|
|
70
|
+
### Creating a Run Script
|
|
59
71
|
|
|
60
72
|
Create `run_streaming.py`:
|
|
61
73
|
|
|
@@ -71,15 +83,15 @@ Run the script:
|
|
|
71
83
|
python run_streaming.py
|
|
72
84
|
```
|
|
73
85
|
|
|
74
|
-
|
|
86
|
+
## Updating via PyPI
|
|
75
87
|
|
|
76
88
|
```bash
|
|
77
89
|
pip install --upgrade StreamingCommunity
|
|
78
90
|
```
|
|
79
91
|
|
|
80
|
-
|
|
92
|
+
## 2. Automatic Installation
|
|
81
93
|
|
|
82
|
-
|
|
94
|
+
### Supported Operating Systems 💿
|
|
83
95
|
|
|
84
96
|
| OS | Automatic Installation Support |
|
|
85
97
|
|:----------------|:------------------------------:|
|
|
@@ -92,95 +104,99 @@ pip install --upgrade StreamingCommunity
|
|
|
92
104
|
| MacOS | ✔️ |
|
|
93
105
|
| Termux | ❌ |
|
|
94
106
|
|
|
95
|
-
|
|
107
|
+
### Installation Steps
|
|
96
108
|
|
|
97
|
-
|
|
109
|
+
#### On Windows:
|
|
98
110
|
|
|
99
111
|
```powershell
|
|
100
112
|
.\win_install.bat
|
|
101
113
|
```
|
|
102
114
|
|
|
103
|
-
|
|
115
|
+
#### On Linux/MacOS/BSD:
|
|
104
116
|
|
|
105
117
|
```bash
|
|
106
118
|
sudo chmod +x unix_install.sh && ./unix_install.sh
|
|
107
119
|
```
|
|
108
120
|
|
|
109
|
-
|
|
121
|
+
### Usage
|
|
110
122
|
|
|
111
|
-
|
|
123
|
+
#### On Windows:
|
|
112
124
|
|
|
113
125
|
```powershell
|
|
114
|
-
python .\
|
|
126
|
+
python .\test_run.py
|
|
115
127
|
```
|
|
116
128
|
|
|
117
129
|
or
|
|
118
130
|
|
|
119
131
|
```powershell
|
|
120
|
-
source .venv/bin/activate && python
|
|
132
|
+
source .venv/bin/activate && python test_run.py && deactivate
|
|
121
133
|
```
|
|
122
134
|
|
|
123
|
-
|
|
135
|
+
#### On Linux/MacOS/BSD:
|
|
124
136
|
|
|
125
137
|
```bash
|
|
126
|
-
./
|
|
138
|
+
./test_run.py
|
|
127
139
|
```
|
|
128
140
|
|
|
129
|
-
|
|
141
|
+
## 3. Manual Installation
|
|
130
142
|
|
|
131
|
-
|
|
143
|
+
### Requirements 📋
|
|
132
144
|
|
|
133
145
|
Prerequisites:
|
|
134
146
|
* [Python](https://www.python.org/downloads/) > 3.8
|
|
135
147
|
* [FFmpeg](https://www.gyan.dev/ffmpeg/builds/)
|
|
136
148
|
|
|
137
|
-
|
|
149
|
+
### Install Python Dependencies
|
|
138
150
|
|
|
139
151
|
```bash
|
|
140
152
|
pip install -r requirements.txt
|
|
141
153
|
```
|
|
142
154
|
|
|
143
|
-
|
|
155
|
+
### Usage
|
|
144
156
|
|
|
145
|
-
|
|
157
|
+
#### On Windows:
|
|
146
158
|
|
|
147
159
|
```powershell
|
|
148
|
-
python
|
|
160
|
+
python test_run.py
|
|
149
161
|
```
|
|
150
162
|
|
|
151
|
-
|
|
163
|
+
#### On Linux/MacOS:
|
|
152
164
|
|
|
153
165
|
```bash
|
|
154
|
-
python3
|
|
166
|
+
python3 test_run.py
|
|
155
167
|
```
|
|
156
168
|
|
|
157
|
-
|
|
169
|
+
## Update
|
|
158
170
|
|
|
159
171
|
Keep your script up to date with the latest features by running:
|
|
160
172
|
|
|
161
|
-
|
|
173
|
+
### On Windows:
|
|
162
174
|
|
|
163
175
|
```powershell
|
|
164
176
|
python update.py
|
|
165
177
|
```
|
|
166
178
|
|
|
167
|
-
|
|
179
|
+
### On Linux/MacOS:
|
|
168
180
|
|
|
169
181
|
```bash
|
|
170
182
|
python3 update.py
|
|
171
183
|
```
|
|
172
184
|
|
|
173
|
-
|
|
185
|
+
<br>
|
|
186
|
+
|
|
187
|
+
# Configuration
|
|
174
188
|
|
|
175
189
|
You can change some behaviors by tweaking the configuration file.
|
|
176
190
|
|
|
177
191
|
The configuration file is divided into several main sections:
|
|
178
192
|
|
|
179
|
-
|
|
193
|
+
## DEFAULT Settings
|
|
180
194
|
|
|
181
195
|
```json
|
|
182
196
|
{
|
|
183
197
|
"root_path": "Video",
|
|
198
|
+
"movie_folder_name": "Movie",
|
|
199
|
+
"serie_folder_name": "TV",
|
|
184
200
|
"map_episode_name": "%(tv_name)_S%(season)E%(episode)_%(episode_name)",
|
|
185
201
|
"not_close": false,
|
|
186
202
|
"show_trending": false
|
|
@@ -189,15 +205,17 @@ The configuration file is divided into several main sections:
|
|
|
189
205
|
|
|
190
206
|
- `root_path`: Directory where all videos will be saved
|
|
191
207
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
208
|
+
### Path examples:
|
|
195
209
|
* Windows: `C:\\MyLibrary\\Folder` or `\\\\MyServer\\MyLibrary` (if you want to use a network folder)
|
|
196
210
|
* Linux/MacOS: `Desktop/MyLibrary/Folder`
|
|
197
211
|
`<br/><br/>`
|
|
212
|
+
|
|
213
|
+
- `movie_folder_name`: The name of the subdirectory where movies will be stored.
|
|
214
|
+
- `serie_folder_name`: The name of the subdirectory where TV series will be stored.
|
|
215
|
+
|
|
198
216
|
- `map_episode_name`: Template for TV series episode filenames
|
|
199
217
|
|
|
200
|
-
|
|
218
|
+
### Episode name usage:
|
|
201
219
|
|
|
202
220
|
You can choose different vars:
|
|
203
221
|
|
|
@@ -207,26 +225,28 @@ The configuration file is divided into several main sections:
|
|
|
207
225
|
* `%(episode)` : Is the number of the episode
|
|
208
226
|
* `%(episode_name)` : Is the name of the episode
|
|
209
227
|
`<br/><br/>`
|
|
210
|
-
|
|
228
|
+
|
|
211
229
|
- `not_close`: If true, continues running after downloading
|
|
212
230
|
- `show_trending`: Display trending content on startup
|
|
213
231
|
|
|
214
|
-
|
|
232
|
+
### qBittorrent Configuration
|
|
215
233
|
|
|
216
|
-
```json
|
|
217
|
-
{
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
234
|
+
```json
|
|
235
|
+
{
|
|
236
|
+
"config_qbit_tor": {
|
|
237
|
+
"host": "192.168.1.59",
|
|
238
|
+
"port": "8080",
|
|
239
|
+
"user": "admin",
|
|
240
|
+
"pass": "adminadmin"
|
|
241
|
+
}
|
|
223
242
|
}
|
|
224
|
-
|
|
225
|
-
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
To enable qBittorrent integration, follow the setup guide [here](https://github.com/lgallard/qBittorrent-Controller/wiki/How-to-enable-the-qBittorrent-Web-UI).
|
|
226
246
|
|
|
227
|
-
|
|
247
|
+
<br>
|
|
228
248
|
|
|
229
|
-
|
|
249
|
+
## REQUESTS Settings
|
|
230
250
|
|
|
231
251
|
```json
|
|
232
252
|
{
|
|
@@ -238,7 +258,9 @@ To enable qBittorrent integration, follow the setup guide [here](https://github.
|
|
|
238
258
|
- `timeout`: Maximum timeout (in seconds) for each request
|
|
239
259
|
- `max_retry`: Number of retry attempts per segment during M3U8 index download
|
|
240
260
|
|
|
241
|
-
|
|
261
|
+
<br>
|
|
262
|
+
|
|
263
|
+
## BROWSER Settings
|
|
242
264
|
|
|
243
265
|
```json
|
|
244
266
|
{
|
|
@@ -248,7 +270,9 @@ To enable qBittorrent integration, follow the setup guide [here](https://github.
|
|
|
248
270
|
|
|
249
271
|
- `headless`: Controls whether to run browser in headless mode
|
|
250
272
|
|
|
251
|
-
|
|
273
|
+
<br>
|
|
274
|
+
|
|
275
|
+
## M3U8_DOWNLOAD Settings
|
|
252
276
|
|
|
253
277
|
```json
|
|
254
278
|
{
|
|
@@ -266,7 +290,10 @@ To enable qBittorrent integration, follow the setup guide [here](https://github.
|
|
|
266
290
|
- `default_audio_workser`: Number of threads for audio download
|
|
267
291
|
- `cleanup_tmp_folder`: Remove temporary .ts files after download
|
|
268
292
|
|
|
269
|
-
|
|
293
|
+
|
|
294
|
+
<br>
|
|
295
|
+
|
|
296
|
+
### Language Settings
|
|
270
297
|
|
|
271
298
|
The following codes can be used for `specific_list_audio` and `specific_list_subtitles`:
|
|
272
299
|
|
|
@@ -301,7 +328,7 @@ forced-ita hin - Hindi pol - Polish tur - Turkish
|
|
|
301
328
|
> "specific_list_subtitles": ["ita", "eng", "spa"]
|
|
302
329
|
> ```
|
|
303
330
|
|
|
304
|
-
|
|
331
|
+
## M3U8_PARSER Settings
|
|
305
332
|
|
|
306
333
|
```json
|
|
307
334
|
{
|
|
@@ -313,8 +340,60 @@ forced-ita hin - Hindi pol - Polish tur - Turkish
|
|
|
313
340
|
- `force_resolution`: Force specific resolution (-1 for best available, or specify 1080, 720, 360)
|
|
314
341
|
- `get_only_link`: Return M3U8 playlist/index URL instead of downloading
|
|
315
342
|
|
|
343
|
+
<br>
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
# COMMAND
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
- Download a specific season by entering its number.
|
|
350
|
+
* **Example:** `1` will download *Season 1* only.
|
|
351
|
+
|
|
352
|
+
- Use the wildcard `*` to download every available season.
|
|
353
|
+
* **Example:** `*` will download all seasons in the series.
|
|
354
|
+
|
|
355
|
+
- Specify a range of seasons using a hyphen `-`.
|
|
356
|
+
* **Example:** `1-2` will download *Seasons 1 and 2*.
|
|
357
|
+
|
|
358
|
+
- Enter a season number followed by `-*` to download from that season to the end.
|
|
359
|
+
* **Example:** `3-*` will download from *Season 3* to the final season.
|
|
316
360
|
|
|
317
|
-
|
|
361
|
+
<br>
|
|
362
|
+
|
|
363
|
+
# Docker
|
|
364
|
+
|
|
365
|
+
You can run the script in a docker container, to build the image just run
|
|
366
|
+
|
|
367
|
+
```
|
|
368
|
+
docker build -t streaming-community-api .
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
and to run it use
|
|
372
|
+
|
|
373
|
+
```
|
|
374
|
+
docker run -it -p 8000:8000 streaming-community-api
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
By default the videos will be saved in `/app/Video` inside the container, if you want to to save them in your machine instead of the container just run
|
|
378
|
+
|
|
379
|
+
```
|
|
380
|
+
docker run -it -p 8000:8000 -v /path/to/download:/app/Video streaming-community-api
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Docker quick setup with Make
|
|
384
|
+
|
|
385
|
+
Inside the Makefile (install `make`) are already configured two commands to build and run the container:
|
|
386
|
+
|
|
387
|
+
```
|
|
388
|
+
make build-container
|
|
389
|
+
|
|
390
|
+
# set your download directory as ENV variable
|
|
391
|
+
make LOCAL_DIR=/path/to/download run-container
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
The `run-container` command mounts also the `config.json` file, so any change to the configuration file is reflected immediately without having to rebuild the image.
|
|
395
|
+
|
|
396
|
+
# Website Status
|
|
318
397
|
|
|
319
398
|
| Website | Status |
|
|
320
399
|
|:-------------------|:------:|
|
|
@@ -329,16 +408,24 @@ forced-ita hin - Hindi pol - Polish tur - Turkish
|
|
|
329
408
|
| PirateBays | ✅ |
|
|
330
409
|
| StreamingCommunity | ✅ |
|
|
331
410
|
|
|
332
|
-
|
|
411
|
+
# Tutorials
|
|
333
412
|
|
|
334
413
|
- [Windows Tutorial](https://www.youtube.com/watch?v=mZGqK4wdN-k)
|
|
335
414
|
- [Linux Tutorial](https://www.youtube.com/watch?v=0qUNXPE_mTg)
|
|
415
|
+
- [Pypy Tutorial](https://www.youtube.com/watch?v=C6m9ZKOK0p4)
|
|
416
|
+
- [Compiled .exe Tutorial](https://www.youtube.com/watch?v=pm4lqsxkTVo)
|
|
417
|
+
|
|
418
|
+
# To Do
|
|
336
419
|
|
|
337
|
-
|
|
420
|
+
- Create website API -> https://github.com/Lovi-0/StreamingCommunity/tree/test_gui_1
|
|
338
421
|
|
|
339
|
-
|
|
422
|
+
# SUPPORT
|
|
340
423
|
|
|
341
|
-
|
|
424
|
+
If you'd like to support this project, consider making a donation!
|
|
425
|
+
|
|
426
|
+
[](https://www.paypal.com/donate/?hosted_button_id=UXTWMT8P6HE2C)
|
|
427
|
+
|
|
428
|
+
# Contributing
|
|
342
429
|
|
|
343
430
|
Contributions are welcome! Steps:
|
|
344
431
|
1. Fork the repository
|
|
@@ -346,3 +433,10 @@ Contributions are welcome! Steps:
|
|
|
346
433
|
3. Commit changes (`git commit -m 'Add some AmazingFeature'`)
|
|
347
434
|
4. Push to branch (`git push origin feature/AmazingFeature`)
|
|
348
435
|
5. Open Pull Request
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
# Disclaimer
|
|
439
|
+
|
|
440
|
+
This software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.
|
|
441
|
+
|
|
442
|
+
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
StreamingCommunity/run.py,sha256=BAzw-SNIbpt6myDn9wfNezb3E3Lv7GZwIup0ze4vJQs,6727
|
|
2
|
+
StreamingCommunity-1.9.2.dist-info/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
|
|
3
|
+
StreamingCommunity-1.9.2.dist-info/METADATA,sha256=8E2sNWKuPEVe11ExXRG7rj5PaiKMf31778vnykY9rVI,11623
|
|
4
|
+
StreamingCommunity-1.9.2.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
|
5
|
+
StreamingCommunity-1.9.2.dist-info/entry_points.txt,sha256=-iQU6qfeHFwauAg4iZhifWhNZAkiV-x3XuEauo_EjUc,68
|
|
6
|
+
StreamingCommunity-1.9.2.dist-info/top_level.txt,sha256=YsOcxKP-WOhWpIWgBlh0coll9XUx7aqmRPT7kmt3fH0,19
|
|
7
|
+
StreamingCommunity-1.9.2.dist-info/RECORD,,
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
# 26.11.24
|
|
2
|
-
# !!! DIO CANErino
|
|
3
|
-
|
|
4
|
-
import re
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class JavaScriptParser:
|
|
8
|
-
@staticmethod
|
|
9
|
-
def fix_string(ss):
|
|
10
|
-
if ss is None:
|
|
11
|
-
return None
|
|
12
|
-
|
|
13
|
-
ss = str(ss)
|
|
14
|
-
ss = ss.encode('utf-8').decode('unicode-escape')
|
|
15
|
-
ss = ss.strip("\"'")
|
|
16
|
-
ss = ss.strip()
|
|
17
|
-
|
|
18
|
-
return ss
|
|
19
|
-
|
|
20
|
-
@staticmethod
|
|
21
|
-
def fix_url(url):
|
|
22
|
-
if url is None:
|
|
23
|
-
return None
|
|
24
|
-
|
|
25
|
-
url = url.replace('\\/', '/')
|
|
26
|
-
return url
|
|
27
|
-
|
|
28
|
-
@staticmethod
|
|
29
|
-
def parse_value(value):
|
|
30
|
-
value = JavaScriptParser.fix_string(value)
|
|
31
|
-
|
|
32
|
-
if 'http' in str(value) or 'https' in str(value):
|
|
33
|
-
return JavaScriptParser.fix_url(value)
|
|
34
|
-
|
|
35
|
-
if value is None or str(value).lower() == 'null':
|
|
36
|
-
return None
|
|
37
|
-
if str(value).lower() == 'true':
|
|
38
|
-
return True
|
|
39
|
-
if str(value).lower() == 'false':
|
|
40
|
-
return False
|
|
41
|
-
|
|
42
|
-
try:
|
|
43
|
-
return int(value)
|
|
44
|
-
except ValueError:
|
|
45
|
-
try:
|
|
46
|
-
return float(value)
|
|
47
|
-
except ValueError:
|
|
48
|
-
pass
|
|
49
|
-
|
|
50
|
-
return value
|
|
51
|
-
|
|
52
|
-
@staticmethod
|
|
53
|
-
def parse_object(obj_str):
|
|
54
|
-
obj_str = obj_str.strip('{}').strip()
|
|
55
|
-
|
|
56
|
-
result = {}
|
|
57
|
-
key_value_pairs = re.findall(r'([\'"]?[\w]+[\'"]?)\s*:\s*([^,{}]+|{[^}]*}|\[[^\]]*\]|\'[^\']*\'|"[^"]*")', obj_str)
|
|
58
|
-
|
|
59
|
-
for key, value in key_value_pairs:
|
|
60
|
-
key = JavaScriptParser.fix_string(key)
|
|
61
|
-
value = value.strip()
|
|
62
|
-
|
|
63
|
-
if value.startswith('{'):
|
|
64
|
-
result[key] = JavaScriptParser.parse_object(value)
|
|
65
|
-
elif value.startswith('['):
|
|
66
|
-
result[key] = JavaScriptParser.parse_array(value)
|
|
67
|
-
else:
|
|
68
|
-
result[key] = JavaScriptParser.parse_value(value)
|
|
69
|
-
|
|
70
|
-
return result
|
|
71
|
-
|
|
72
|
-
@staticmethod
|
|
73
|
-
def parse_array(arr_str):
|
|
74
|
-
arr_str = arr_str.strip('[]').strip()
|
|
75
|
-
result = []
|
|
76
|
-
|
|
77
|
-
elements = []
|
|
78
|
-
current_elem = ""
|
|
79
|
-
brace_count = 0
|
|
80
|
-
in_string = False
|
|
81
|
-
quote_type = None
|
|
82
|
-
|
|
83
|
-
for char in arr_str:
|
|
84
|
-
if char in ['"', "'"]:
|
|
85
|
-
if not in_string:
|
|
86
|
-
in_string = True
|
|
87
|
-
quote_type = char
|
|
88
|
-
elif quote_type == char:
|
|
89
|
-
in_string = False
|
|
90
|
-
quote_type = None
|
|
91
|
-
|
|
92
|
-
if not in_string:
|
|
93
|
-
if char == '{':
|
|
94
|
-
brace_count += 1
|
|
95
|
-
elif char == '}':
|
|
96
|
-
brace_count -= 1
|
|
97
|
-
elif char == ',' and brace_count == 0:
|
|
98
|
-
elements.append(current_elem.strip())
|
|
99
|
-
current_elem = ""
|
|
100
|
-
continue
|
|
101
|
-
|
|
102
|
-
current_elem += char
|
|
103
|
-
|
|
104
|
-
if current_elem.strip():
|
|
105
|
-
elements.append(current_elem.strip())
|
|
106
|
-
|
|
107
|
-
for elem in elements:
|
|
108
|
-
elem = elem.strip()
|
|
109
|
-
|
|
110
|
-
if elem.startswith('{'):
|
|
111
|
-
result.append(JavaScriptParser.parse_object(elem))
|
|
112
|
-
elif 'active' in elem or 'url' in elem:
|
|
113
|
-
key_value_match = re.search(r'([\w]+)\":([^,}]+)', elem)
|
|
114
|
-
|
|
115
|
-
if key_value_match:
|
|
116
|
-
key = key_value_match.group(1)
|
|
117
|
-
value = key_value_match.group(2)
|
|
118
|
-
result[-1][key] = JavaScriptParser.parse_value(value.strip('"\\'))
|
|
119
|
-
else:
|
|
120
|
-
result.append(JavaScriptParser.parse_value(elem))
|
|
121
|
-
|
|
122
|
-
return result
|
|
123
|
-
|
|
124
|
-
@classmethod
|
|
125
|
-
def parse(cls, js_string):
|
|
126
|
-
assignments = re.findall(r'window\.(\w+)\s*=\s*([^;]+);?', js_string, re.DOTALL)
|
|
127
|
-
result = {}
|
|
128
|
-
|
|
129
|
-
for var_name, value in assignments:
|
|
130
|
-
value = value.strip()
|
|
131
|
-
|
|
132
|
-
if value.startswith('{'):
|
|
133
|
-
result[var_name] = cls.parse_object(value)
|
|
134
|
-
elif value.startswith('['):
|
|
135
|
-
result[var_name] = cls.parse_array(value)
|
|
136
|
-
else:
|
|
137
|
-
result[var_name] = cls.parse_value(value)
|
|
138
|
-
|
|
139
|
-
can_play_fhd_match = re.search(r'window\.canPlayFHD\s*=\s*(\w+);?', js_string)
|
|
140
|
-
if can_play_fhd_match:
|
|
141
|
-
result['canPlayFHD'] = cls.parse_value(can_play_fhd_match.group(1))
|
|
142
|
-
|
|
143
|
-
return result
|