StreamingCommunity 1.9.1__py3-none-any.whl → 1.9.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of StreamingCommunity might be problematic. Click here for more details.

Files changed (96) hide show
  1. StreamingCommunity/run.py +2 -3
  2. {StreamingCommunity-1.9.1.dist-info → StreamingCommunity-1.9.2.dist-info}/METADATA +32 -4
  3. StreamingCommunity-1.9.2.dist-info/RECORD +7 -0
  4. {StreamingCommunity-1.9.1.dist-info → StreamingCommunity-1.9.2.dist-info}/WHEEL +1 -1
  5. {StreamingCommunity-1.9.1.dist-info → StreamingCommunity-1.9.2.dist-info}/entry_points.txt +1 -0
  6. StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py +0 -143
  7. StreamingCommunity/Api/Player/Helper/Vixcloud/util.py +0 -166
  8. StreamingCommunity/Api/Player/ddl.py +0 -89
  9. StreamingCommunity/Api/Player/maxstream.py +0 -151
  10. StreamingCommunity/Api/Player/supervideo.py +0 -194
  11. StreamingCommunity/Api/Player/vixcloud.py +0 -224
  12. StreamingCommunity/Api/Site/1337xx/__init__.py +0 -50
  13. StreamingCommunity/Api/Site/1337xx/costant.py +0 -15
  14. StreamingCommunity/Api/Site/1337xx/site.py +0 -84
  15. StreamingCommunity/Api/Site/1337xx/title.py +0 -66
  16. StreamingCommunity/Api/Site/altadefinizione/__init__.py +0 -50
  17. StreamingCommunity/Api/Site/altadefinizione/costant.py +0 -15
  18. StreamingCommunity/Api/Site/altadefinizione/film.py +0 -69
  19. StreamingCommunity/Api/Site/altadefinizione/site.py +0 -86
  20. StreamingCommunity/Api/Site/animeunity/__init__.py +0 -50
  21. StreamingCommunity/Api/Site/animeunity/costant.py +0 -15
  22. StreamingCommunity/Api/Site/animeunity/film_serie.py +0 -130
  23. StreamingCommunity/Api/Site/animeunity/site.py +0 -165
  24. StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +0 -97
  25. StreamingCommunity/Api/Site/bitsearch/__init__.py +0 -51
  26. StreamingCommunity/Api/Site/bitsearch/costant.py +0 -15
  27. StreamingCommunity/Api/Site/bitsearch/site.py +0 -84
  28. StreamingCommunity/Api/Site/bitsearch/title.py +0 -47
  29. StreamingCommunity/Api/Site/cb01new/__init__.py +0 -51
  30. StreamingCommunity/Api/Site/cb01new/costant.py +0 -15
  31. StreamingCommunity/Api/Site/cb01new/film.py +0 -69
  32. StreamingCommunity/Api/Site/cb01new/site.py +0 -74
  33. StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +0 -57
  34. StreamingCommunity/Api/Site/ddlstreamitaly/costant.py +0 -16
  35. StreamingCommunity/Api/Site/ddlstreamitaly/series.py +0 -141
  36. StreamingCommunity/Api/Site/ddlstreamitaly/site.py +0 -93
  37. StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py +0 -85
  38. StreamingCommunity/Api/Site/guardaserie/__init__.py +0 -52
  39. StreamingCommunity/Api/Site/guardaserie/costant.py +0 -15
  40. StreamingCommunity/Api/Site/guardaserie/series.py +0 -195
  41. StreamingCommunity/Api/Site/guardaserie/site.py +0 -84
  42. StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +0 -110
  43. StreamingCommunity/Api/Site/mostraguarda/__init__.py +0 -48
  44. StreamingCommunity/Api/Site/mostraguarda/costant.py +0 -15
  45. StreamingCommunity/Api/Site/mostraguarda/film.py +0 -94
  46. StreamingCommunity/Api/Site/piratebays/__init__.py +0 -50
  47. StreamingCommunity/Api/Site/piratebays/costant.py +0 -15
  48. StreamingCommunity/Api/Site/piratebays/site.py +0 -89
  49. StreamingCommunity/Api/Site/piratebays/title.py +0 -45
  50. StreamingCommunity/Api/Site/streamingcommunity/__init__.py +0 -55
  51. StreamingCommunity/Api/Site/streamingcommunity/costant.py +0 -15
  52. StreamingCommunity/Api/Site/streamingcommunity/film.py +0 -70
  53. StreamingCommunity/Api/Site/streamingcommunity/series.py +0 -205
  54. StreamingCommunity/Api/Site/streamingcommunity/site.py +0 -126
  55. StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +0 -113
  56. StreamingCommunity/Api/Template/Class/SearchType.py +0 -101
  57. StreamingCommunity/Api/Template/Util/__init__.py +0 -5
  58. StreamingCommunity/Api/Template/Util/get_domain.py +0 -137
  59. StreamingCommunity/Api/Template/Util/manage_ep.py +0 -153
  60. StreamingCommunity/Api/Template/Util/recall_search.py +0 -37
  61. StreamingCommunity/Api/Template/__init__.py +0 -3
  62. StreamingCommunity/Api/Template/site.py +0 -87
  63. StreamingCommunity/Lib/Downloader/HLS/downloader.py +0 -968
  64. StreamingCommunity/Lib/Downloader/HLS/proxyes.py +0 -110
  65. StreamingCommunity/Lib/Downloader/HLS/segments.py +0 -538
  66. StreamingCommunity/Lib/Downloader/MP4/downloader.py +0 -156
  67. StreamingCommunity/Lib/Downloader/TOR/downloader.py +0 -222
  68. StreamingCommunity/Lib/Downloader/__init__.py +0 -5
  69. StreamingCommunity/Lib/Driver/driver_1.py +0 -76
  70. StreamingCommunity/Lib/FFmpeg/__init__.py +0 -4
  71. StreamingCommunity/Lib/FFmpeg/capture.py +0 -170
  72. StreamingCommunity/Lib/FFmpeg/command.py +0 -292
  73. StreamingCommunity/Lib/FFmpeg/util.py +0 -242
  74. StreamingCommunity/Lib/M3U8/__init__.py +0 -6
  75. StreamingCommunity/Lib/M3U8/decryptor.py +0 -164
  76. StreamingCommunity/Lib/M3U8/estimator.py +0 -176
  77. StreamingCommunity/Lib/M3U8/parser.py +0 -666
  78. StreamingCommunity/Lib/M3U8/url_fixer.py +0 -52
  79. StreamingCommunity/Lib/TMBD/__init__.py +0 -2
  80. StreamingCommunity/Lib/TMBD/obj_tmbd.py +0 -39
  81. StreamingCommunity/Lib/TMBD/tmdb.py +0 -346
  82. StreamingCommunity/Upload/update.py +0 -68
  83. StreamingCommunity/Upload/version.py +0 -5
  84. StreamingCommunity/Util/_jsonConfig.py +0 -204
  85. StreamingCommunity/Util/call_stack.py +0 -42
  86. StreamingCommunity/Util/color.py +0 -20
  87. StreamingCommunity/Util/console.py +0 -12
  88. StreamingCommunity/Util/ffmpeg_installer.py +0 -275
  89. StreamingCommunity/Util/headers.py +0 -147
  90. StreamingCommunity/Util/logger.py +0 -53
  91. StreamingCommunity/Util/message.py +0 -46
  92. StreamingCommunity/Util/os.py +0 -514
  93. StreamingCommunity/Util/table.py +0 -163
  94. StreamingCommunity-1.9.1.dist-info/RECORD +0 -95
  95. {StreamingCommunity-1.9.1.dist-info → StreamingCommunity-1.9.2.dist-info}/LICENSE +0 -0
  96. {StreamingCommunity-1.9.1.dist-info → StreamingCommunity-1.9.2.dist-info}/top_level.txt +0 -0
@@ -1,50 +0,0 @@
1
- # 02.07.24
2
-
3
- from unidecode import unidecode
4
-
5
-
6
- # Internal utilities
7
- from StreamingCommunity.Util.console import console, msg
8
-
9
-
10
- # Logic class
11
- from .site import title_search, run_get_select_title, media_search_manager
12
- from .title import download_title
13
-
14
-
15
- # Variable
16
- indice = 8
17
- _useFor = "film_serie"
18
- _deprecate = False
19
- _priority = 2
20
- _engineDownload = "tor"
21
-
22
-
23
- def search(string_to_search: str = None, get_onylDatabase: bool = False):
24
- """
25
- Main function of the application for film and series.
26
- """
27
-
28
- if string_to_search is None:
29
- string_to_search = msg.ask("\n[purple]Insert word to search in all site").strip()
30
-
31
- # Search on database
32
- len_database = title_search(unidecode(string_to_search))
33
-
34
- # Return list of elements
35
- if get_onylDatabase:
36
- return media_search_manager
37
-
38
- if len_database > 0:
39
-
40
- # Select title from list
41
- select_title = run_get_select_title()
42
-
43
- # Download title
44
- download_title(select_title)
45
-
46
- else:
47
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
48
-
49
- # Retry
50
- search()
@@ -1,15 +0,0 @@
1
- # 09.06.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 = config_manager.get('DEFAULT', 'serie_folder_name')
15
- MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
@@ -1,89 +0,0 @@
1
- # 02.07.24
2
-
3
- # External libraries
4
- import httpx
5
- from bs4 import BeautifulSoup
6
-
7
-
8
- # Internal utilities
9
- from StreamingCommunity.Util.console import console
10
- from StreamingCommunity.Util._jsonConfig import config_manager
11
- from StreamingCommunity.Util.headers import get_headers
12
- from StreamingCommunity.Util.table import TVShowManager
13
-
14
-
15
- # Logic class
16
- from StreamingCommunity.Api.Template import get_select_title
17
- from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
18
-
19
-
20
- # Variable
21
- from .costant import SITE_NAME, DOMAIN_NOW
22
- media_search_manager = MediaManager()
23
- table_show_manager = TVShowManager()
24
-
25
-
26
- def title_search(word_to_search: str) -> int:
27
- """
28
- Search for titles based on a search query.
29
-
30
- Parameters:
31
- - title_search (str): The title to search for.
32
-
33
- Returns:
34
- - int: The number of titles found.
35
- """
36
-
37
- # Find new domain if prev dont work
38
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
39
-
40
- # Construct the full site URL and load the search page
41
- try:
42
- response = httpx.get(
43
- url=f"https://1.{SITE_NAME}.{DOMAIN_NOW}/s/?q={word_to_search}&video=on",
44
- headers={
45
- 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
46
- 'accept-language': 'it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7',
47
- 'referer': 'https://wwv.thepiratebay3.co/',
48
- 'user-agent': get_headers()
49
- },
50
- follow_redirects=True,
51
- timeout=max_timeout
52
- )
53
- response.raise_for_status()
54
-
55
- except Exception as e:
56
- console.print(f"Site: {SITE_NAME}, request search error: {e}")
57
-
58
- # Create soup and find table
59
- soup = BeautifulSoup(response.text, "html.parser")
60
- table = soup.find("tbody")
61
-
62
- # Scrape div film in table on single page
63
- for tr in table.find_all('tr'):
64
- try:
65
-
66
- title_info = {
67
- 'name': tr.find_all("a")[1].get_text(strip=True),
68
- 'url': tr.find_all("td")[3].find("a").get("href"),
69
- 'upload': tr.find_all("td")[2].get_text(strip=True),
70
- 'size': tr.find_all("td")[4].get_text(strip=True),
71
- 'seader': tr.find_all("td")[5].get_text(strip=True),
72
- 'leacher': tr.find_all("td")[6].get_text(strip=True),
73
- 'by': tr.find_all("td")[7].get_text(strip=True),
74
- }
75
-
76
- media_search_manager.add_media(title_info)
77
-
78
- except:
79
- continue
80
-
81
- # Return the number of titles found
82
- return media_search_manager.get_length()
83
-
84
-
85
- def run_get_select_title():
86
- """
87
- Display a selection of titles and prompt the user to choose one.
88
- """
89
- return get_select_title(table_show_manager, media_search_manager)
@@ -1,45 +0,0 @@
1
- # 02.07.24
2
-
3
- import os
4
- import sys
5
-
6
-
7
- # Internal utilities
8
- from StreamingCommunity.Util.console import console
9
- from StreamingCommunity.Util.message import start_message
10
- from StreamingCommunity.Util.os import os_manager
11
- from StreamingCommunity.Lib.Downloader import TOR_downloader
12
-
13
-
14
- # Logic class
15
- from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
16
-
17
-
18
- # Config
19
- from .costant import ROOT_PATH, DOMAIN_NOW, SITE_NAME, MOVIE_FOLDER
20
-
21
-
22
- def download_title(select_title: MediaItem):
23
- """
24
- Downloads a media item and saves it as an MP4 file.
25
-
26
- Parameters:
27
- - select_title (MediaItem): The media item to be downloaded. This should be an instance of the MediaItem class, containing attributes like `name` and `url`.
28
- """
29
-
30
- start_message()
31
- console.print(f"[yellow]Download: [red]{select_title.name} \n")
32
- print()
33
-
34
- # Define output path
35
- title_name = os_manager.get_sanitize_file(select_title.name.replace("-", "_") + ".mp4")
36
- mp4_path = os.path.join(ROOT_PATH, SITE_NAME, MOVIE_FOLDER, title_name.replace(".mp4", ""))
37
-
38
- # Create output folder
39
- os_manager.create_path(mp4_path)
40
-
41
- # Tor manager
42
- manager = TOR_downloader()
43
- manager.add_magnet_link(select_title.url)
44
- manager.start_download()
45
- manager.move_downloaded_files(mp4_path)
@@ -1,55 +0,0 @@
1
- # 21.05.24
2
-
3
- from unidecode import unidecode
4
-
5
-
6
- # Internal utilities
7
- from StreamingCommunity.Util.console import console, msg
8
-
9
-
10
- # Logic class
11
- from .site import get_version_and_domain, title_search, run_get_select_title, media_search_manager
12
- from .film import download_film
13
- from .series import download_series
14
-
15
-
16
- # Variable
17
- indice = 0
18
- _useFor = "film_serie"
19
- _deprecate = False
20
- _priority = 1
21
- _engineDownload = "hls"
22
-
23
-
24
- def search(string_to_search: str = None, get_onylDatabase: bool = False):
25
- """
26
- Main function of the application for film and series.
27
- """
28
-
29
- if string_to_search is None:
30
- string_to_search = msg.ask("\n[purple]Insert word to search in all site").strip()
31
-
32
- # Get site domain and version and get result of the search
33
- site_version, domain = get_version_and_domain()
34
- len_database = title_search(unidecode(string_to_search), domain)
35
-
36
- # Return list of elements
37
- if get_onylDatabase:
38
- return media_search_manager
39
-
40
- if len_database > 0:
41
-
42
- # Select title from list
43
- select_title = run_get_select_title()
44
-
45
- if select_title.type == 'tv':
46
- download_series(select_title, site_version)
47
-
48
- else:
49
- download_film(select_title)
50
-
51
- else:
52
- console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
53
-
54
- # Retry
55
- search()
@@ -1,15 +0,0 @@
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('SITE', SITE_NAME)
13
-
14
- SERIES_FOLDER = config_manager.get('DEFAULT', 'serie_folder_name')
15
- MOVIE_FOLDER = config_manager.get('DEFAULT', 'movie_folder_name')
@@ -1,70 +0,0 @@
1
- # 3.12.23
2
-
3
- import os
4
- import time
5
-
6
-
7
- # Internal utilities
8
- from StreamingCommunity.Util.console import console, msg
9
- from StreamingCommunity.Util.os import os_manager
10
- from StreamingCommunity.Util.message import start_message
11
- from StreamingCommunity.Util.call_stack import get_call_stack
12
- from StreamingCommunity.Lib.Downloader import HLS_Downloader
13
-
14
-
15
- # Logic class
16
- from StreamingCommunity.Api.Template.Util import execute_search
17
- from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
18
-
19
-
20
- # Player
21
- from StreamingCommunity.Api.Player.vixcloud import VideoSource
22
-
23
-
24
- # Variable
25
- from .costant import ROOT_PATH, SITE_NAME, MOVIE_FOLDER
26
-
27
-
28
- def download_film(select_title: MediaItem):
29
- """
30
- Downloads a film using the provided film ID, title name, and domain.
31
-
32
- Parameters:
33
- - domain (str): The domain of the site
34
- - version (str): Version of site.
35
- """
36
-
37
- # Start message and display film information
38
- start_message()
39
- console.print(f"[yellow]Download: [red]{select_title.slug} \n")
40
-
41
- # Init class
42
- video_source = VideoSource(SITE_NAME, False)
43
- video_source.setup(select_title.id)
44
-
45
- # Retrieve scws and if available master playlist
46
- video_source.get_iframe(select_title.id)
47
- video_source.get_content()
48
- master_playlist = video_source.get_playlist()
49
-
50
- # Define the filename and path for the downloaded film
51
- title_name = os_manager.get_sanitize_file(select_title.slug) + ".mp4"
52
- mp4_path = os.path.join(ROOT_PATH, SITE_NAME, MOVIE_FOLDER, select_title.slug)
53
-
54
- # Download the film using the m3u8 playlist, and output filename
55
- r_proc = HLS_Downloader(
56
- m3u8_playlist=master_playlist,
57
- output_filename=os.path.join(mp4_path, title_name)
58
- ).start()
59
-
60
- if r_proc == 404:
61
- time.sleep(2)
62
-
63
- # Re call search function
64
- if msg.ask("[green]Do you want to continue [white]([red]y[white])[green] or return at home[white]([red]n[white]) ", choices=['y', 'n'], default='y', show_choices=True) == "n":
65
- frames = get_call_stack()
66
- execute_search(frames[-4])
67
-
68
- if r_proc != None:
69
- console.print("[green]Result: ")
70
- console.print(r_proc)
@@ -1,205 +0,0 @@
1
- # 3.12.23
2
-
3
- import os
4
- import sys
5
- import time
6
-
7
-
8
- # Internal utilities
9
- from StreamingCommunity.Util.console import console, msg
10
- from StreamingCommunity.Util.message import start_message
11
- from StreamingCommunity.Util.call_stack import get_call_stack
12
- from StreamingCommunity.Util.table import TVShowManager
13
- from StreamingCommunity.Lib.Downloader import HLS_Downloader
14
-
15
-
16
- # Logic class
17
- from .util.ScrapeSerie import ScrapeSerie
18
- from StreamingCommunity.Api.Template.Util import manage_selection, map_episode_title, validate_selection, validate_episode_selection, execute_search
19
- from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
20
-
21
-
22
- # Player
23
- from StreamingCommunity.Api.Player.vixcloud import VideoSource
24
-
25
-
26
- # Variable
27
- from .costant import ROOT_PATH, SITE_NAME, SERIES_FOLDER
28
- table_show_manager = TVShowManager()
29
-
30
-
31
-
32
- def download_video(tv_name: str, index_season_selected: int, index_episode_selected: int, scrape_serie: ScrapeSerie, video_source: VideoSource) -> None:
33
- """
34
- Download a single episode video.
35
-
36
- Parameters:
37
- - tv_name (str): Name of the TV series.
38
- - index_season_selected (int): Index of the selected season.
39
- - index_episode_selected (int): Index of the selected episode.
40
- """
41
-
42
- start_message()
43
-
44
- # Get info about episode
45
- obj_episode = scrape_serie.obj_episode_manager.episodes[index_episode_selected - 1]
46
- console.print(f"[yellow]Download: [red]{index_season_selected}:{index_episode_selected} {obj_episode.name}")
47
- print()
48
-
49
- # Define filename and path for the downloaded video
50
- mp4_name = f"{map_episode_title(tv_name, index_season_selected, index_episode_selected, obj_episode.name)}.mp4"
51
- mp4_path = os.path.join(ROOT_PATH, SITE_NAME, SERIES_FOLDER, tv_name, f"S{index_season_selected}")
52
-
53
- # Retrieve scws and if available master playlist
54
- video_source.get_iframe(obj_episode.id)
55
- video_source.get_content()
56
- master_playlist = video_source.get_playlist()
57
-
58
- # Download the episode
59
- r_proc = HLS_Downloader(
60
- m3u8_playlist=master_playlist,
61
- output_filename=os.path.join(mp4_path, mp4_name)
62
- ).start()
63
-
64
- if r_proc == 404:
65
- time.sleep(2)
66
-
67
- # Re call search function
68
- if msg.ask("[green]Do you want to continue [white]([red]y[white])[green] or return at home[white]([red]n[white]) ", choices=['y', 'n'], default='y', show_choices=True) == "n":
69
- frames = get_call_stack()
70
- execute_search(frames[-4])
71
-
72
- if r_proc != None:
73
- console.print("[green]Result: ")
74
- console.print(r_proc)
75
-
76
- def download_episode(tv_name: str, index_season_selected: int, scrape_serie: ScrapeSerie, video_source: VideoSource, download_all: bool = False) -> None:
77
- """
78
- Download episodes of a selected season.
79
-
80
- Parameters:
81
- - tv_name (str): Name of the TV series.
82
- - index_season_selected (int): Index of the selected season.
83
- - download_all (bool): Download all episodes in the season.
84
- """
85
-
86
- # Clean memory of all episodes and get the number of the season
87
- scrape_serie.obj_episode_manager.clear()
88
- season_number = scrape_serie.obj_season_manager.seasons[index_season_selected - 1].number
89
-
90
- # Start message and collect information about episodes
91
- start_message()
92
- scrape_serie.collect_title_season(season_number)
93
- episodes_count = scrape_serie.obj_episode_manager.get_length()
94
-
95
- if download_all:
96
-
97
- # Download all episodes without asking
98
- for i_episode in range(1, episodes_count + 1):
99
- download_video(tv_name, index_season_selected, i_episode, scrape_serie, video_source)
100
- console.print(f"\n[red]End downloaded [yellow]season: [red]{index_season_selected}.")
101
-
102
- else:
103
-
104
- # Display episodes list and manage user selection
105
- last_command = display_episodes_list(scrape_serie)
106
- list_episode_select = manage_selection(last_command, episodes_count)
107
-
108
- try:
109
- list_episode_select = validate_episode_selection(list_episode_select, episodes_count)
110
- except ValueError as e:
111
- console.print(f"[red]{str(e)}")
112
- return
113
-
114
- # Download selected episodes
115
- for i_episode in list_episode_select:
116
- download_video(tv_name, index_season_selected, i_episode, scrape_serie, video_source)
117
-
118
- def download_series(select_season: MediaItem, version: str) -> None:
119
- """
120
- Download episodes of a TV series based on user selection.
121
-
122
- Parameters:
123
- - select_season (MediaItem): Selected media item (TV series).
124
- - domain (str): Domain from which to download.
125
- - version (str): Version of the site.
126
- """
127
-
128
- # Start message and set up video source
129
- start_message()
130
-
131
- # Init class
132
- scrape_serie = ScrapeSerie(SITE_NAME)
133
- video_source = VideoSource(SITE_NAME, True)
134
-
135
- # Setup video source
136
- scrape_serie.setup(version, select_season.id, select_season.slug)
137
- video_source.setup(select_season.id)
138
-
139
- # Collect information about seasons
140
- scrape_serie.collect_info_seasons()
141
- seasons_count = scrape_serie.obj_season_manager.get_length()
142
-
143
- # Prompt user for season selection and download episodes
144
- console.print(f"\n[green]Seasons found: [red]{seasons_count}")
145
- index_season_selected = msg.ask(
146
- "\n[cyan]Insert season number [yellow](e.g., 1), [red]* [cyan]to download all seasons, "
147
- "[yellow](e.g., 1-2) [cyan]for a range of seasons, or [yellow](e.g., 3-*) [cyan]to download from a specific season to the end"
148
- )
149
-
150
- # Manage and validate the selection
151
- list_season_select = manage_selection(index_season_selected, seasons_count)
152
-
153
- try:
154
- list_season_select = validate_selection(list_season_select, seasons_count)
155
- except ValueError as e:
156
- console.print(f"[red]{str(e)}")
157
- return
158
-
159
- # Loop through the selected seasons and download episodes
160
- for i_season in list_season_select:
161
- if len(list_season_select) > 1 or index_season_selected == "*":
162
-
163
- # Download all episodes if multiple seasons are selected or if '*' is used
164
- download_episode(select_season.slug, i_season, scrape_serie, video_source, download_all=True)
165
- else:
166
-
167
- # Otherwise, let the user select specific episodes for the single season
168
- download_episode(select_season.slug, i_season, scrape_serie, video_source, download_all=False)
169
-
170
-
171
- def display_episodes_list(scrape_serie) -> str:
172
- """
173
- Display episodes list and handle user input.
174
-
175
- Returns:
176
- last_command (str): Last command entered by the user.
177
- """
178
-
179
- # Set up table for displaying episodes
180
- table_show_manager.set_slice_end(10)
181
-
182
- # Add columns to the table
183
- column_info = {
184
- "Index": {'color': 'red'},
185
- "Name": {'color': 'magenta'},
186
- "Duration": {'color': 'green'}
187
- }
188
- table_show_manager.add_column(column_info)
189
-
190
- # Populate the table with episodes information
191
- for i, media in enumerate(scrape_serie.obj_episode_manager.episodes):
192
- table_show_manager.add_tv_show({
193
- 'Index': str(media.number),
194
- 'Name': media.name,
195
- 'Duration': str(media.duration)
196
- })
197
-
198
- # Run the table and handle user input
199
- last_command = table_show_manager.run()
200
-
201
- if last_command == "q":
202
- console.print("\n[red]Quit [white]...")
203
- sys.exit(0)
204
-
205
- return last_command
@@ -1,126 +0,0 @@
1
- # 10.12.23
2
-
3
- import sys
4
- import json
5
- import logging
6
-
7
-
8
- # External libraries
9
- import httpx
10
- from bs4 import BeautifulSoup
11
-
12
-
13
- # Internal utilities
14
- from StreamingCommunity.Util.console import console
15
- from StreamingCommunity.Util._jsonConfig import config_manager
16
- from StreamingCommunity.Util.headers import get_headers
17
- from StreamingCommunity.Util.table import TVShowManager
18
-
19
-
20
-
21
- # Logic class
22
- from StreamingCommunity.Api.Template import get_select_title
23
- from StreamingCommunity.Api.Template.Util import search_domain
24
- from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
25
-
26
-
27
- # Config
28
- from .costant import SITE_NAME
29
-
30
-
31
- # Variable
32
- media_search_manager = MediaManager()
33
- table_show_manager = TVShowManager()
34
-
35
-
36
-
37
- def get_version(text: str):
38
- """
39
- Extracts the version from the HTML text of a webpage.
40
-
41
- Parameters:
42
- - text (str): The HTML text of the webpage.
43
-
44
- Returns:
45
- str: The version extracted from the webpage.
46
- list: Top 10 titles headlines for today.
47
- """
48
- try:
49
-
50
- # Parse request to site
51
- soup = BeautifulSoup(text, "html.parser")
52
-
53
- # Extract version
54
- version = json.loads(soup.find("div", {"id": "app"}).get("data-page"))['version']
55
- #console.print(f"[cyan]Get version [white]=> [red]{version} \n")
56
-
57
- return version
58
-
59
- except Exception as e:
60
- logging.error(f"Error extracting version: {e}")
61
- raise
62
-
63
-
64
- def get_version_and_domain():
65
- """
66
- Retrieve the current version and domain of the site.
67
-
68
- This function performs the following steps:
69
- - Determines the correct domain to use for the site by searching for a specific meta tag.
70
- - Fetches the content of the site to extract the version information.
71
- """
72
-
73
- # Find new domain if prev dont work
74
- domain_to_use, base_url = search_domain(SITE_NAME, f"https://{SITE_NAME}")
75
-
76
- # Extract version from the response
77
- version = get_version(httpx.get(base_url, headers={'user-agent': get_headers()}).text)
78
-
79
- return version, domain_to_use
80
-
81
-
82
- def title_search(title_search: str, domain: str) -> int:
83
- """
84
- Search for titles based on a search query.
85
-
86
- Parameters:
87
- - title_search (str): The title to search for.
88
- - domain (str): The domain to search on.
89
-
90
- Returns:
91
- int: The number of titles found.
92
- """
93
-
94
- max_timeout = config_manager.get_int("REQUESTS", "timeout")
95
-
96
- # Send request to search for titles ( replace à to a and space to "+" )
97
- try:
98
- response = httpx.get(
99
- url=f"https://{SITE_NAME}.{domain}/api/search?q={title_search.replace(' ', '+')}",
100
- headers={'user-agent': get_headers()},
101
- timeout=max_timeout
102
- )
103
- response.raise_for_status()
104
-
105
- except Exception as e:
106
- console.print(f"Site: {SITE_NAME}, request search error: {e}")
107
-
108
- # Add found titles to media search manager
109
- for dict_title in response.json()['data']:
110
- media_search_manager.add_media({
111
- 'id': dict_title.get('id'),
112
- 'slug': dict_title.get('slug'),
113
- 'name': dict_title.get('name'),
114
- 'type': dict_title.get('type'),
115
- 'score': dict_title.get('score')
116
- })
117
-
118
- # Return the number of titles found
119
- return media_search_manager.get_length()
120
-
121
-
122
- def run_get_select_title():
123
- """
124
- Display a selection of titles and prompt the user to choose one.
125
- """
126
- return get_select_title(table_show_manager, media_search_manager)