StreamingCommunity 2.0.5__tar.gz → 2.3.0__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 (116) hide show
  1. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/PKG-INFO +37 -20
  2. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/README.md +36 -19
  3. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Player/Helper/Vixcloud/util.py +15 -24
  4. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/1337xx/site.py +9 -6
  5. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/1337xx/title.py +2 -2
  6. StreamingCommunity-2.3.0/StreamingCommunity/Api/Site/altadefinizione/costant.py +19 -0
  7. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/altadefinizione/film.py +2 -2
  8. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/altadefinizione/site.py +28 -22
  9. StreamingCommunity-2.3.0/StreamingCommunity/Api/Site/animeunity/costant.py +19 -0
  10. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/animeunity/film_serie.py +3 -3
  11. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/animeunity/site.py +27 -19
  12. StreamingCommunity-2.3.0/StreamingCommunity/Api/Site/cb01new/costant.py +19 -0
  13. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/cb01new/film.py +2 -2
  14. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/cb01new/site.py +20 -13
  15. StreamingCommunity-2.3.0/StreamingCommunity/Api/Site/ddlstreamitaly/costant.py +20 -0
  16. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/ddlstreamitaly/series.py +2 -2
  17. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/ddlstreamitaly/site.py +9 -5
  18. StreamingCommunity-2.3.0/StreamingCommunity/Api/Site/guardaserie/costant.py +19 -0
  19. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/guardaserie/series.py +2 -3
  20. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/guardaserie/site.py +10 -6
  21. StreamingCommunity-2.3.0/StreamingCommunity/Api/Site/ilcorsaronero/costant.py +19 -0
  22. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/ilcorsaronero/site.py +22 -13
  23. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/ilcorsaronero/title.py +3 -3
  24. StreamingCommunity-2.3.0/StreamingCommunity/Api/Site/mostraguarda/costant.py +19 -0
  25. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/mostraguarda/film.py +2 -2
  26. StreamingCommunity-2.3.0/StreamingCommunity/Api/Site/streamingcommunity/costant.py +19 -0
  27. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/streamingcommunity/film.py +3 -3
  28. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/streamingcommunity/series.py +2 -2
  29. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/streamingcommunity/site.py +29 -28
  30. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +24 -24
  31. StreamingCommunity-2.3.0/StreamingCommunity/Api/Template/Util/get_domain.py +137 -0
  32. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/Downloader/HLS/downloader.py +3 -2
  33. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/Downloader/HLS/segments.py +21 -17
  34. StreamingCommunity-2.3.0/StreamingCommunity/Lib/M3U8/estimator.py +229 -0
  35. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Upload/version.py +1 -1
  36. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Util/ffmpeg_installer.py +8 -5
  37. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity.egg-info/PKG-INFO +37 -20
  38. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/Test/call_updateDomain.py +47 -4
  39. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/setup.py +1 -1
  40. StreamingCommunity-2.0.5/StreamingCommunity/Api/Site/altadefinizione/costant.py +0 -15
  41. StreamingCommunity-2.0.5/StreamingCommunity/Api/Site/animeunity/costant.py +0 -15
  42. StreamingCommunity-2.0.5/StreamingCommunity/Api/Site/cb01new/costant.py +0 -15
  43. StreamingCommunity-2.0.5/StreamingCommunity/Api/Site/ddlstreamitaly/costant.py +0 -16
  44. StreamingCommunity-2.0.5/StreamingCommunity/Api/Site/guardaserie/costant.py +0 -15
  45. StreamingCommunity-2.0.5/StreamingCommunity/Api/Site/ilcorsaronero/costant.py +0 -15
  46. StreamingCommunity-2.0.5/StreamingCommunity/Api/Site/mostraguarda/costant.py +0 -15
  47. StreamingCommunity-2.0.5/StreamingCommunity/Api/Site/streamingcommunity/costant.py +0 -15
  48. StreamingCommunity-2.0.5/StreamingCommunity/Api/Template/Util/get_domain.py +0 -174
  49. StreamingCommunity-2.0.5/StreamingCommunity/Lib/M3U8/estimator.py +0 -204
  50. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/MANIFEST.in +0 -0
  51. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py +0 -0
  52. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Player/ddl.py +0 -0
  53. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Player/maxstream.py +0 -0
  54. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Player/supervideo.py +0 -0
  55. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Player/vixcloud.py +0 -0
  56. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/1337xx/__init__.py +0 -0
  57. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/1337xx/costant.py +0 -0
  58. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/altadefinizione/__init__.py +0 -0
  59. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/animeunity/__init__.py +0 -0
  60. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +0 -0
  61. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/cb01new/__init__.py +0 -0
  62. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +0 -0
  63. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py +0 -0
  64. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/guardaserie/__init__.py +0 -0
  65. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +0 -0
  66. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/ilcorsaronero/__init__.py +0 -0
  67. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/ilcorsaronero/util/ilCorsarScraper.py +0 -0
  68. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/mostraguarda/__init__.py +0 -0
  69. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Site/streamingcommunity/__init__.py +0 -0
  70. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Template/Class/SearchType.py +0 -0
  71. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Template/Util/__init__.py +0 -0
  72. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Template/Util/manage_ep.py +0 -0
  73. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Template/Util/recall_search.py +0 -0
  74. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Template/__init__.py +0 -0
  75. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Api/Template/site.py +0 -0
  76. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/Downloader/HLS/proxyes.py +0 -0
  77. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/Downloader/MP4/downloader.py +0 -0
  78. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/Downloader/TOR/downloader.py +0 -0
  79. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/Downloader/__init__.py +0 -0
  80. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/FFmpeg/__init__.py +0 -0
  81. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/FFmpeg/capture.py +0 -0
  82. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/FFmpeg/command.py +0 -0
  83. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/FFmpeg/util.py +0 -0
  84. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/M3U8/__init__.py +0 -0
  85. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/M3U8/decryptor.py +0 -0
  86. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/M3U8/parser.py +0 -0
  87. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/M3U8/url_fixer.py +0 -0
  88. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/TMBD/__init__.py +0 -0
  89. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/TMBD/obj_tmbd.py +0 -0
  90. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Lib/TMBD/tmdb.py +0 -0
  91. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Upload/update.py +0 -0
  92. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Util/_jsonConfig.py +0 -0
  93. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Util/call_stack.py +0 -0
  94. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Util/color.py +0 -0
  95. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Util/console.py +0 -0
  96. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Util/headers.py +0 -0
  97. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Util/logger.py +0 -0
  98. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Util/message.py +0 -0
  99. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Util/os.py +0 -0
  100. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/Util/table.py +0 -0
  101. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/__init__.py +0 -0
  102. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity/run.py +0 -0
  103. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity.egg-info/SOURCES.txt +0 -0
  104. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity.egg-info/dependency_links.txt +0 -0
  105. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity.egg-info/entry_points.txt +0 -0
  106. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity.egg-info/requires.txt +0 -0
  107. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/StreamingCommunity.egg-info/top_level.txt +0 -0
  108. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/Test/Download/HLS.py +0 -0
  109. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/Test/Download/MP4.py +0 -0
  110. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/Test/Download/TOR.py +0 -0
  111. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/Test/Player/helper/vixcloud.py +0 -0
  112. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/Test/Player/maxtream.py +0 -0
  113. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/Test/Player/supervideo.py +0 -0
  114. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/Test/Player/vixcloud.py +0 -0
  115. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/Test/big_search.py +0 -0
  116. {StreamingCommunity-2.0.5 → StreamingCommunity-2.3.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: StreamingCommunity
3
- Version: 2.0.5
3
+ Version: 2.3.0
4
4
  Summary: UNKNOWN
5
5
  Home-page: https://github.com/Lovi-0/StreamingCommunity
6
6
  Author: Lovi-0
@@ -15,9 +15,6 @@ Description: <p align="center">
15
15
  <a href="https://pypi.org/project/streamingcommunity">
16
16
  <img src="https://img.shields.io/pypi/v/streamingcommunity?logo=pypi&labelColor=555555&style=for-the-badge" alt="PyPI"/>
17
17
  </a>
18
- <a href="https://www.python.org">
19
- <img src="https://img.shields.io/badge/Python->=3.8-3776AB?style=for-the-badge&logo=python&logoColor=white" alt="Python"/>
20
- </a>
21
18
  <a href="https://www.paypal.com/donate/?hosted_button_id=UXTWMT8P6HE2C">
22
19
  <img src="https://img.shields.io/badge/_-Donate-red.svg?logo=githubsponsors&labelColor=555555&style=for-the-badge" alt="Donate"/>
23
20
  </a>
@@ -71,6 +68,22 @@ Description: <p align="center">
71
68
 
72
69
  # Installation
73
70
 
71
+ <p align="center">
72
+ <a href="https://github.com/Lovi-0/StreamingCommunity/releases/latest/download/StreamingCommunity.exe">
73
+ <img src="https://img.shields.io/badge/-Windows_x64-blue.svg?style=for-the-badge&logo=windows" alt="Windows">
74
+ </a>
75
+ <a href="https://pypi.org/project/StreamingCommunity">
76
+ <img src="https://img.shields.io/badge/-PyPI-blue.svg?logo=pypi&labelColor=555555&style=for-the-badge" alt="PyPI">
77
+ </a>
78
+ <a href="https://github.com/Lovi-0/StreamingCommunity/releases/latest/download/StreamingCommunity.zip">
79
+ <img src="https://img.shields.io/badge/-Source_tar-green.svg?style=for-the-badge" alt="Source Tarball">
80
+ </a>
81
+ <a href="https://github.com/Lovi-0/StreamingCommunity/releases">
82
+ <img src="https://img.shields.io/badge/-All_Versions-lightgrey.svg?style=for-the-badge" alt="All Versions">
83
+ </a>
84
+ </p>
85
+
86
+
74
87
  ## 1. PyPI Installation
75
88
 
76
89
  Install directly from PyPI:
@@ -210,12 +223,14 @@ Description: <p align="center">
210
223
  "movie_folder_name": "Movie",
211
224
  "serie_folder_name": "TV",
212
225
  "map_episode_name": "%(tv_name)_S%(season)E%(episode)_%(episode_name)",
226
+ "add_siteName": false,
227
+ "disable_searchDomain": false,
213
228
  "not_close": false
214
229
  }
215
230
  ```
216
231
 
217
232
  - `root_path`: Directory where all videos will be saved
218
-
233
+
219
234
  ### Path examples:
220
235
  * Windows: `C:\\MyLibrary\\Folder` or `\\\\MyServer\\MyLibrary` (if you want to use a network folder)
221
236
  * Linux/MacOS: `Desktop/MyLibrary/Folder`
@@ -237,7 +252,10 @@ Description: <p align="center">
237
252
  * `%(episode_name)` : Is the name of the episode
238
253
  `<br/><br/>`
239
254
 
240
- - `not_close`: If true, continues running after downloading
255
+ - `add_siteName`: If set to true, appends the site_name to the root path before the movie and serie folders.
256
+ - `disable_searchDomain`: If set to true, disables the search for a new domain for all sites.
257
+ - `not_close`: If set to true, keeps the program running after the download is complete.
258
+
241
259
 
242
260
  ### qBittorrent Configuration
243
261
 
@@ -254,7 +272,6 @@ Description: <p align="center">
254
272
 
255
273
  To enable qBittorrent integration, follow the setup guide [here](https://github.com/lgallard/qBittorrent-Controller/wiki/How-to-enable-the-qBittorrent-Web-UI).
256
274
 
257
- <br>
258
275
 
259
276
  ## REQUESTS Settings
260
277
 
@@ -268,7 +285,6 @@ Description: <p align="center">
268
285
  - `timeout`: Maximum timeout (in seconds) for each request
269
286
  - `max_retry`: Number of retry attempts per segment during M3U8 index download
270
287
 
271
- <br>
272
288
 
273
289
  ## M3U8_DOWNLOAD Settings
274
290
 
@@ -288,8 +304,10 @@ Description: <p align="center">
288
304
  - `default_audio_workser`: Number of threads for audio download
289
305
  - `cleanup_tmp_folder`: Remove temporary .ts files after download
290
306
 
307
+ > [!IMPORTANT]
308
+ > Set `tqdm_use_large_bar` to `false` when using Termux or terminals with limited width to prevent network monitoring issues
309
+
291
310
 
292
- <br>
293
311
 
294
312
  ### Language Settings
295
313
 
@@ -338,7 +356,6 @@ Description: <p align="center">
338
356
  - `force_resolution`: Force specific resolution (-1 for best available, or specify 1080, 720, 360)
339
357
  - `get_only_link`: Return M3U8 playlist/index URL instead of downloading
340
358
 
341
- <br>
342
359
 
343
360
  # COMMAND
344
361
 
@@ -354,7 +371,6 @@ Description: <p align="center">
354
371
  - Enter a season number followed by `-*` to download from that season to the end.
355
372
  * **Example:** `3-*` will download from *Season 3* to the final season.
356
373
 
357
- <br>
358
374
 
359
375
  # Docker
360
376
 
@@ -393,15 +409,16 @@ Description: <p align="center">
393
409
 
394
410
  | Website | Status |
395
411
  |:-------------------|:------:|
396
- | 1337xx | ✅ |
397
- | Altadefinizione | ✅ |
398
- | AnimeUnity | ✅ |
399
- | Ilcorsaronero | ✅ |
400
- | CB01New | ✅ |
401
- | DDLStreamItaly | ✅ |
402
- | GuardaSerie | ✅ |
403
- | MostraGuarda | ✅ |
404
- | StreamingCommunity | ✅ |
412
+ | [1337xx](https://1337xx.to/) | ✅ |
413
+ | [Altadefinizione](https://altadefinizione.prof/) | ✅ |
414
+ | [AnimeUnity](https://animeunity.so/) | ✅ |
415
+ | [Ilcorsaronero](https://ilcorsaronero.link/) | ✅ |
416
+ | [CB01New](https://cb01new.pics/) | ✅ |
417
+ | [DDLStreamItaly](https://ddlstreamitaly.co/) | ✅ |
418
+ | [GuardaSerie](https://guardaserie.academy/) | ✅ |
419
+ | [MostraGuarda](https://mostraguarda.stream/) | ✅ |
420
+ | [StreamingCommunity](https://streamingcommunity.prof/) | ✅ |
421
+
405
422
 
406
423
  # Tutorials
407
424
 
@@ -6,9 +6,6 @@
6
6
  <a href="https://pypi.org/project/streamingcommunity">
7
7
  <img src="https://img.shields.io/pypi/v/streamingcommunity?logo=pypi&labelColor=555555&style=for-the-badge" alt="PyPI"/>
8
8
  </a>
9
- <a href="https://www.python.org">
10
- <img src="https://img.shields.io/badge/Python->=3.8-3776AB?style=for-the-badge&logo=python&logoColor=white" alt="Python"/>
11
- </a>
12
9
  <a href="https://www.paypal.com/donate/?hosted_button_id=UXTWMT8P6HE2C">
13
10
  <img src="https://img.shields.io/badge/_-Donate-red.svg?logo=githubsponsors&labelColor=555555&style=for-the-badge" alt="Donate"/>
14
11
  </a>
@@ -62,6 +59,22 @@
62
59
 
63
60
  # Installation
64
61
 
62
+ <p align="center">
63
+ <a href="https://github.com/Lovi-0/StreamingCommunity/releases/latest/download/StreamingCommunity.exe">
64
+ <img src="https://img.shields.io/badge/-Windows_x64-blue.svg?style=for-the-badge&logo=windows" alt="Windows">
65
+ </a>
66
+ <a href="https://pypi.org/project/StreamingCommunity">
67
+ <img src="https://img.shields.io/badge/-PyPI-blue.svg?logo=pypi&labelColor=555555&style=for-the-badge" alt="PyPI">
68
+ </a>
69
+ <a href="https://github.com/Lovi-0/StreamingCommunity/releases/latest/download/StreamingCommunity.zip">
70
+ <img src="https://img.shields.io/badge/-Source_tar-green.svg?style=for-the-badge" alt="Source Tarball">
71
+ </a>
72
+ <a href="https://github.com/Lovi-0/StreamingCommunity/releases">
73
+ <img src="https://img.shields.io/badge/-All_Versions-lightgrey.svg?style=for-the-badge" alt="All Versions">
74
+ </a>
75
+ </p>
76
+
77
+
65
78
  ## 1. PyPI Installation
66
79
 
67
80
  Install directly from PyPI:
@@ -201,12 +214,14 @@ The configuration file is divided into several main sections:
201
214
  "movie_folder_name": "Movie",
202
215
  "serie_folder_name": "TV",
203
216
  "map_episode_name": "%(tv_name)_S%(season)E%(episode)_%(episode_name)",
217
+ "add_siteName": false,
218
+ "disable_searchDomain": false,
204
219
  "not_close": false
205
220
  }
206
221
  ```
207
222
 
208
223
  - `root_path`: Directory where all videos will be saved
209
-
224
+
210
225
  ### Path examples:
211
226
  * Windows: `C:\\MyLibrary\\Folder` or `\\\\MyServer\\MyLibrary` (if you want to use a network folder)
212
227
  * Linux/MacOS: `Desktop/MyLibrary/Folder`
@@ -228,7 +243,10 @@ The configuration file is divided into several main sections:
228
243
  * `%(episode_name)` : Is the name of the episode
229
244
  `<br/><br/>`
230
245
 
231
- - `not_close`: If true, continues running after downloading
246
+ - `add_siteName`: If set to true, appends the site_name to the root path before the movie and serie folders.
247
+ - `disable_searchDomain`: If set to true, disables the search for a new domain for all sites.
248
+ - `not_close`: If set to true, keeps the program running after the download is complete.
249
+
232
250
 
233
251
  ### qBittorrent Configuration
234
252
 
@@ -245,7 +263,6 @@ The configuration file is divided into several main sections:
245
263
 
246
264
  To enable qBittorrent integration, follow the setup guide [here](https://github.com/lgallard/qBittorrent-Controller/wiki/How-to-enable-the-qBittorrent-Web-UI).
247
265
 
248
- <br>
249
266
 
250
267
  ## REQUESTS Settings
251
268
 
@@ -259,7 +276,6 @@ The configuration file is divided into several main sections:
259
276
  - `timeout`: Maximum timeout (in seconds) for each request
260
277
  - `max_retry`: Number of retry attempts per segment during M3U8 index download
261
278
 
262
- <br>
263
279
 
264
280
  ## M3U8_DOWNLOAD Settings
265
281
 
@@ -279,8 +295,10 @@ The configuration file is divided into several main sections:
279
295
  - `default_audio_workser`: Number of threads for audio download
280
296
  - `cleanup_tmp_folder`: Remove temporary .ts files after download
281
297
 
298
+ > [!IMPORTANT]
299
+ > Set `tqdm_use_large_bar` to `false` when using Termux or terminals with limited width to prevent network monitoring issues
300
+
282
301
 
283
- <br>
284
302
 
285
303
  ### Language Settings
286
304
 
@@ -329,7 +347,6 @@ forced-ita hin - Hindi pol - Polish tur - Turkish
329
347
  - `force_resolution`: Force specific resolution (-1 for best available, or specify 1080, 720, 360)
330
348
  - `get_only_link`: Return M3U8 playlist/index URL instead of downloading
331
349
 
332
- <br>
333
350
 
334
351
  # COMMAND
335
352
 
@@ -345,7 +362,6 @@ forced-ita hin - Hindi pol - Polish tur - Turkish
345
362
  - Enter a season number followed by `-*` to download from that season to the end.
346
363
  * **Example:** `3-*` will download from *Season 3* to the final season.
347
364
 
348
- <br>
349
365
 
350
366
  # Docker
351
367
 
@@ -384,15 +400,16 @@ The `run-container` command mounts also the `config.json` file, so any change to
384
400
 
385
401
  | Website | Status |
386
402
  |:-------------------|:------:|
387
- | 1337xx | ✅ |
388
- | Altadefinizione | ✅ |
389
- | AnimeUnity | ✅ |
390
- | Ilcorsaronero | ✅ |
391
- | CB01New | ✅ |
392
- | DDLStreamItaly | ✅ |
393
- | GuardaSerie | ✅ |
394
- | MostraGuarda | ✅ |
395
- | StreamingCommunity | ✅ |
403
+ | [1337xx](https://1337xx.to/) | ✅ |
404
+ | [Altadefinizione](https://altadefinizione.prof/) | ✅ |
405
+ | [AnimeUnity](https://animeunity.so/) | ✅ |
406
+ | [Ilcorsaronero](https://ilcorsaronero.link/) | ✅ |
407
+ | [CB01New](https://cb01new.pics/) | ✅ |
408
+ | [DDLStreamItaly](https://ddlstreamitaly.co/) | ✅ |
409
+ | [GuardaSerie](https://guardaserie.academy/) | ✅ |
410
+ | [MostraGuarda](https://mostraguarda.stream/) | ✅ |
411
+ | [StreamingCommunity](https://streamingcommunity.prof/) | ✅ |
412
+
396
413
 
397
414
  # Tutorials
398
415
 
@@ -5,18 +5,14 @@ from typing import Dict, Any, List, Union
5
5
 
6
6
  class Episode:
7
7
  def __init__(self, data: Dict[str, Any]):
8
- self.images = None
9
8
  self.data = data
10
9
 
11
- self.id: int = data.get('id')
12
- self.scws_id: int = data.get('scws_id')
13
- self.number: int = data.get('number')
14
- self.name: str = data.get('name')
15
- self.plot: str = data.get('plot')
16
- self.duration: int = data.get('duration')
17
-
18
- def collect_image(self, SITE_NAME, domain):
19
- self.image = f"https://cdn.{SITE_NAME}.{domain}/images/{self.data.get('images')[0]['filename']}"
10
+ self.id: int = data.get('id', 0)
11
+ self.scws_id: int = data.get('scws_id', 0)
12
+ self.number: int = data.get('number', 1)
13
+ self.name: str = data.get('name', '')
14
+ self.plot: str = data.get('plot', '')
15
+ self.duration: int = data.get('duration', 0)
20
16
 
21
17
  def __str__(self):
22
18
  return f"Episode(id={self.id}, number={self.number}, name='{self.name}', plot='{self.plot}', duration={self.duration} sec)"
@@ -71,24 +67,19 @@ class EpisodeManager:
71
67
 
72
68
  class Season:
73
69
  def __init__(self, season_data: Dict[str, Union[int, str, None]]):
74
- self.images = {}
75
70
  self.season_data = season_data
76
71
 
77
- self.id: int = season_data.get('id')
78
- self.scws_id: int = season_data.get('scws_id')
79
- self.imdb_id: int = season_data.get('imdb_id')
80
- self.number: int = season_data.get('number')
81
- self.name: str = season_data.get('name')
82
- self.slug: str = season_data.get('slug')
83
- self.plot: str = season_data.get('plot')
84
- self.type: str = season_data.get('type')
85
- self.seasons_count: int = season_data.get('seasons_count')
72
+ self.id: int = season_data.get('id', 0)
73
+ self.scws_id: int = season_data.get('scws_id', 0)
74
+ self.imdb_id: int = season_data.get('imdb_id', 0)
75
+ self.number: int = season_data.get('number', 0)
76
+ self.name: str = season_data.get('name', '')
77
+ self.slug: str = season_data.get('slug', '')
78
+ self.plot: str = season_data.get('plot', '')
79
+ self.type: str = season_data.get('type', '')
80
+ self.seasons_count: int = season_data.get('seasons_count', 0)
86
81
  self.episodes: EpisodeManager = EpisodeManager()
87
82
 
88
- def collect_images(self, SITE_NAME, domain):
89
- for dict_image in self.season_data.get('images'):
90
- self.images[dict_image.get('type')] = f"https://cdn.{SITE_NAME}.{domain}/images/{dict_image.get('filename')}"
91
-
92
83
 
93
84
  class Stream:
94
85
  def __init__(self, name: str, url: str, active: bool):
@@ -19,9 +19,11 @@ from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
19
19
 
20
20
 
21
21
  # Variable
22
- from .costant import SITE_NAME
22
+ from .costant import SITE_NAME, DOMAIN_NOW
23
23
  media_search_manager = MediaManager()
24
24
  table_show_manager = TVShowManager()
25
+ max_timeout = config_manager.get_int("REQUESTS", "timeout")
26
+ disable_searchDomain = config_manager.get_bool("DEFAULT", "disable_searchDomain")
25
27
 
26
28
 
27
29
  def title_search(word_to_search: str) -> int:
@@ -38,8 +40,10 @@ def title_search(word_to_search: str) -> int:
38
40
  table_show_manager.clear()
39
41
 
40
42
  # Find new domain if prev dont work
41
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
42
- domain_to_use, _ = search_domain(SITE_NAME, f"https://{SITE_NAME}")
43
+ domain_to_use = DOMAIN_NOW
44
+
45
+ if not disable_searchDomain:
46
+ domain_to_use, base_url = search_domain(SITE_NAME, f"https://{SITE_NAME}")
43
47
 
44
48
  # Construct the full site URL and load the search page
45
49
  try:
@@ -57,7 +61,6 @@ def title_search(word_to_search: str) -> int:
57
61
  # Create soup and find table
58
62
  soup = BeautifulSoup(response.text, "html.parser")
59
63
 
60
- # Scrape div film in table on single page
61
64
  for tr in soup.find_all('tr'):
62
65
  try:
63
66
 
@@ -72,8 +75,8 @@ def title_search(word_to_search: str) -> int:
72
75
 
73
76
  media_search_manager.add_media(title_info)
74
77
 
75
- except:
76
- continue
78
+ except Exception as e:
79
+ print(f"Error parsing a film entry: {e}")
77
80
 
78
81
  # Return the number of titles found
79
82
  return media_search_manager.get_length()
@@ -21,7 +21,7 @@ from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
21
21
 
22
22
 
23
23
  # Config
24
- from .costant import ROOT_PATH, DOMAIN_NOW, SITE_NAME, MOVIE_FOLDER
24
+ from .costant import DOMAIN_NOW, SITE_NAME, MOVIE_FOLDER
25
25
 
26
26
 
27
27
  def download_title(select_title: MediaItem):
@@ -39,7 +39,7 @@ def download_title(select_title: MediaItem):
39
39
  # Define output path
40
40
  title_name = os_manager.get_sanitize_file(select_title.name)
41
41
  mp4_path = os_manager.get_sanitize_path(
42
- os.path.join(ROOT_PATH, MOVIE_FOLDER, title_name.replace(".mp4", ""))
42
+ os.path.join(MOVIE_FOLDER, title_name.replace(".mp4", ""))
43
43
  )
44
44
 
45
45
  # Create output folder
@@ -0,0 +1,19 @@
1
+ # 26.05.24
2
+
3
+ import os
4
+
5
+
6
+ # Internal utilities
7
+ from StreamingCommunity.Util._jsonConfig import config_manager
8
+
9
+
10
+ SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
11
+ ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
12
+ DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
13
+
14
+ SERIES_FOLDER = os.path.join(ROOT_PATH, config_manager.get('DEFAULT', 'serie_folder_name'))
15
+ MOVIE_FOLDER = os.path.join(ROOT_PATH, config_manager.get('DEFAULT', 'movie_folder_name'))
16
+
17
+ if config_manager.get_bool("DEFAULT", "add_siteName"):
18
+ SERIES_FOLDER = os.path.join(ROOT_PATH, SITE_NAME, config_manager.get('DEFAULT', 'serie_folder_name'))
19
+ MOVIE_FOLDER = os.path.join(ROOT_PATH, SITE_NAME, config_manager.get('DEFAULT', 'movie_folder_name'))
@@ -22,7 +22,7 @@ from StreamingCommunity.Api.Player.supervideo import VideoSource
22
22
 
23
23
 
24
24
  # Config
25
- from .costant import ROOT_PATH, MOVIE_FOLDER
25
+ from .costant import MOVIE_FOLDER
26
26
 
27
27
 
28
28
  def download_film(select_title: MediaItem) -> str:
@@ -47,7 +47,7 @@ def download_film(select_title: MediaItem) -> str:
47
47
  # Define output path
48
48
  title_name = os_manager.get_sanitize_file(select_title.name) + ".mp4"
49
49
  mp4_path = os_manager.get_sanitize_path(
50
- os.path.join(ROOT_PATH, MOVIE_FOLDER, title_name.replace(".mp4", ""))
50
+ os.path.join(MOVIE_FOLDER, title_name.replace(".mp4", ""))
51
51
  )
52
52
 
53
53
  # Get m3u8 master playlist
@@ -19,9 +19,11 @@ from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
19
19
 
20
20
 
21
21
  # Variable
22
- from .costant import SITE_NAME
22
+ from .costant import SITE_NAME, DOMAIN_NOW
23
23
  media_search_manager = MediaManager()
24
24
  table_show_manager = TVShowManager()
25
+ max_timeout = config_manager.get_int("REQUESTS", "timeout")
26
+ disable_searchDomain = config_manager.get_bool("DEFAULT", "disable_searchDomain")
25
27
 
26
28
 
27
29
  def title_search(title_search: str) -> int:
@@ -38,20 +40,18 @@ def title_search(title_search: str) -> int:
38
40
  table_show_manager.clear()
39
41
 
40
42
  # Find new domain if prev dont work
41
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
42
- domain_to_use, _ = search_domain(SITE_NAME, f"https://{SITE_NAME}")
43
+ domain_to_use = DOMAIN_NOW
43
44
 
45
+ if not disable_searchDomain:
46
+ domain_to_use, base_url = search_domain(SITE_NAME, f"https://{SITE_NAME}")
47
+
44
48
  # Send request to search for title
45
49
  client = httpx.Client()
46
50
 
47
51
  try:
48
52
  response = client.get(
49
53
  url=f"https://{SITE_NAME}.{domain_to_use}/?story={title_search.replace(' ', '+')}&do=search&subaction=search&titleonly=3",
50
- headers={
51
- 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
52
- 'accept-language': 'it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7',
53
- 'User-Agent': get_headers()
54
- },
54
+ headers={'User-Agent': get_headers()},
55
55
  timeout=max_timeout
56
56
  )
57
57
  response.raise_for_status()
@@ -62,21 +62,27 @@ def title_search(title_search: str) -> int:
62
62
 
63
63
  # Create soup and find table
64
64
  soup = BeautifulSoup(response.text, "html.parser")
65
- table_content = soup.find('div', id="dle-content")
66
65
 
67
- # Scrape div film in table on single page
68
- for film_div in table_content.find_all('div', class_='col-lg-3'):
69
- title = film_div.find('h2', class_='titleFilm').get_text(strip=True)
70
- link = film_div.find('h2', class_='titleFilm').find('a')['href']
71
- imdb_rating = film_div.find('div', class_='imdb-rate').get_text(strip=True).split(":")[-1]
72
-
73
- film_info = {
74
- 'name': title,
75
- 'url': link,
76
- 'score': imdb_rating
77
- }
78
-
79
- media_search_manager.add_media(film_info)
66
+ for row in soup.find_all('div', class_='col-lg-3 col-md-3 col-xs-4'):
67
+ try:
68
+
69
+ title_element = row.find('h2', class_='titleFilm').find('a')
70
+ title = title_element.get_text(strip=True)
71
+ link = title_element['href']
72
+
73
+ imdb_element = row.find('div', class_='imdb-rate')
74
+ imdb_rating = imdb_element.get_text(strip=True).split(":")[-1]
75
+
76
+ film_info = {
77
+ 'name': title,
78
+ 'url': link,
79
+ 'score': imdb_rating
80
+ }
81
+
82
+ media_search_manager.add_media(film_info)
83
+
84
+ except AttributeError as e:
85
+ print(f"Error parsing a film entry: {e}")
80
86
 
81
87
  # Return the number of titles found
82
88
  return media_search_manager.get_length()
@@ -0,0 +1,19 @@
1
+ # 26.05.24
2
+
3
+ import os
4
+
5
+
6
+ # Internal utilities
7
+ from StreamingCommunity.Util._jsonConfig import config_manager
8
+
9
+
10
+ SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
11
+ ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
12
+ DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
13
+
14
+ SERIES_FOLDER = os.path.join(ROOT_PATH, config_manager.get('DEFAULT', 'serie_folder_name'))
15
+ MOVIE_FOLDER = os.path.join(ROOT_PATH, config_manager.get('DEFAULT', 'movie_folder_name'))
16
+
17
+ if config_manager.get_bool("DEFAULT", "add_siteName"):
18
+ SERIES_FOLDER = os.path.join(ROOT_PATH, SITE_NAME, config_manager.get('DEFAULT', 'serie_folder_name'))
19
+ MOVIE_FOLDER = os.path.join(ROOT_PATH, SITE_NAME, config_manager.get('DEFAULT', 'movie_folder_name'))
@@ -23,7 +23,7 @@ from StreamingCommunity.Api.Player.vixcloud import VideoSourceAnime
23
23
 
24
24
 
25
25
  # Variable
26
- from .costant import ROOT_PATH, SITE_NAME, SERIES_FOLDER, MOVIE_FOLDER
26
+ from .costant import SITE_NAME, SERIES_FOLDER, MOVIE_FOLDER
27
27
 
28
28
 
29
29
 
@@ -54,11 +54,11 @@ def download_episode(index_select: int, scrape_serie: ScrapeSerieAnime, video_so
54
54
 
55
55
  if scrape_serie.is_series:
56
56
  mp4_path = os_manager.get_sanitize_path(
57
- os.path.join(ROOT_PATH, SERIES_FOLDER, scrape_serie.series_name)
57
+ os.path.join(SERIES_FOLDER, scrape_serie.series_name)
58
58
  )
59
59
  else:
60
60
  mp4_path = os_manager.get_sanitize_path(
61
- os.path.join(ROOT_PATH, MOVIE_FOLDER, scrape_serie.series_name)
61
+ os.path.join(MOVIE_FOLDER, scrape_serie.series_name)
62
62
  )
63
63
 
64
64
  # Create output folder
@@ -21,10 +21,11 @@ from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
21
21
 
22
22
 
23
23
  # Variable
24
- from .costant import SITE_NAME
24
+ from .costant import SITE_NAME, DOMAIN_NOW
25
25
  media_search_manager = MediaManager()
26
26
  table_show_manager = TVShowManager()
27
-
27
+ max_timeout = config_manager.get_int("REQUESTS", "timeout")
28
+ disable_searchDomain = config_manager.get_bool("DEFAULT", "disable_searchDomain")
28
29
 
29
30
 
30
31
  def get_token(site_name: str, domain: str) -> dict:
@@ -40,7 +41,10 @@ def get_token(site_name: str, domain: str) -> dict:
40
41
  """
41
42
 
42
43
  # Send a GET request to the specified URL composed of the site name and domain
43
- response = httpx.get(f"https://www.{site_name}.{domain}")
44
+ response = httpx.get(
45
+ url=f"https://www.{site_name}.{domain}",
46
+ timeout=max_timeout
47
+ )
44
48
  response.raise_for_status()
45
49
 
46
50
  # Initialize variables to store CSRF token
@@ -103,8 +107,10 @@ def title_search(title: str) -> int:
103
107
  table_show_manager.clear()
104
108
 
105
109
  # Get token and session value from configuration
106
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
107
- domain_to_use, _ = search_domain(SITE_NAME, f"https://www.{SITE_NAME}")
110
+ domain_to_use = DOMAIN_NOW
111
+
112
+ if not disable_searchDomain:
113
+ domain_to_use, base_url = search_domain(SITE_NAME, f"https://www.{SITE_NAME}")
108
114
 
109
115
  data = get_token(SITE_NAME, domain_to_use)
110
116
 
@@ -140,21 +146,23 @@ def title_search(title: str) -> int:
140
146
  except Exception as e:
141
147
  console.print(f"Site: {SITE_NAME}, request search error: {e}")
142
148
 
143
- # Process each record returned in the response
144
149
  for dict_title in response.json()['records']:
145
-
146
- # Rename keys for consistency
147
- dict_title['name'] = get_real_title(dict_title)
148
-
149
- # Add the record to media search manager if the name is not None
150
- media_search_manager.add_media({
151
- 'id': dict_title.get('id'),
152
- 'slug': dict_title.get('slug'),
153
- 'name': dict_title.get('name'),
154
- 'type': dict_title.get('type'),
155
- 'score': dict_title.get('score'),
156
- 'episodes_count': dict_title.get('episodes_count')
157
- })
150
+ try:
151
+
152
+ # Rename keys for consistency
153
+ dict_title['name'] = get_real_title(dict_title)
154
+
155
+ media_search_manager.add_media({
156
+ 'id': dict_title.get('id'),
157
+ 'slug': dict_title.get('slug'),
158
+ 'name': dict_title.get('name'),
159
+ 'type': dict_title.get('type'),
160
+ 'score': dict_title.get('score'),
161
+ 'episodes_count': dict_title.get('episodes_count')
162
+ })
163
+
164
+ except Exception as e:
165
+ print(f"Error parsing a film entry: {e}")
158
166
 
159
167
  # Return the length of media search manager
160
168
  return media_search_manager.get_length()
@@ -0,0 +1,19 @@
1
+ # 03.07.24
2
+
3
+ import os
4
+
5
+
6
+ # Internal utilities
7
+ from StreamingCommunity.Util._jsonConfig import config_manager
8
+
9
+
10
+ SITE_NAME = os.path.basename(os.path.dirname(os.path.abspath(__file__)))
11
+ ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
12
+ DOMAIN_NOW = config_manager.get_dict('SITE', SITE_NAME)['domain']
13
+
14
+ SERIES_FOLDER = os.path.join(ROOT_PATH, config_manager.get('DEFAULT', 'serie_folder_name'))
15
+ MOVIE_FOLDER = os.path.join(ROOT_PATH, config_manager.get('DEFAULT', 'movie_folder_name'))
16
+
17
+ if config_manager.get_bool("DEFAULT", "add_siteName"):
18
+ SERIES_FOLDER = os.path.join(ROOT_PATH, SITE_NAME, config_manager.get('DEFAULT', 'serie_folder_name'))
19
+ MOVIE_FOLDER = os.path.join(ROOT_PATH, SITE_NAME, config_manager.get('DEFAULT', 'movie_folder_name'))