StreamingCommunity 2.9.3__tar.gz → 2.9.5__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-2.9.3 → streamingcommunity-2.9.5}/MANIFEST.in +2 -1
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/PKG-INFO +142 -16
- StreamingCommunity-2.9.3/StreamingCommunity.egg-info/PKG-INFO → streamingcommunity-2.9.5/README.md +118 -26
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/Helper/Vixcloud/util.py +40 -38
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/maxstream.py +3 -11
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/1337xx/__init__.py +26 -12
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/1337xx/site.py +3 -10
- streamingcommunity-2.9.5/StreamingCommunity/Api/Site/altadefinizione/__init__.py +108 -0
- streamingcommunity-2.9.5/StreamingCommunity/Api/Site/altadefinizione/film.py +128 -0
- streamingcommunity-2.9.5/StreamingCommunity/Api/Site/altadefinizione/series.py +209 -0
- streamingcommunity-2.9.5/StreamingCommunity/Api/Site/altadefinizione/site.py +93 -0
- streamingcommunity-2.9.5/StreamingCommunity/Api/Site/altadefinizione/util/ScrapeSerie.py +72 -0
- streamingcommunity-2.9.5/StreamingCommunity/Api/Site/animeunity/__init__.py +104 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/animeunity/film_serie.py +6 -2
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/animeunity/site.py +1 -11
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/cb01new/__init__.py +26 -14
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/cb01new/site.py +7 -16
- streamingcommunity-2.9.5/StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +75 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/ddlstreamitaly/site.py +1 -9
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/guardaserie/__init__.py +23 -11
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/guardaserie/site.py +3 -10
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/mostraguarda/__init__.py +27 -7
- streamingcommunity-2.9.5/StreamingCommunity/Api/Site/streamingcommunity/__init__.py +109 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/streamingcommunity/series.py +34 -12
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/streamingcommunity/site.py +14 -10
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +38 -17
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/Class/SearchType.py +1 -1
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/Util/__init__.py +0 -1
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/Util/manage_ep.py +1 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/config_loader.py +0 -4
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/Downloader/HLS/downloader.py +2 -2
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/Downloader/HLS/segments.py +1 -1
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/Downloader/MP4/downloader.py +8 -6
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/M3U8/estimator.py +3 -3
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Upload/version.py +1 -1
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/config_json.py +2 -11
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/table.py +12 -2
- streamingcommunity-2.9.5/StreamingCommunity/__init__.py +6 -0
- streamingcommunity-2.9.5/StreamingCommunity/global_search.py +315 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/run.py +27 -3
- StreamingCommunity-2.9.3/README.md → streamingcommunity-2.9.5/StreamingCommunity.egg-info/PKG-INFO +152 -14
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity.egg-info/SOURCES.txt +7 -1
- streamingcommunity-2.9.5/requirements.txt +14 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/setup.py +3 -3
- StreamingCommunity-2.9.3/StreamingCommunity/Api/Site/animeunity/__init__.py +0 -83
- StreamingCommunity-2.9.3/StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +0 -64
- StreamingCommunity-2.9.3/StreamingCommunity/Api/Site/streamingcommunity/__init__.py +0 -86
- StreamingCommunity-2.9.3/StreamingCommunity/Api/Template/Util/get_domain.py +0 -100
- StreamingCommunity-2.9.3/StreamingCommunity/__init__.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/LICENSE +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/ddl.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/supervideo.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/vixcloud.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/1337xx/title.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/cb01new/film.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/ddlstreamitaly/series.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/guardaserie/series.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/mostraguarda/film.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/streamingcommunity/film.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/__init__.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/site.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/Downloader/TOR/downloader.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/Downloader/__init__.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/FFmpeg/__init__.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/FFmpeg/capture.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/FFmpeg/command.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/FFmpeg/util.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/M3U8/__init__.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/M3U8/decryptor.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/M3U8/parser.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/M3U8/url_fixer.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/TMBD/__init__.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/TMBD/obj_tmbd.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/TMBD/tmdb.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/TelegramHelp/__init__.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/TelegramHelp/telegram_bot.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Upload/update.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/color.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/ffmpeg_installer.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/headers.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/logger.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/message.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/os.py +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity.egg-info/dependency_links.txt +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity.egg-info/entry_points.txt +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity.egg-info/requires.txt +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity.egg-info/top_level.txt +0 -0
- {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: StreamingCommunity
|
|
3
|
-
Version: 2.9.
|
|
3
|
+
Version: 2.9.5
|
|
4
4
|
Home-page: https://github.com/Lovi-0/StreamingCommunity
|
|
5
5
|
Author: Lovi-0
|
|
6
6
|
Project-URL: Bug Reports, https://github.com/Lovi-0/StreamingCommunity/issues
|
|
@@ -9,6 +9,28 @@ Keywords: streaming community
|
|
|
9
9
|
Requires-Python: >=3.8
|
|
10
10
|
Description-Content-Type: text/markdown
|
|
11
11
|
License-File: LICENSE
|
|
12
|
+
Requires-Dist: httpx
|
|
13
|
+
Requires-Dist: bs4
|
|
14
|
+
Requires-Dist: rich
|
|
15
|
+
Requires-Dist: tqdm
|
|
16
|
+
Requires-Dist: m3u8
|
|
17
|
+
Requires-Dist: certifi
|
|
18
|
+
Requires-Dist: psutil
|
|
19
|
+
Requires-Dist: unidecode
|
|
20
|
+
Requires-Dist: jsbeautifier
|
|
21
|
+
Requires-Dist: pathvalidate
|
|
22
|
+
Requires-Dist: pycryptodomex
|
|
23
|
+
Requires-Dist: ua-generator
|
|
24
|
+
Requires-Dist: qbittorrent-api
|
|
25
|
+
Requires-Dist: pyTelegramBotAPI
|
|
26
|
+
Dynamic: author
|
|
27
|
+
Dynamic: description
|
|
28
|
+
Dynamic: description-content-type
|
|
29
|
+
Dynamic: home-page
|
|
30
|
+
Dynamic: keywords
|
|
31
|
+
Dynamic: project-url
|
|
32
|
+
Dynamic: requires-dist
|
|
33
|
+
Dynamic: requires-python
|
|
12
34
|
|
|
13
35
|
<p align="center">
|
|
14
36
|
<img src="https://i.ibb.co/v6RnT0wY/s2.jpg" alt="Project Logo" width="700"/>
|
|
@@ -57,6 +79,7 @@ License-File: LICENSE
|
|
|
57
79
|
- 📥 [Download](#m3u8_download-settings)
|
|
58
80
|
- 🔍 [Parser](#m3u8_parser-settings)
|
|
59
81
|
- 📝 [Command](#command)
|
|
82
|
+
- 🔍 [Global search](#global-search)
|
|
60
83
|
- 💻 [Examples of terminal](#examples-of-terminal-usage)
|
|
61
84
|
- 🔧 [Manual domain configuration](#update-domains)
|
|
62
85
|
- 🐳 [Docker](#docker)
|
|
@@ -91,9 +114,15 @@ Install directly from PyPI:
|
|
|
91
114
|
pip install StreamingCommunity
|
|
92
115
|
```
|
|
93
116
|
|
|
94
|
-
|
|
117
|
+
Update to the latest version:
|
|
95
118
|
|
|
96
|
-
|
|
119
|
+
```bash
|
|
120
|
+
pip install --upgrade StreamingCommunity
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Quick Start
|
|
124
|
+
|
|
125
|
+
Create a simple script (`run_streaming.py`) to launch the main application:
|
|
97
126
|
|
|
98
127
|
```python
|
|
99
128
|
from StreamingCommunity.run import main
|
|
@@ -103,16 +132,85 @@ if __name__ == "__main__":
|
|
|
103
132
|
```
|
|
104
133
|
|
|
105
134
|
Run the script:
|
|
135
|
+
|
|
106
136
|
```bash
|
|
107
137
|
python run_streaming.py
|
|
108
138
|
```
|
|
109
139
|
|
|
110
|
-
|
|
140
|
+
## Modules
|
|
111
141
|
|
|
112
|
-
|
|
113
|
-
|
|
142
|
+
### HLS Downloader
|
|
143
|
+
|
|
144
|
+
Download HTTP Live Streaming (HLS) content from m3u8 URLs.
|
|
145
|
+
|
|
146
|
+
```python
|
|
147
|
+
from StreamingCommunity.Download import HLS_Downloader
|
|
148
|
+
|
|
149
|
+
# Initialize with m3u8 URL and optional output path
|
|
150
|
+
downloader = HLS_Downloader(
|
|
151
|
+
m3u8_url="https://example.com/stream.m3u8",
|
|
152
|
+
output_path="/downloads/video.mp4" # Optional
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
# Start the download
|
|
156
|
+
downloader.download()
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
See [HLS example](./Test/Download/HLS.py) for complete usage.
|
|
160
|
+
|
|
161
|
+
### MP4 Downloader
|
|
162
|
+
|
|
163
|
+
Direct MP4 file downloader with support for custom headers and referrer.
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
from StreamingCommunity.Download import MP4_downloader
|
|
167
|
+
|
|
168
|
+
# Basic usage
|
|
169
|
+
downloader = MP4_downloader(
|
|
170
|
+
url="https://example.com/video.mp4",
|
|
171
|
+
path="/downloads/saved_video.mp4"
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
# Advanced usage with custom headers and referrer
|
|
175
|
+
headers = {
|
|
176
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
|
|
177
|
+
}
|
|
178
|
+
downloader = MP4_downloader(
|
|
179
|
+
url="https://example.com/video.mp4",
|
|
180
|
+
path="/downloads/saved_video.mp4",
|
|
181
|
+
referer="https://example.com",
|
|
182
|
+
headers_=headers
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
# Start download
|
|
186
|
+
downloader.download()
|
|
114
187
|
```
|
|
115
188
|
|
|
189
|
+
See [MP4 example](./Test/Download/MP4.py) for complete usage.
|
|
190
|
+
|
|
191
|
+
### Torrent Client
|
|
192
|
+
|
|
193
|
+
Download content via torrent magnet links.
|
|
194
|
+
|
|
195
|
+
```python
|
|
196
|
+
from StreamingCommunity.Download import TOR_downloader
|
|
197
|
+
|
|
198
|
+
# Initialize torrent client
|
|
199
|
+
client = TOR_downloader()
|
|
200
|
+
|
|
201
|
+
# Add magnet link
|
|
202
|
+
client.add_magnet_link("magnet:?xt=urn:btih:example_hash&dn=example_name")
|
|
203
|
+
|
|
204
|
+
# Start download
|
|
205
|
+
client.start_download()
|
|
206
|
+
|
|
207
|
+
# Move downloaded files to specific location
|
|
208
|
+
client.move_downloaded_files("/downloads/torrents/")
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
See [Torrent example](./Test/Download/TOR.py) for complete usage.
|
|
212
|
+
|
|
213
|
+
|
|
116
214
|
## 2. Automatic Installation
|
|
117
215
|
|
|
118
216
|
### Supported Operating Systems 💿
|
|
@@ -571,19 +669,44 @@ The API-based domain updates are currently deprecated. To use it anyway, set `us
|
|
|
571
669
|
|
|
572
670
|
Note: If `use_api` is set to `false` and no `domains.json` file is found, the script will raise an error.
|
|
573
671
|
|
|
574
|
-
|
|
672
|
+
#### 💡 Adding a New Site to the Legacy API
|
|
673
|
+
If you want to add a new site to the legacy API, just message me on the Discord server, and I'll add it!
|
|
674
|
+
|
|
675
|
+
# Global Search
|
|
575
676
|
|
|
576
|
-
|
|
577
|
-
* **Example:** `1` will download *Season 1* only.
|
|
677
|
+
You can now search across multiple streaming sites at once using the Global Search feature. This allows you to find content more efficiently without having to search each site individually.
|
|
578
678
|
|
|
579
|
-
|
|
580
|
-
* **Example:** `*` will download all seasons in the series.
|
|
679
|
+
## Using Global Search
|
|
581
680
|
|
|
582
|
-
|
|
583
|
-
* **Example:** `1-2` will download *Seasons 1 and 2*.
|
|
681
|
+
The Global Search feature provides a unified interface to search across all supported sites:
|
|
584
682
|
|
|
585
|
-
|
|
586
|
-
|
|
683
|
+
## Search Options
|
|
684
|
+
|
|
685
|
+
When using Global Search, you have three ways to select which sites to search:
|
|
686
|
+
|
|
687
|
+
1. **Search all sites** - Searches across all available streaming sites
|
|
688
|
+
2. **Search by category** - Group sites by their categories (movies, series, anime, etc.)
|
|
689
|
+
3. **Select specific sites** - Choose individual sites to include in your search
|
|
690
|
+
|
|
691
|
+
## Navigation and Selection
|
|
692
|
+
|
|
693
|
+
After performing a search:
|
|
694
|
+
|
|
695
|
+
1. Results are displayed in a consolidated table showing:
|
|
696
|
+
- Title
|
|
697
|
+
- Media type (movie, TV series, etc.)
|
|
698
|
+
- Source site
|
|
699
|
+
|
|
700
|
+
2. Select an item by number to view details or download
|
|
701
|
+
|
|
702
|
+
3. The system will automatically use the appropriate site's API to handle the download
|
|
703
|
+
|
|
704
|
+
## Command Line Arguments
|
|
705
|
+
|
|
706
|
+
The Global Search can be configured from the command line:
|
|
707
|
+
|
|
708
|
+
- `--global` - Perform a global search across multiple sites.
|
|
709
|
+
- `-s`, `--search` - Specify the search terms.
|
|
587
710
|
|
|
588
711
|
# Examples of terminal usage
|
|
589
712
|
|
|
@@ -596,6 +719,9 @@ python test_run.py --specific_list_audio ita,eng --specific_list_subtitles eng,s
|
|
|
596
719
|
|
|
597
720
|
# Keep console open after download
|
|
598
721
|
python test_run.py --not_close true
|
|
722
|
+
|
|
723
|
+
# Use global search
|
|
724
|
+
python test_run.py --global -s "cars"
|
|
599
725
|
```
|
|
600
726
|
|
|
601
727
|
# Docker
|
StreamingCommunity-2.9.3/StreamingCommunity.egg-info/PKG-INFO → streamingcommunity-2.9.5/README.md
RENAMED
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: StreamingCommunity
|
|
3
|
-
Version: 2.9.3
|
|
4
|
-
Home-page: https://github.com/Lovi-0/StreamingCommunity
|
|
5
|
-
Author: Lovi-0
|
|
6
|
-
Project-URL: Bug Reports, https://github.com/Lovi-0/StreamingCommunity/issues
|
|
7
|
-
Project-URL: Source, https://github.com/Lovi-0/StreamingCommunity
|
|
8
|
-
Keywords: streaming community
|
|
9
|
-
Requires-Python: >=3.8
|
|
10
|
-
Description-Content-Type: text/markdown
|
|
11
|
-
License-File: LICENSE
|
|
12
|
-
|
|
13
1
|
<p align="center">
|
|
14
2
|
<img src="https://i.ibb.co/v6RnT0wY/s2.jpg" alt="Project Logo" width="700"/>
|
|
15
3
|
</p>
|
|
@@ -57,6 +45,7 @@ License-File: LICENSE
|
|
|
57
45
|
- 📥 [Download](#m3u8_download-settings)
|
|
58
46
|
- 🔍 [Parser](#m3u8_parser-settings)
|
|
59
47
|
- 📝 [Command](#command)
|
|
48
|
+
- 🔍 [Global search](#global-search)
|
|
60
49
|
- 💻 [Examples of terminal](#examples-of-terminal-usage)
|
|
61
50
|
- 🔧 [Manual domain configuration](#update-domains)
|
|
62
51
|
- 🐳 [Docker](#docker)
|
|
@@ -91,9 +80,15 @@ Install directly from PyPI:
|
|
|
91
80
|
pip install StreamingCommunity
|
|
92
81
|
```
|
|
93
82
|
|
|
94
|
-
|
|
83
|
+
Update to the latest version:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
pip install --upgrade StreamingCommunity
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Quick Start
|
|
95
90
|
|
|
96
|
-
Create `run_streaming.py
|
|
91
|
+
Create a simple script (`run_streaming.py`) to launch the main application:
|
|
97
92
|
|
|
98
93
|
```python
|
|
99
94
|
from StreamingCommunity.run import main
|
|
@@ -103,16 +98,85 @@ if __name__ == "__main__":
|
|
|
103
98
|
```
|
|
104
99
|
|
|
105
100
|
Run the script:
|
|
101
|
+
|
|
106
102
|
```bash
|
|
107
103
|
python run_streaming.py
|
|
108
104
|
```
|
|
109
105
|
|
|
110
|
-
|
|
106
|
+
## Modules
|
|
111
107
|
|
|
112
|
-
|
|
113
|
-
|
|
108
|
+
### HLS Downloader
|
|
109
|
+
|
|
110
|
+
Download HTTP Live Streaming (HLS) content from m3u8 URLs.
|
|
111
|
+
|
|
112
|
+
```python
|
|
113
|
+
from StreamingCommunity.Download import HLS_Downloader
|
|
114
|
+
|
|
115
|
+
# Initialize with m3u8 URL and optional output path
|
|
116
|
+
downloader = HLS_Downloader(
|
|
117
|
+
m3u8_url="https://example.com/stream.m3u8",
|
|
118
|
+
output_path="/downloads/video.mp4" # Optional
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
# Start the download
|
|
122
|
+
downloader.download()
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
See [HLS example](./Test/Download/HLS.py) for complete usage.
|
|
126
|
+
|
|
127
|
+
### MP4 Downloader
|
|
128
|
+
|
|
129
|
+
Direct MP4 file downloader with support for custom headers and referrer.
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
from StreamingCommunity.Download import MP4_downloader
|
|
133
|
+
|
|
134
|
+
# Basic usage
|
|
135
|
+
downloader = MP4_downloader(
|
|
136
|
+
url="https://example.com/video.mp4",
|
|
137
|
+
path="/downloads/saved_video.mp4"
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# Advanced usage with custom headers and referrer
|
|
141
|
+
headers = {
|
|
142
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
|
|
143
|
+
}
|
|
144
|
+
downloader = MP4_downloader(
|
|
145
|
+
url="https://example.com/video.mp4",
|
|
146
|
+
path="/downloads/saved_video.mp4",
|
|
147
|
+
referer="https://example.com",
|
|
148
|
+
headers_=headers
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
# Start download
|
|
152
|
+
downloader.download()
|
|
114
153
|
```
|
|
115
154
|
|
|
155
|
+
See [MP4 example](./Test/Download/MP4.py) for complete usage.
|
|
156
|
+
|
|
157
|
+
### Torrent Client
|
|
158
|
+
|
|
159
|
+
Download content via torrent magnet links.
|
|
160
|
+
|
|
161
|
+
```python
|
|
162
|
+
from StreamingCommunity.Download import TOR_downloader
|
|
163
|
+
|
|
164
|
+
# Initialize torrent client
|
|
165
|
+
client = TOR_downloader()
|
|
166
|
+
|
|
167
|
+
# Add magnet link
|
|
168
|
+
client.add_magnet_link("magnet:?xt=urn:btih:example_hash&dn=example_name")
|
|
169
|
+
|
|
170
|
+
# Start download
|
|
171
|
+
client.start_download()
|
|
172
|
+
|
|
173
|
+
# Move downloaded files to specific location
|
|
174
|
+
client.move_downloaded_files("/downloads/torrents/")
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
See [Torrent example](./Test/Download/TOR.py) for complete usage.
|
|
178
|
+
|
|
179
|
+
|
|
116
180
|
## 2. Automatic Installation
|
|
117
181
|
|
|
118
182
|
### Supported Operating Systems 💿
|
|
@@ -571,19 +635,44 @@ The API-based domain updates are currently deprecated. To use it anyway, set `us
|
|
|
571
635
|
|
|
572
636
|
Note: If `use_api` is set to `false` and no `domains.json` file is found, the script will raise an error.
|
|
573
637
|
|
|
574
|
-
|
|
638
|
+
#### 💡 Adding a New Site to the Legacy API
|
|
639
|
+
If you want to add a new site to the legacy API, just message me on the Discord server, and I'll add it!
|
|
575
640
|
|
|
576
|
-
|
|
577
|
-
* **Example:** `1` will download *Season 1* only.
|
|
641
|
+
# Global Search
|
|
578
642
|
|
|
579
|
-
|
|
580
|
-
* **Example:** `*` will download all seasons in the series.
|
|
643
|
+
You can now search across multiple streaming sites at once using the Global Search feature. This allows you to find content more efficiently without having to search each site individually.
|
|
581
644
|
|
|
582
|
-
|
|
583
|
-
* **Example:** `1-2` will download *Seasons 1 and 2*.
|
|
645
|
+
## Using Global Search
|
|
584
646
|
|
|
585
|
-
|
|
586
|
-
|
|
647
|
+
The Global Search feature provides a unified interface to search across all supported sites:
|
|
648
|
+
|
|
649
|
+
## Search Options
|
|
650
|
+
|
|
651
|
+
When using Global Search, you have three ways to select which sites to search:
|
|
652
|
+
|
|
653
|
+
1. **Search all sites** - Searches across all available streaming sites
|
|
654
|
+
2. **Search by category** - Group sites by their categories (movies, series, anime, etc.)
|
|
655
|
+
3. **Select specific sites** - Choose individual sites to include in your search
|
|
656
|
+
|
|
657
|
+
## Navigation and Selection
|
|
658
|
+
|
|
659
|
+
After performing a search:
|
|
660
|
+
|
|
661
|
+
1. Results are displayed in a consolidated table showing:
|
|
662
|
+
- Title
|
|
663
|
+
- Media type (movie, TV series, etc.)
|
|
664
|
+
- Source site
|
|
665
|
+
|
|
666
|
+
2. Select an item by number to view details or download
|
|
667
|
+
|
|
668
|
+
3. The system will automatically use the appropriate site's API to handle the download
|
|
669
|
+
|
|
670
|
+
## Command Line Arguments
|
|
671
|
+
|
|
672
|
+
The Global Search can be configured from the command line:
|
|
673
|
+
|
|
674
|
+
- `--global` - Perform a global search across multiple sites.
|
|
675
|
+
- `-s`, `--search` - Specify the search terms.
|
|
587
676
|
|
|
588
677
|
# Examples of terminal usage
|
|
589
678
|
|
|
@@ -596,6 +685,9 @@ python test_run.py --specific_list_audio ita,eng --specific_list_subtitles eng,s
|
|
|
596
685
|
|
|
597
686
|
# Keep console open after download
|
|
598
687
|
python test_run.py --not_close true
|
|
688
|
+
|
|
689
|
+
# Use global search
|
|
690
|
+
python test_run.py --global -s "cars"
|
|
599
691
|
```
|
|
600
692
|
|
|
601
693
|
# Docker
|
|
@@ -11,6 +11,7 @@ class Episode:
|
|
|
11
11
|
self.number: int = data.get('number', 1)
|
|
12
12
|
self.name: str = data.get('name', '')
|
|
13
13
|
self.duration: int = data.get('duration', 0)
|
|
14
|
+
self.url: str = data.get('url', '')
|
|
14
15
|
|
|
15
16
|
def __str__(self):
|
|
16
17
|
return f"Episode(id={self.id}, number={self.number}, name='{self.name}', duration={self.duration} sec)"
|
|
@@ -35,69 +36,70 @@ class EpisodeManager:
|
|
|
35
36
|
|
|
36
37
|
Parameters:
|
|
37
38
|
- index (int): The zero-based index of the episode to retrieve.
|
|
38
|
-
|
|
39
|
-
Returns:
|
|
40
|
-
Episode: The Episode object at the specified index.
|
|
41
39
|
"""
|
|
42
40
|
return self.episodes[index]
|
|
43
41
|
|
|
44
|
-
def length(self) -> int:
|
|
45
|
-
"""
|
|
46
|
-
Get the number of episodes in the manager.
|
|
47
|
-
|
|
48
|
-
Returns:
|
|
49
|
-
int: Number of episodes.
|
|
50
|
-
"""
|
|
51
|
-
return len(self.episodes)
|
|
52
|
-
|
|
53
42
|
def clear(self) -> None:
|
|
54
43
|
"""
|
|
55
44
|
This method clears the episodes list.
|
|
56
|
-
|
|
57
|
-
Parameters:
|
|
58
|
-
- self: The object instance.
|
|
59
45
|
"""
|
|
60
46
|
self.episodes.clear()
|
|
61
47
|
|
|
48
|
+
def __len__(self) -> int:
|
|
49
|
+
"""
|
|
50
|
+
Get the number of episodes in the manager.
|
|
51
|
+
"""
|
|
52
|
+
return len(self.episodes)
|
|
53
|
+
|
|
62
54
|
def __str__(self):
|
|
63
55
|
return f"EpisodeManager(num_episodes={len(self.episodes)})"
|
|
64
56
|
|
|
65
57
|
|
|
66
|
-
class
|
|
58
|
+
class Season:
|
|
67
59
|
def __init__(self, data: Dict[str, Any]):
|
|
68
60
|
self.id: int = data.get('id', 0)
|
|
69
61
|
self.number: int = data.get('number', 0)
|
|
62
|
+
self.name: str = data.get('name', '')
|
|
63
|
+
self.slug: str = data.get('slug', '')
|
|
64
|
+
self.type: str = data.get('type', '')
|
|
65
|
+
self.episodes: EpisodeManager = EpisodeManager()
|
|
70
66
|
|
|
71
67
|
def __str__(self):
|
|
72
|
-
return f"
|
|
68
|
+
return f"Season(id={self.id}, number={self.number}, name='{self.name}', episodes={self.episodes.length()})"
|
|
69
|
+
|
|
73
70
|
|
|
74
71
|
class SeasonManager:
|
|
75
72
|
def __init__(self):
|
|
76
|
-
self.seasons: List[
|
|
73
|
+
self.seasons: List[Season] = []
|
|
77
74
|
|
|
78
|
-
def add_season(self, season_data):
|
|
79
|
-
|
|
75
|
+
def add_season(self, season_data: Dict[str, Any]) -> Season:
|
|
76
|
+
"""
|
|
77
|
+
Add a new season to the manager and return it.
|
|
78
|
+
|
|
79
|
+
Parameters:
|
|
80
|
+
- season_data (Dict[str, Any]): A dictionary containing data for the new season.
|
|
81
|
+
"""
|
|
82
|
+
season = Season(season_data)
|
|
80
83
|
self.seasons.append(season)
|
|
84
|
+
return season
|
|
81
85
|
|
|
82
|
-
def get_season_by_number(self, number: int) -> Optional[
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
class Season:
|
|
86
|
-
def __init__(self, season_data: Dict[str, Union[int, str, None]]):
|
|
87
|
-
self.season_data = season_data
|
|
88
|
-
|
|
89
|
-
self.id: int = season_data.get('id', 0)
|
|
90
|
-
self.number: int = season_data.get('number', 0)
|
|
91
|
-
self.name: str = season_data.get('name', '')
|
|
92
|
-
self.slug: str = season_data.get('slug', '')
|
|
93
|
-
self.type: str = season_data.get('type', '')
|
|
94
|
-
self.seasons_count: int = season_data.get('seasons_count', 0)
|
|
86
|
+
def get_season_by_number(self, number: int) -> Optional[Season]:
|
|
87
|
+
"""
|
|
88
|
+
Get a season by its number.
|
|
95
89
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
for
|
|
100
|
-
|
|
90
|
+
Parameters:
|
|
91
|
+
- number (int): The season number (1-based index)
|
|
92
|
+
"""
|
|
93
|
+
for season in self.seasons:
|
|
94
|
+
if season.number == number:
|
|
95
|
+
return season
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
def __len__(self) -> int:
|
|
99
|
+
"""
|
|
100
|
+
Return the number of seasons managed.
|
|
101
|
+
"""
|
|
102
|
+
return len(self.seasons)
|
|
101
103
|
|
|
102
104
|
|
|
103
105
|
class Stream:
|
{StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/maxstream.py
RENAMED
|
@@ -48,11 +48,7 @@ class VideoSource:
|
|
|
48
48
|
|
|
49
49
|
return self.redirect_url
|
|
50
50
|
|
|
51
|
-
except
|
|
52
|
-
logging.error(f"Error during the initial request: {e}")
|
|
53
|
-
raise
|
|
54
|
-
|
|
55
|
-
except AttributeError as e:
|
|
51
|
+
except Exception as e:
|
|
56
52
|
logging.error(f"Error parsing HTML: {e}")
|
|
57
53
|
raise
|
|
58
54
|
|
|
@@ -98,12 +94,8 @@ class VideoSource:
|
|
|
98
94
|
|
|
99
95
|
return self.maxstream_url
|
|
100
96
|
|
|
101
|
-
except
|
|
102
|
-
logging.error(f"Error during the request
|
|
103
|
-
raise
|
|
104
|
-
|
|
105
|
-
except AttributeError as e:
|
|
106
|
-
logging.error(f"Error parsing HTML: {e}")
|
|
97
|
+
except Exception as e:
|
|
98
|
+
logging.error(f"Error during the request: {e}")
|
|
107
99
|
raise
|
|
108
100
|
|
|
109
101
|
def get_m3u8_url(self):
|
{StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/1337xx/__init__.py
RENAMED
|
@@ -10,10 +10,11 @@ from rich.prompt import Prompt
|
|
|
10
10
|
|
|
11
11
|
# Internal utilities
|
|
12
12
|
from StreamingCommunity.Api.Template import get_select_title
|
|
13
|
+
from StreamingCommunity.Api.Template.config_loader import site_constant
|
|
14
|
+
from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
|
|
13
15
|
|
|
14
16
|
|
|
15
17
|
# Logic class
|
|
16
|
-
from StreamingCommunity.Api.Template.config_loader import site_constant
|
|
17
18
|
from .site import title_search, media_search_manager, table_show_manager
|
|
18
19
|
from .title import download_title
|
|
19
20
|
|
|
@@ -29,30 +30,43 @@ console = Console()
|
|
|
29
30
|
msg = Prompt()
|
|
30
31
|
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
|
|
34
|
+
def process_search_result(select_title):
|
|
35
|
+
"""
|
|
36
|
+
Handles the search result and initiates the download for either a film or series.
|
|
37
|
+
"""
|
|
38
|
+
download_title(select_title)
|
|
39
|
+
|
|
40
|
+
def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_item: dict = None):
|
|
33
41
|
"""
|
|
34
|
-
Main function of the application for film and
|
|
42
|
+
Main function of the application for search film, series and anime.
|
|
43
|
+
|
|
44
|
+
Parameters:
|
|
45
|
+
string_to_search (str, optional): String to search for
|
|
46
|
+
get_onylDatabase (bool, optional): If True, return only the database object
|
|
47
|
+
direct_item (dict, optional): Direct item to process (bypass search)
|
|
35
48
|
"""
|
|
49
|
+
if direct_item:
|
|
50
|
+
select_title = MediaItem(**direct_item)
|
|
51
|
+
process_search_result(select_title)
|
|
52
|
+
return
|
|
53
|
+
|
|
36
54
|
if string_to_search is None:
|
|
37
55
|
string_to_search = msg.ask(f"\n[purple]Insert word to search in [green]{site_constant.SITE_NAME}").strip()
|
|
38
56
|
|
|
39
|
-
#
|
|
57
|
+
# Perform the database search
|
|
40
58
|
len_database = title_search(quote_plus(string_to_search))
|
|
41
59
|
|
|
42
|
-
#
|
|
43
|
-
if
|
|
60
|
+
# If only the database is needed, return the manager
|
|
61
|
+
if get_onlyDatabase:
|
|
44
62
|
return media_search_manager
|
|
45
63
|
|
|
46
64
|
if len_database > 0:
|
|
47
|
-
|
|
48
|
-
# Select title from list
|
|
49
65
|
select_title = get_select_title(table_show_manager, media_search_manager)
|
|
50
|
-
|
|
51
|
-
# Download title
|
|
52
66
|
download_title(select_title)
|
|
53
67
|
|
|
54
68
|
else:
|
|
55
|
-
console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
|
|
56
69
|
|
|
57
|
-
#
|
|
70
|
+
# If no results are found, ask again
|
|
71
|
+
console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
|
|
58
72
|
search()
|
{StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/1337xx/site.py
RENAMED
|
@@ -16,7 +16,6 @@ from StreamingCommunity.Util.table import TVShowManager
|
|
|
16
16
|
|
|
17
17
|
# Logic class
|
|
18
18
|
from StreamingCommunity.Api.Template.config_loader import site_constant
|
|
19
|
-
from StreamingCommunity.Api.Template.Util import search_domain
|
|
20
19
|
from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
|
|
21
20
|
|
|
22
21
|
|
|
@@ -40,14 +39,6 @@ def title_search(word_to_search: str) -> int:
|
|
|
40
39
|
media_search_manager.clear()
|
|
41
40
|
table_show_manager.clear()
|
|
42
41
|
|
|
43
|
-
# Check if domain is working
|
|
44
|
-
domain_to_use, base_url = search_domain(site_constant.FULL_URL)
|
|
45
|
-
|
|
46
|
-
if domain_to_use is None or base_url is None:
|
|
47
|
-
console.log("[bold red]Error: Unable to determine valid domain or base URL.[/bold red]")
|
|
48
|
-
console.print("[yellow]The service might be temporarily unavailable or the domain may have changed.[/yellow]")
|
|
49
|
-
sys.exit(1)
|
|
50
|
-
|
|
51
42
|
search_url = f"{site_constant.FULL_URL}/search/{word_to_search}/1/"
|
|
52
43
|
console.print(f"[cyan]Search url: [yellow]{search_url}")
|
|
53
44
|
|
|
@@ -57,6 +48,7 @@ def title_search(word_to_search: str) -> int:
|
|
|
57
48
|
|
|
58
49
|
except Exception as e:
|
|
59
50
|
console.print(f"Site: {site_constant.SITE_NAME}, request search error: {e}")
|
|
51
|
+
return 0
|
|
60
52
|
|
|
61
53
|
# Create soup and find table
|
|
62
54
|
soup = BeautifulSoup(response.text, "html.parser")
|
|
@@ -70,7 +62,8 @@ def title_search(word_to_search: str) -> int:
|
|
|
70
62
|
'seader': tr.find_all("td")[-5].get_text(strip=True),
|
|
71
63
|
'leacher': tr.find_all("td")[-4].get_text(strip=True),
|
|
72
64
|
'date': tr.find_all("td")[-3].get_text(strip=True).replace("'", ""),
|
|
73
|
-
'size': tr.find_all("td")[-2].get_text(strip=True)
|
|
65
|
+
'size': tr.find_all("td")[-2].get_text(strip=True),
|
|
66
|
+
'type': 'torrent'
|
|
74
67
|
}
|
|
75
68
|
media_search_manager.add_media(title_info)
|
|
76
69
|
|