StreamingCommunity 3.2.8__tar.gz → 3.2.9__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 (128) hide show
  1. {streamingcommunity-3.2.8/StreamingCommunity.egg-info → streamingcommunity-3.2.9}/PKG-INFO +143 -45
  2. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/README.md +143 -45
  3. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Player/Helper/Vixcloud/util.py +2 -1
  4. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Player/hdplayer.py +2 -2
  5. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Player/sweetpixel.py +5 -8
  6. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/altadefinizione/__init__.py +2 -2
  7. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/altadefinizione/film.py +10 -8
  8. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/altadefinizione/series.py +9 -7
  9. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/altadefinizione/site.py +1 -1
  10. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/animeunity/__init__.py +2 -2
  11. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/animeunity/serie.py +2 -2
  12. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/animeworld/site.py +3 -5
  13. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/animeworld/util/ScrapeSerie.py +8 -10
  14. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/cb01new/film.py +7 -5
  15. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/crunchyroll/__init__.py +1 -3
  16. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/crunchyroll/film.py +9 -7
  17. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/crunchyroll/series.py +9 -7
  18. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/crunchyroll/site.py +10 -1
  19. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/guardaserie/series.py +8 -6
  20. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/guardaserie/site.py +0 -3
  21. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +1 -2
  22. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/mediasetinfinity/__init__.py +1 -1
  23. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/mediasetinfinity/film.py +10 -16
  24. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/mediasetinfinity/series.py +12 -18
  25. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/mediasetinfinity/site.py +11 -3
  26. streamingcommunity-3.2.9/StreamingCommunity/Api/Site/mediasetinfinity/util/ScrapeSerie.py +293 -0
  27. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/mediasetinfinity/util/get_license.py +2 -31
  28. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/raiplay/__init__.py +1 -1
  29. streamingcommunity-3.2.9/StreamingCommunity/Api/Site/raiplay/film.py +96 -0
  30. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/raiplay/series.py +44 -12
  31. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/raiplay/site.py +4 -1
  32. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/raiplay/util/ScrapeSerie.py +2 -1
  33. streamingcommunity-3.2.9/StreamingCommunity/Api/Site/raiplay/util/get_license.py +40 -0
  34. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/streamingcommunity/__init__.py +0 -1
  35. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/streamingcommunity/film.py +7 -5
  36. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/streamingcommunity/series.py +9 -7
  37. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/streamingcommunity/site.py +4 -2
  38. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/streamingwatch/film.py +7 -5
  39. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/streamingwatch/series.py +8 -6
  40. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/streamingwatch/site.py +3 -1
  41. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/streamingwatch/util/ScrapeSerie.py +3 -3
  42. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Template/Util/__init__.py +10 -1
  43. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Template/Util/manage_ep.py +4 -4
  44. streamingcommunity-3.2.9/StreamingCommunity/Api/Template/__init__.py +7 -0
  45. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Template/site.py +10 -6
  46. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/Downloader/DASH/cdm_helpher.py +5 -12
  47. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/Downloader/DASH/decrypt.py +1 -1
  48. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/Downloader/DASH/downloader.py +1 -1
  49. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/Downloader/DASH/parser.py +1 -1
  50. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/Downloader/DASH/segments.py +4 -3
  51. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/Downloader/HLS/downloader.py +11 -9
  52. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/Downloader/HLS/segments.py +4 -9
  53. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/Downloader/MP4/downloader.py +4 -3
  54. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/Downloader/TOR/downloader.py +3 -5
  55. streamingcommunity-3.2.9/StreamingCommunity/Lib/Downloader/__init__.py +13 -0
  56. streamingcommunity-3.2.9/StreamingCommunity/Lib/FFmpeg/__init__.py +13 -0
  57. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/FFmpeg/command.py +4 -6
  58. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/FFmpeg/util.py +1 -1
  59. streamingcommunity-3.2.9/StreamingCommunity/Lib/M3U8/__init__.py +14 -0
  60. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/M3U8/decryptor.py +8 -4
  61. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/M3U8/estimator.py +0 -6
  62. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/M3U8/parser.py +1 -1
  63. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/M3U8/url_fixer.py +1 -1
  64. streamingcommunity-3.2.9/StreamingCommunity/Lib/TMBD/__init__.py +9 -0
  65. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/TelegramHelp/config.json +1 -5
  66. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/TelegramHelp/telegram_bot.py +9 -10
  67. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Upload/version.py +2 -2
  68. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Util/config_json.py +139 -59
  69. streamingcommunity-3.2.9/StreamingCommunity/Util/http_client.py +201 -0
  70. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Util/message.py +1 -1
  71. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Util/os.py +5 -5
  72. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Util/table.py +3 -3
  73. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/__init__.py +9 -1
  74. streamingcommunity-3.2.9/StreamingCommunity/run.py +549 -0
  75. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9/StreamingCommunity.egg-info}/PKG-INFO +143 -45
  76. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity.egg-info/SOURCES.txt +2 -0
  77. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/setup.py +2 -1
  78. streamingcommunity-3.2.8/StreamingCommunity/Api/Site/mediasetinfinity/util/ScrapeSerie.py +0 -259
  79. streamingcommunity-3.2.8/StreamingCommunity/Api/Site/raiplay/film.py +0 -65
  80. streamingcommunity-3.2.8/StreamingCommunity/Api/Template/__init__.py +0 -3
  81. streamingcommunity-3.2.8/StreamingCommunity/Lib/Downloader/__init__.py +0 -5
  82. streamingcommunity-3.2.8/StreamingCommunity/Lib/FFmpeg/__init__.py +0 -4
  83. streamingcommunity-3.2.8/StreamingCommunity/Lib/M3U8/__init__.py +0 -6
  84. streamingcommunity-3.2.8/StreamingCommunity/Lib/TMBD/__init__.py +0 -4
  85. streamingcommunity-3.2.8/StreamingCommunity/run.py +0 -413
  86. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/LICENSE +0 -0
  87. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/MANIFEST.in +0 -0
  88. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py +0 -0
  89. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Player/ddl.py +0 -0
  90. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Player/maxstream.py +0 -0
  91. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Player/mediapolisvod.py +0 -0
  92. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Player/mixdrop.py +0 -0
  93. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Player/supervideo.py +0 -0
  94. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Player/vixcloud.py +0 -0
  95. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/altadefinizione/util/ScrapeSerie.py +0 -0
  96. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/animeunity/film.py +0 -0
  97. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/animeunity/site.py +0 -0
  98. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +0 -0
  99. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/animeworld/__init__.py +0 -0
  100. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/animeworld/film.py +0 -0
  101. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/animeworld/serie.py +0 -0
  102. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/cb01new/__init__.py +0 -0
  103. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/cb01new/site.py +0 -0
  104. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/crunchyroll/util/ScrapeSerie.py +0 -0
  105. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/crunchyroll/util/get_license.py +0 -0
  106. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/guardaserie/__init__.py +0 -0
  107. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/mediasetinfinity/util/fix_mpd.py +0 -0
  108. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +0 -0
  109. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Site/streamingwatch/__init__.py +0 -0
  110. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Template/Class/SearchType.py +0 -0
  111. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Api/Template/config_loader.py +0 -0
  112. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/FFmpeg/capture.py +0 -0
  113. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/TMBD/obj_tmbd.py +0 -0
  114. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Lib/TMBD/tmdb.py +0 -0
  115. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/TelegramHelp/__init__.py +0 -0
  116. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Upload/update.py +0 -0
  117. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Util/bento4_installer.py +0 -0
  118. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Util/color.py +0 -0
  119. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Util/ffmpeg_installer.py +0 -0
  120. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Util/headers.py +0 -0
  121. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/Util/logger.py +0 -0
  122. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity/global_search.py +0 -0
  123. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity.egg-info/dependency_links.txt +0 -0
  124. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity.egg-info/entry_points.txt +0 -0
  125. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity.egg-info/requires.txt +0 -0
  126. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/StreamingCommunity.egg-info/top_level.txt +0 -0
  127. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/requirements.txt +0 -0
  128. {streamingcommunity-3.2.8 → streamingcommunity-3.2.9}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: StreamingCommunity
3
- Version: 3.2.8
3
+ Version: 3.2.9
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
@@ -38,14 +38,10 @@ Dynamic: requires-python
38
38
  <div align="center">
39
39
 
40
40
  ## 📊 Project Status & Info
41
-
42
41
  [![PyPI Version](https://img.shields.io/pypi/v/streamingcommunity?logo=pypi&logoColor=white&labelColor=2d3748&color=3182ce&style=for-the-badge)](https://pypi.org/project/streamingcommunity)
43
- [![Downloads](https://img.shields.io/pypi/dm/streamingcommunity?logo=pypi&logoColor=white&labelColor=2d3748&color=38a169&style=for-the-badge)](https://pypi.org/project/streamingcommunity)
44
- [![License](https://img.shields.io/github/license/Arrowar/StreamingCommunity?logo=gnu&logoColor=white&labelColor=2d3748&color=e53e3e&style=for-the-badge)](https://github.com/Arrowar/StreamingCommunity/blob/main/LICENSE)
45
-
46
- [![Code Lines](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Arrowar/StreamingCommunity/main/.github/.domain/loc-badge.json&style=for-the-badge&labelColor=2d3748)](https://github.com/Arrowar/StreamingCommunity)
47
42
  [![Last Commit](https://img.shields.io/github/last-commit/Arrowar/StreamingCommunity?logo=git&logoColor=white&labelColor=2d3748&color=805ad5&style=for-the-badge)](https://github.com/Arrowar/StreamingCommunity/commits)
48
43
  [![Issues](https://img.shields.io/github/issues/Arrowar/StreamingCommunity?logo=github&logoColor=white&labelColor=2d3748&color=ed8936&style=for-the-badge)](https://github.com/Arrowar/StreamingCommunity/issues)
44
+ [![License](https://img.shields.io/github/license/Arrowar/StreamingCommunity?logo=gnu&logoColor=white&labelColor=2d3748&color=e53e3e&style=for-the-badge)](https://github.com/Arrowar/StreamingCommunity/blob/main/LICENSE)
49
45
 
50
46
  ## 💝 Support the Project
51
47
 
@@ -97,6 +93,7 @@ Dynamic: requires-python
97
93
  - 🔧 [Manual domain configuration](#update-domains)
98
94
  - 🐳 [Docker](#docker)
99
95
  - 📝 [Telegram Usage](#telegram-usage)
96
+ - 🧩 [Hook/Plugin System](#hookplugin-system)
100
97
  </details>
101
98
 
102
99
  <details>
@@ -216,6 +213,29 @@ client.start_download()
216
213
  See [Torrent example](./Test/Download/TOR.py) for complete usage.
217
214
  </details>
218
215
 
216
+ <details>
217
+ <summary>🎞️ DASH Downloader</summary>
218
+
219
+ ```python
220
+ license_url = "https://example.com/stream.mpd"
221
+ mpd_url = "https://example.com/get_license"
222
+
223
+ dash_process = DASH_Downloader(
224
+ cdm_device=get_wvd_path(),
225
+ license_url=license_url,
226
+ mpd_url=mpd_url,
227
+ output_path="output.mp4",
228
+ )
229
+ dash_process.parse_manifest()
230
+
231
+ if dash_process.download_and_decrypt():
232
+ dash_process.finalize_output()
233
+
234
+ dash_process.get_status()
235
+ ```
236
+
237
+ </details>
238
+
219
239
  ## Binary Location
220
240
 
221
241
  <details>
@@ -346,40 +366,113 @@ python3 update.py
346
366
  <details>
347
367
  <summary>🌐 Domain Configuration Methods</summary>
348
368
 
349
- There are two ways to update the domains for the supported websites:
369
+ There are two ways to manage the domains for the supported websites:
350
370
 
351
- ### 1. Using Local Configuration
371
+ ### 1. Online Domain Fetching (Recommended)
352
372
 
353
- 1. Create a `domains.json` file in the root directory of the project
373
+ Set `fetch_domain_online` to `true` in your `config.json`:
354
374
 
355
- 2. Add your domain configuration in the following format:
356
- ```json
357
- {
358
- "altadefinizione": {
359
- "domain": "si",
360
- "full_url": "https://altadefinizione.si/"
361
- },
362
- ...
375
+ ```json
376
+ {
377
+ "DEFAULT": {
378
+ "fetch_domain_online": true
363
379
  }
364
- ```
365
-
366
- 3. Set `use_api` to `false` in the `DEFAULT` section of your `config.json`:
367
- ```json
368
- {
369
- "DEFAULT": {
370
- "use_api": false
371
- }
380
+ }
381
+ ```
382
+
383
+ This will:
384
+ - Download the latest domains from the GitHub repository
385
+ - Automatically save them to a local `domains.json` file
386
+ - Ensure you always have the most up-to-date streaming site domains
387
+
388
+ ### 2. Local Domain Configuration
389
+
390
+ Set `fetch_domain_online` to `false` to use a local configuration:
391
+
392
+ ```json
393
+ {
394
+ "DEFAULT": {
395
+ "fetch_domain_online": false
372
396
  }
373
- ```
397
+ }
398
+ ```
374
399
 
375
- ### 2. Using API (Legacy)
400
+ Then create a `domains.json` file in the root directory with your domain configuration:
376
401
 
377
- The API-based domain updates are currently deprecated. To use it anyway, set `use_api` to `true` in your `config.json` file.
402
+ ```json
403
+ {
404
+ "altadefinizione": {
405
+ "domain": "si",
406
+ "full_url": "https://altadefinizione.si/"
407
+ },
408
+ "streamingcommunity": {
409
+ "domain": "best",
410
+ "full_url": "https://streamingcommunity.best/"
411
+ }
412
+ }
413
+ ```
414
+
415
+ ### 3. Automatic Fallback
378
416
 
379
- Note: If `use_api` is set to `false` and no `domains.json` file is found, the script will raise an error.
417
+ If online fetching fails, the script will automatically attempt to use the local `domains.json` file as a fallback, ensuring maximum reliability.
380
418
 
381
- #### 💡 Adding a New Site to the Legacy API
382
- If you want to add a new site to the legacy API, just message me on the Discord server, and I'll add it!
419
+ #### 💡 Adding a New Site
420
+ If you want to request a new site to be added to the repository, message us on the Discord server!
421
+
422
+ </details>
423
+
424
+ ## Hook/Plugin System
425
+
426
+ <details>
427
+ <summary>🧩 Run custom scripts before/after the main execution</summary>
428
+
429
+ Define pre/post hooks in `config.json` under the `HOOKS` section. Supported types:
430
+
431
+ - **python**: runs `script.py` with the current Python interpreter
432
+ - **bash/sh**: runs via `bash`/`sh` on macOS/Linux
433
+ - **bat/cmd**: runs via `cmd /c` on Windows
434
+ - Inline **command**: use `command` instead of `path`
435
+
436
+ Sample configuration:
437
+
438
+ ```json
439
+ {
440
+ "HOOKS": {
441
+ "pre_run": [
442
+ {
443
+ "name": "prepare-env",
444
+ "type": "python",
445
+ "path": "scripts/prepare.py",
446
+ "args": ["--clean"],
447
+ "env": {"MY_FLAG": "1"},
448
+ "cwd": "~",
449
+ "os": ["linux", "darwin"],
450
+ "timeout": 60,
451
+ "enabled": true,
452
+ "continue_on_error": true
453
+ }
454
+ ],
455
+ "post_run": [
456
+ {
457
+ "name": "notify",
458
+ "type": "bash",
459
+ "command": "echo 'Download completed'"
460
+ }
461
+ ]
462
+ }
463
+ }
464
+ ```
465
+
466
+ Notes:
467
+
468
+ - **os**: optional OS filter (`windows`, `darwin` (`darwin` is used for MacOS), `linux`).
469
+ - **args**: list of arguments passed to the script.
470
+ - **env**: additional environment variables.
471
+ - **cwd**: working directory for the script; supports `~` and environment variables.
472
+ - **continue_on_error**: if `false`, the app stops when the hook fails.
473
+ - **timeout**: in seconds; when exceeded the hook fails.
474
+
475
+ Hooks are executed automatically by `run.py` before (`pre_run`) and after (`post_run`) the main execution.
383
476
 
384
477
  </details>
385
478
 
@@ -399,12 +492,9 @@ You can change some behaviors by tweaking the configuration file. The configurat
399
492
  "DEFAULT": {
400
493
  "debug": false,
401
494
  "show_message": true,
402
- "clean_console": true,
403
495
  "show_trending": true,
404
- "use_api": true,
405
- "not_close": false,
496
+ "fetch_domain_online": true,
406
497
  "telegram_bot": false,
407
- "download_site_data": false,
408
498
  "validate_github_config": false
409
499
  }
410
500
  }
@@ -412,13 +502,9 @@ You can change some behaviors by tweaking the configuration file. The configurat
412
502
 
413
503
  - `debug`: Enables debug logging
414
504
  - `show_message`: Displays informational messages
415
- - `clean_console`: Clears the console between operations
416
505
  - `show_trending`: Shows trending content
417
- - `use_api`: Uses API for domain updates instead of local configuration
418
- - `not_close`: If set to true, keeps the program running after download is complete
419
- * Can be changed from terminal with `--not_close true/false`
506
+ - `fetch_domain_online`: If true, downloads domains from GitHub repository and saves to local file; if false, uses existing local domains.json file
420
507
  - `telegram_bot`: Enables Telegram bot integration
421
- - `download_site_data`: If set to false, disables automatic site data download
422
508
  - `validate_github_config`: If set to false, disables validation and updating of configuration from GitHub
423
509
  </details>
424
510
 
@@ -630,8 +716,7 @@ Note: Requires updated drivers and FFmpeg with hardware acceleration support.
630
716
  ```json
631
717
  {
632
718
  "M3U8_PARSER": {
633
- "force_resolution": "Best",
634
- "get_only_link": false
719
+ "force_resolution": "Best"
635
720
  }
636
721
  }
637
722
  ```
@@ -651,8 +736,6 @@ Note: Requires updated drivers and FFmpeg with hardware acceleration support.
651
736
  - 240p (320x240)
652
737
  - 144p (256x144)
653
738
 
654
- #### Link Options
655
- - `get_only_link`: Return M3U8 playlist/index URL instead of downloading
656
739
  </details>
657
740
 
658
741
  # Global Search
@@ -700,6 +783,18 @@ The Global Search can be configured from the command line:
700
783
  # Examples of terminal usage
701
784
 
702
785
  ```bash
786
+ # Run a specific site by name with a search term
787
+ python test_run.py --site streamingcommunity --search "interstellar"
788
+
789
+ # Run a specific site by numeric index (as shown in -h help)
790
+ python test_run.py --site 0 --search "interstellar"
791
+
792
+ # Auto-download the first result from search (requires --site and --search)
793
+ python test_run.py --site streamingcommunity --search "interstellar" --auto-first
794
+
795
+ # Show help (includes available sites by name and by index)
796
+ python test_run.py -h
797
+
703
798
  # Change video and audio workers
704
799
  python test_run.py --default_video_worker 8 --default_audio_worker 8
705
800
 
@@ -709,7 +804,7 @@ python test_run.py --specific_list_audio ita,eng --specific_list_subtitles eng,s
709
804
  # Keep console open after download
710
805
  python test_run.py --not_close true
711
806
 
712
- # Use global searchAdd commentMore actions
807
+ # Use global search
713
808
  python test_run.py --global -s "cars"
714
809
 
715
810
  # Select specific category
@@ -717,6 +812,9 @@ python test_run.py --category 1 # Search in anime category
717
812
  python test_run.py --category 2 # Search in movies & series
718
813
  python test_run.py --category 3 # Search in series
719
814
  python test_run.py --category 4 # Search in torrent category
815
+
816
+ # If installed via pip, you can also use the entrypoint directly
817
+ streamingcommunity --site streamingcommunity --search "interstellar" --auto-first
720
818
  ```
721
819
 
722
820
  # Docker
@@ -1,14 +1,10 @@
1
1
  <div align="center">
2
2
 
3
3
  ## 📊 Project Status & Info
4
-
5
4
  [![PyPI Version](https://img.shields.io/pypi/v/streamingcommunity?logo=pypi&logoColor=white&labelColor=2d3748&color=3182ce&style=for-the-badge)](https://pypi.org/project/streamingcommunity)
6
- [![Downloads](https://img.shields.io/pypi/dm/streamingcommunity?logo=pypi&logoColor=white&labelColor=2d3748&color=38a169&style=for-the-badge)](https://pypi.org/project/streamingcommunity)
7
- [![License](https://img.shields.io/github/license/Arrowar/StreamingCommunity?logo=gnu&logoColor=white&labelColor=2d3748&color=e53e3e&style=for-the-badge)](https://github.com/Arrowar/StreamingCommunity/blob/main/LICENSE)
8
-
9
- [![Code Lines](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/Arrowar/StreamingCommunity/main/.github/.domain/loc-badge.json&style=for-the-badge&labelColor=2d3748)](https://github.com/Arrowar/StreamingCommunity)
10
5
  [![Last Commit](https://img.shields.io/github/last-commit/Arrowar/StreamingCommunity?logo=git&logoColor=white&labelColor=2d3748&color=805ad5&style=for-the-badge)](https://github.com/Arrowar/StreamingCommunity/commits)
11
6
  [![Issues](https://img.shields.io/github/issues/Arrowar/StreamingCommunity?logo=github&logoColor=white&labelColor=2d3748&color=ed8936&style=for-the-badge)](https://github.com/Arrowar/StreamingCommunity/issues)
7
+ [![License](https://img.shields.io/github/license/Arrowar/StreamingCommunity?logo=gnu&logoColor=white&labelColor=2d3748&color=e53e3e&style=for-the-badge)](https://github.com/Arrowar/StreamingCommunity/blob/main/LICENSE)
12
8
 
13
9
  ## 💝 Support the Project
14
10
 
@@ -60,6 +56,7 @@
60
56
  - 🔧 [Manual domain configuration](#update-domains)
61
57
  - 🐳 [Docker](#docker)
62
58
  - 📝 [Telegram Usage](#telegram-usage)
59
+ - 🧩 [Hook/Plugin System](#hookplugin-system)
63
60
  </details>
64
61
 
65
62
  <details>
@@ -179,6 +176,29 @@ client.start_download()
179
176
  See [Torrent example](./Test/Download/TOR.py) for complete usage.
180
177
  </details>
181
178
 
179
+ <details>
180
+ <summary>🎞️ DASH Downloader</summary>
181
+
182
+ ```python
183
+ license_url = "https://example.com/stream.mpd"
184
+ mpd_url = "https://example.com/get_license"
185
+
186
+ dash_process = DASH_Downloader(
187
+ cdm_device=get_wvd_path(),
188
+ license_url=license_url,
189
+ mpd_url=mpd_url,
190
+ output_path="output.mp4",
191
+ )
192
+ dash_process.parse_manifest()
193
+
194
+ if dash_process.download_and_decrypt():
195
+ dash_process.finalize_output()
196
+
197
+ dash_process.get_status()
198
+ ```
199
+
200
+ </details>
201
+
182
202
  ## Binary Location
183
203
 
184
204
  <details>
@@ -309,40 +329,113 @@ python3 update.py
309
329
  <details>
310
330
  <summary>🌐 Domain Configuration Methods</summary>
311
331
 
312
- There are two ways to update the domains for the supported websites:
332
+ There are two ways to manage the domains for the supported websites:
313
333
 
314
- ### 1. Using Local Configuration
334
+ ### 1. Online Domain Fetching (Recommended)
315
335
 
316
- 1. Create a `domains.json` file in the root directory of the project
336
+ Set `fetch_domain_online` to `true` in your `config.json`:
317
337
 
318
- 2. Add your domain configuration in the following format:
319
- ```json
320
- {
321
- "altadefinizione": {
322
- "domain": "si",
323
- "full_url": "https://altadefinizione.si/"
324
- },
325
- ...
338
+ ```json
339
+ {
340
+ "DEFAULT": {
341
+ "fetch_domain_online": true
326
342
  }
327
- ```
328
-
329
- 3. Set `use_api` to `false` in the `DEFAULT` section of your `config.json`:
330
- ```json
331
- {
332
- "DEFAULT": {
333
- "use_api": false
334
- }
343
+ }
344
+ ```
345
+
346
+ This will:
347
+ - Download the latest domains from the GitHub repository
348
+ - Automatically save them to a local `domains.json` file
349
+ - Ensure you always have the most up-to-date streaming site domains
350
+
351
+ ### 2. Local Domain Configuration
352
+
353
+ Set `fetch_domain_online` to `false` to use a local configuration:
354
+
355
+ ```json
356
+ {
357
+ "DEFAULT": {
358
+ "fetch_domain_online": false
335
359
  }
336
- ```
360
+ }
361
+ ```
337
362
 
338
- ### 2. Using API (Legacy)
363
+ Then create a `domains.json` file in the root directory with your domain configuration:
339
364
 
340
- The API-based domain updates are currently deprecated. To use it anyway, set `use_api` to `true` in your `config.json` file.
365
+ ```json
366
+ {
367
+ "altadefinizione": {
368
+ "domain": "si",
369
+ "full_url": "https://altadefinizione.si/"
370
+ },
371
+ "streamingcommunity": {
372
+ "domain": "best",
373
+ "full_url": "https://streamingcommunity.best/"
374
+ }
375
+ }
376
+ ```
377
+
378
+ ### 3. Automatic Fallback
341
379
 
342
- Note: If `use_api` is set to `false` and no `domains.json` file is found, the script will raise an error.
380
+ If online fetching fails, the script will automatically attempt to use the local `domains.json` file as a fallback, ensuring maximum reliability.
343
381
 
344
- #### 💡 Adding a New Site to the Legacy API
345
- If you want to add a new site to the legacy API, just message me on the Discord server, and I'll add it!
382
+ #### 💡 Adding a New Site
383
+ If you want to request a new site to be added to the repository, message us on the Discord server!
384
+
385
+ </details>
386
+
387
+ ## Hook/Plugin System
388
+
389
+ <details>
390
+ <summary>🧩 Run custom scripts before/after the main execution</summary>
391
+
392
+ Define pre/post hooks in `config.json` under the `HOOKS` section. Supported types:
393
+
394
+ - **python**: runs `script.py` with the current Python interpreter
395
+ - **bash/sh**: runs via `bash`/`sh` on macOS/Linux
396
+ - **bat/cmd**: runs via `cmd /c` on Windows
397
+ - Inline **command**: use `command` instead of `path`
398
+
399
+ Sample configuration:
400
+
401
+ ```json
402
+ {
403
+ "HOOKS": {
404
+ "pre_run": [
405
+ {
406
+ "name": "prepare-env",
407
+ "type": "python",
408
+ "path": "scripts/prepare.py",
409
+ "args": ["--clean"],
410
+ "env": {"MY_FLAG": "1"},
411
+ "cwd": "~",
412
+ "os": ["linux", "darwin"],
413
+ "timeout": 60,
414
+ "enabled": true,
415
+ "continue_on_error": true
416
+ }
417
+ ],
418
+ "post_run": [
419
+ {
420
+ "name": "notify",
421
+ "type": "bash",
422
+ "command": "echo 'Download completed'"
423
+ }
424
+ ]
425
+ }
426
+ }
427
+ ```
428
+
429
+ Notes:
430
+
431
+ - **os**: optional OS filter (`windows`, `darwin` (`darwin` is used for MacOS), `linux`).
432
+ - **args**: list of arguments passed to the script.
433
+ - **env**: additional environment variables.
434
+ - **cwd**: working directory for the script; supports `~` and environment variables.
435
+ - **continue_on_error**: if `false`, the app stops when the hook fails.
436
+ - **timeout**: in seconds; when exceeded the hook fails.
437
+
438
+ Hooks are executed automatically by `run.py` before (`pre_run`) and after (`post_run`) the main execution.
346
439
 
347
440
  </details>
348
441
 
@@ -362,12 +455,9 @@ You can change some behaviors by tweaking the configuration file. The configurat
362
455
  "DEFAULT": {
363
456
  "debug": false,
364
457
  "show_message": true,
365
- "clean_console": true,
366
458
  "show_trending": true,
367
- "use_api": true,
368
- "not_close": false,
459
+ "fetch_domain_online": true,
369
460
  "telegram_bot": false,
370
- "download_site_data": false,
371
461
  "validate_github_config": false
372
462
  }
373
463
  }
@@ -375,13 +465,9 @@ You can change some behaviors by tweaking the configuration file. The configurat
375
465
 
376
466
  - `debug`: Enables debug logging
377
467
  - `show_message`: Displays informational messages
378
- - `clean_console`: Clears the console between operations
379
468
  - `show_trending`: Shows trending content
380
- - `use_api`: Uses API for domain updates instead of local configuration
381
- - `not_close`: If set to true, keeps the program running after download is complete
382
- * Can be changed from terminal with `--not_close true/false`
469
+ - `fetch_domain_online`: If true, downloads domains from GitHub repository and saves to local file; if false, uses existing local domains.json file
383
470
  - `telegram_bot`: Enables Telegram bot integration
384
- - `download_site_data`: If set to false, disables automatic site data download
385
471
  - `validate_github_config`: If set to false, disables validation and updating of configuration from GitHub
386
472
  </details>
387
473
 
@@ -593,8 +679,7 @@ Note: Requires updated drivers and FFmpeg with hardware acceleration support.
593
679
  ```json
594
680
  {
595
681
  "M3U8_PARSER": {
596
- "force_resolution": "Best",
597
- "get_only_link": false
682
+ "force_resolution": "Best"
598
683
  }
599
684
  }
600
685
  ```
@@ -614,8 +699,6 @@ Note: Requires updated drivers and FFmpeg with hardware acceleration support.
614
699
  - 240p (320x240)
615
700
  - 144p (256x144)
616
701
 
617
- #### Link Options
618
- - `get_only_link`: Return M3U8 playlist/index URL instead of downloading
619
702
  </details>
620
703
 
621
704
  # Global Search
@@ -663,6 +746,18 @@ The Global Search can be configured from the command line:
663
746
  # Examples of terminal usage
664
747
 
665
748
  ```bash
749
+ # Run a specific site by name with a search term
750
+ python test_run.py --site streamingcommunity --search "interstellar"
751
+
752
+ # Run a specific site by numeric index (as shown in -h help)
753
+ python test_run.py --site 0 --search "interstellar"
754
+
755
+ # Auto-download the first result from search (requires --site and --search)
756
+ python test_run.py --site streamingcommunity --search "interstellar" --auto-first
757
+
758
+ # Show help (includes available sites by name and by index)
759
+ python test_run.py -h
760
+
666
761
  # Change video and audio workers
667
762
  python test_run.py --default_video_worker 8 --default_audio_worker 8
668
763
 
@@ -672,7 +767,7 @@ python test_run.py --specific_list_audio ita,eng --specific_list_subtitles eng,s
672
767
  # Keep console open after download
673
768
  python test_run.py --not_close true
674
769
 
675
- # Use global searchAdd commentMore actions
770
+ # Use global search
676
771
  python test_run.py --global -s "cars"
677
772
 
678
773
  # Select specific category
@@ -680,6 +775,9 @@ python test_run.py --category 1 # Search in anime category
680
775
  python test_run.py --category 2 # Search in movies & series
681
776
  python test_run.py --category 3 # Search in series
682
777
  python test_run.py --category 4 # Search in torrent category
778
+
779
+ # If installed via pip, you can also use the entrypoint directly
780
+ streamingcommunity --site streamingcommunity --search "interstellar" --auto-first
683
781
  ```
684
782
 
685
783
  # Docker
@@ -799,4 +897,4 @@ API non ufficiale per accedere ai contenuti del sito italiano StreamingCommunity
799
897
 
800
898
  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.
801
899
 
802
- > **Note:** DASH downloads require a valid L3 CDM (Content Decryption Module) to proceed. This project does not provide, include, or facilitate obtaining any CDM. Users are responsible for ensuring compliance with all applicable laws and requirements regarding DRM and decryption modules.
900
+ > **Note:** DASH downloads require a valid L3 CDM (Content Decryption Module) to proceed. This project does not provide, include, or facilitate obtaining any CDM. Users are responsible for ensuring compliance with all applicable laws and requirements regarding DRM and decryption modules.
@@ -1,6 +1,6 @@
1
1
  # 23.11.24
2
2
 
3
- from typing import Dict, Any, List, Union, List, Optional
3
+ from typing import Dict, Any, List, Optional
4
4
 
5
5
 
6
6
  class Episode:
@@ -12,6 +12,7 @@ class Episode:
12
12
  self.name: str = data.get('name', '')
13
13
  self.duration: int = data.get('duration', 0)
14
14
  self.url: str = data.get('url', '')
15
+ self.mpd_id: str = data.get('mpd_id', '')
15
16
 
16
17
  def __str__(self):
17
18
  return f"Episode(id={self.id}, number={self.number}, name='{self.name}', duration={self.duration} sec)"
@@ -3,12 +3,12 @@
3
3
  import re
4
4
 
5
5
  # External library
6
- import httpx
7
6
  from bs4 import BeautifulSoup
8
7
 
9
8
 
10
9
  # Internal utilities
11
10
  from StreamingCommunity.Util.headers import get_userAgent
11
+ from StreamingCommunity.Util.http_client import create_client
12
12
  from StreamingCommunity.Util.config_json import config_manager
13
13
 
14
14
 
@@ -19,7 +19,7 @@ REQUEST_VERIFY = config_manager.get_bool('REQUESTS', 'verify')
19
19
 
20
20
  class VideoSource:
21
21
  def __init__(self):
22
- self.client = httpx.Client(headers={'user-agent': get_userAgent()}, timeout=MAX_TIMEOUT, verify=REQUEST_VERIFY)
22
+ self.client = create_client(headers={'user-agent': get_userAgent()})
23
23
 
24
24
  def extractLinkHdPlayer(self, response):
25
25
  """Extract iframe source from the page."""
@@ -4,12 +4,12 @@ import logging
4
4
 
5
5
 
6
6
  # External libraries
7
- import httpx
8
7
 
9
8
 
10
9
  # Internal utilities
11
10
  from StreamingCommunity.Util.config_json import config_manager
12
11
  from StreamingCommunity.Util.headers import get_userAgent
12
+ from StreamingCommunity.Util.http_client import create_client
13
13
 
14
14
 
15
15
  # Variable
@@ -17,21 +17,18 @@ MAX_TIMEOUT = config_manager.get_int("REQUESTS", "timeout")
17
17
  REQUEST_VERIFY = config_manager.get_bool('REQUESTS', 'verify')
18
18
 
19
19
  class VideoSource:
20
- def __init__(self, full_url, episode_data, session_id, csrf_token):
20
+ def __init__(self, site_url, episode_data, session_id, csrf_token):
21
21
  """Initialize the VideoSource with session details, episode data, and URL."""
22
22
  self.session_id = session_id
23
23
  self.csrf_token = csrf_token
24
24
  self.episode_data = episode_data
25
25
  self.number = episode_data['number']
26
- self.link = episode_data['link']
26
+ self.link = site_url + episode_data['link']
27
27
 
28
28
  # Create an HTTP client with session cookies, headers, and base URL.
29
- self.client = httpx.Client(
29
+ self.client = create_client(
30
30
  cookies={"sessionId": session_id},
31
- headers={"User-Agent": get_userAgent(), "csrf-token": csrf_token},
32
- base_url=full_url,
33
- timeout=MAX_TIMEOUT,
34
- verify=REQUEST_VERIFY
31
+ headers={"User-Agent": get_userAgent(), "csrf-token": csrf_token}
35
32
  )
36
33
 
37
34
  def get_playlist(self):
@@ -43,7 +43,7 @@ def get_user_input(string_to_search: str = None):
43
43
  bot = get_bot_instance()
44
44
  string_to_search = bot.ask(
45
45
  "key_search",
46
- f"Enter the search term\nor type 'back' to return to the menu: ",
46
+ "Enter the search term\nor type 'back' to return to the menu: ",
47
47
  None
48
48
  )
49
49
 
@@ -117,7 +117,7 @@ def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_
117
117
  console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
118
118
 
119
119
  if site_constant.TELEGRAM_BOT:
120
- bot.send_message(f"No results found, please try again", None)
120
+ bot.send_message("No results found, please try again", None)
121
121
 
122
122
  # If no results are found, ask again
123
123
  string_to_search = get_user_input()