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.

Files changed (92) hide show
  1. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/MANIFEST.in +2 -1
  2. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/PKG-INFO +142 -16
  3. StreamingCommunity-2.9.3/StreamingCommunity.egg-info/PKG-INFO → streamingcommunity-2.9.5/README.md +118 -26
  4. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/Helper/Vixcloud/util.py +40 -38
  5. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/maxstream.py +3 -11
  6. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/1337xx/__init__.py +26 -12
  7. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/1337xx/site.py +3 -10
  8. streamingcommunity-2.9.5/StreamingCommunity/Api/Site/altadefinizione/__init__.py +108 -0
  9. streamingcommunity-2.9.5/StreamingCommunity/Api/Site/altadefinizione/film.py +128 -0
  10. streamingcommunity-2.9.5/StreamingCommunity/Api/Site/altadefinizione/series.py +209 -0
  11. streamingcommunity-2.9.5/StreamingCommunity/Api/Site/altadefinizione/site.py +93 -0
  12. streamingcommunity-2.9.5/StreamingCommunity/Api/Site/altadefinizione/util/ScrapeSerie.py +72 -0
  13. streamingcommunity-2.9.5/StreamingCommunity/Api/Site/animeunity/__init__.py +104 -0
  14. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/animeunity/film_serie.py +6 -2
  15. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/animeunity/site.py +1 -11
  16. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/cb01new/__init__.py +26 -14
  17. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/cb01new/site.py +7 -16
  18. streamingcommunity-2.9.5/StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +75 -0
  19. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/ddlstreamitaly/site.py +1 -9
  20. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/guardaserie/__init__.py +23 -11
  21. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/guardaserie/site.py +3 -10
  22. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/mostraguarda/__init__.py +27 -7
  23. streamingcommunity-2.9.5/StreamingCommunity/Api/Site/streamingcommunity/__init__.py +109 -0
  24. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/streamingcommunity/series.py +34 -12
  25. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/streamingcommunity/site.py +14 -10
  26. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +38 -17
  27. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/Class/SearchType.py +1 -1
  28. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/Util/__init__.py +0 -1
  29. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/Util/manage_ep.py +1 -0
  30. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/config_loader.py +0 -4
  31. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/Downloader/HLS/downloader.py +2 -2
  32. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/Downloader/HLS/segments.py +1 -1
  33. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/Downloader/MP4/downloader.py +8 -6
  34. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/M3U8/estimator.py +3 -3
  35. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Upload/version.py +1 -1
  36. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/config_json.py +2 -11
  37. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/table.py +12 -2
  38. streamingcommunity-2.9.5/StreamingCommunity/__init__.py +6 -0
  39. streamingcommunity-2.9.5/StreamingCommunity/global_search.py +315 -0
  40. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/run.py +27 -3
  41. StreamingCommunity-2.9.3/README.md → streamingcommunity-2.9.5/StreamingCommunity.egg-info/PKG-INFO +152 -14
  42. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity.egg-info/SOURCES.txt +7 -1
  43. streamingcommunity-2.9.5/requirements.txt +14 -0
  44. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/setup.py +3 -3
  45. StreamingCommunity-2.9.3/StreamingCommunity/Api/Site/animeunity/__init__.py +0 -83
  46. StreamingCommunity-2.9.3/StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +0 -64
  47. StreamingCommunity-2.9.3/StreamingCommunity/Api/Site/streamingcommunity/__init__.py +0 -86
  48. StreamingCommunity-2.9.3/StreamingCommunity/Api/Template/Util/get_domain.py +0 -100
  49. StreamingCommunity-2.9.3/StreamingCommunity/__init__.py +0 -0
  50. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/LICENSE +0 -0
  51. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py +0 -0
  52. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/ddl.py +0 -0
  53. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/supervideo.py +0 -0
  54. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Player/vixcloud.py +0 -0
  55. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/1337xx/title.py +0 -0
  56. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +0 -0
  57. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/cb01new/film.py +0 -0
  58. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/ddlstreamitaly/series.py +0 -0
  59. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py +0 -0
  60. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/guardaserie/series.py +0 -0
  61. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +0 -0
  62. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/mostraguarda/film.py +0 -0
  63. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Site/streamingcommunity/film.py +0 -0
  64. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/__init__.py +0 -0
  65. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Api/Template/site.py +0 -0
  66. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/Downloader/TOR/downloader.py +0 -0
  67. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/Downloader/__init__.py +0 -0
  68. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/FFmpeg/__init__.py +0 -0
  69. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/FFmpeg/capture.py +0 -0
  70. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/FFmpeg/command.py +0 -0
  71. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/FFmpeg/util.py +0 -0
  72. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/M3U8/__init__.py +0 -0
  73. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/M3U8/decryptor.py +0 -0
  74. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/M3U8/parser.py +0 -0
  75. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/M3U8/url_fixer.py +0 -0
  76. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/TMBD/__init__.py +0 -0
  77. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/TMBD/obj_tmbd.py +0 -0
  78. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Lib/TMBD/tmdb.py +0 -0
  79. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/TelegramHelp/__init__.py +0 -0
  80. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/TelegramHelp/telegram_bot.py +0 -0
  81. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Upload/update.py +0 -0
  82. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/color.py +0 -0
  83. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/ffmpeg_installer.py +0 -0
  84. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/headers.py +0 -0
  85. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/logger.py +0 -0
  86. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/message.py +0 -0
  87. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity/Util/os.py +0 -0
  88. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity.egg-info/dependency_links.txt +0 -0
  89. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity.egg-info/entry_points.txt +0 -0
  90. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity.egg-info/requires.txt +0 -0
  91. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/StreamingCommunity.egg-info/top_level.txt +0 -0
  92. {StreamingCommunity-2.9.3 → streamingcommunity-2.9.5}/setup.cfg +0 -0
@@ -1,3 +1,4 @@
1
1
  recursive-include StreamingCommunity *
2
2
  recursive-include StreamingCommunity/Api *
3
- recursive-include StreamingCommunity/Lib *
3
+ recursive-include StreamingCommunity/Lib *
4
+ include requirements.txt
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: StreamingCommunity
3
- Version: 2.9.3
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
- ### Creating a Run Script
117
+ Update to the latest version:
95
118
 
96
- Create `run_streaming.py`:
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
- ### Updating via PyPI
140
+ ## Modules
111
141
 
112
- ```bash
113
- pip install --upgrade StreamingCommunity
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
- # COMMAND
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
- - Download a specific season by entering its number.
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
- - Use the wildcard `*` to download every available season.
580
- * **Example:** `*` will download all seasons in the series.
679
+ ## Using Global Search
581
680
 
582
- - Specify a range of seasons using a hyphen `-`.
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
- - Enter a season number followed by `-*` to download from that season to the end.
586
- * **Example:** `3-*` will download from *Season 3* to the final season.
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
@@ -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
- ### Creating a Run Script
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
- ### Updating via PyPI
106
+ ## Modules
111
107
 
112
- ```bash
113
- pip install --upgrade StreamingCommunity
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
- # COMMAND
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
- - Download a specific season by entering its number.
577
- * **Example:** `1` will download *Season 1* only.
641
+ # Global Search
578
642
 
579
- - Use the wildcard `*` to download every available season.
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
- - Specify a range of seasons using a hyphen `-`.
583
- * **Example:** `1-2` will download *Seasons 1 and 2*.
645
+ ## Using Global Search
584
646
 
585
- - Enter a season number followed by `-*` to download from that season to the end.
586
- * **Example:** `3-*` will download from *Season 3* to the final season.
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 SeasonData:
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"SeasonData(id={self.id}, number={self.number}, name='{self.name}'"
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[SeasonData] = []
73
+ self.seasons: List[Season] = []
77
74
 
78
- def add_season(self, season_data):
79
- season = SeasonData(season_data)
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[Dict]:
83
- return self.seasons[number]
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
- self.episodes: EpisodeManager = EpisodeManager()
97
-
98
- self.seasonsData: SeasonManager = SeasonManager()
99
- for element in season_data['seasons']:
100
- self.seasonsData.add_season(element)
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:
@@ -48,11 +48,7 @@ class VideoSource:
48
48
 
49
49
  return self.redirect_url
50
50
 
51
- except httpx.RequestError as e:
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 httpx.RequestError as e:
102
- logging.error(f"Error during the request to the redirect URL: {e}")
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):
@@ -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
- def search(string_to_search: str = None, get_onylDatabase: bool = False):
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 series.
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
- # Search on database
57
+ # Perform the database search
40
58
  len_database = title_search(quote_plus(string_to_search))
41
59
 
42
- # Return list of elements
43
- if get_onylDatabase:
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
- # Retry
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()
@@ -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