mirror of
https://github.com/Arrowar/StreamingCommunity.git
synced 2025-06-06 19:45:24 +00:00
Bump v2.9.3
This commit is contained in:
parent
c1d3e1f809
commit
6d13b1875a
@ -70,7 +70,7 @@ def download_episode(index_select: int, scrape_serie: ScrapeSerieAnime, video_so
|
|||||||
video_source.get_embed(obj_episode.id)
|
video_source.get_embed(obj_episode.id)
|
||||||
|
|
||||||
# Create output path
|
# Create output path
|
||||||
title_name = f"{scrape_serie.series_name}_EP_{dynamic_format_number(int(obj_episode.number))}.mp4"
|
title_name = f"{scrape_serie.series_name}_EP_{dynamic_format_number(str(obj_episode.number))}.mp4"
|
||||||
|
|
||||||
if scrape_serie.is_series:
|
if scrape_serie.is_series:
|
||||||
mp4_path = os_manager.get_sanitize_path(os.path.join(site_constant.ANIME_FOLDER, scrape_serie.series_name))
|
mp4_path = os_manager.get_sanitize_path(os.path.join(site_constant.ANIME_FOLDER, scrape_serie.series_name))
|
||||||
|
@ -12,6 +12,7 @@ from rich.console import Console
|
|||||||
|
|
||||||
# Internal utilities
|
# Internal utilities
|
||||||
from StreamingCommunity.Util.config_json import config_manager
|
from StreamingCommunity.Util.config_json import config_manager
|
||||||
|
from StreamingCommunity.Util.headers import get_userAgent
|
||||||
from StreamingCommunity.Util.table import TVShowManager
|
from StreamingCommunity.Util.table import TVShowManager
|
||||||
from StreamingCommunity.TelegramHelp.telegram_bot import get_bot_instance
|
from StreamingCommunity.TelegramHelp.telegram_bot import get_bot_instance
|
||||||
|
|
||||||
@ -29,7 +30,7 @@ table_show_manager = TVShowManager()
|
|||||||
max_timeout = config_manager.get_int("REQUESTS", "timeout")
|
max_timeout = config_manager.get_int("REQUESTS", "timeout")
|
||||||
|
|
||||||
|
|
||||||
def get_token(site_name: str, domain: str) -> dict:
|
def get_token() -> dict:
|
||||||
"""
|
"""
|
||||||
Function to retrieve session tokens from a specified website.
|
Function to retrieve session tokens from a specified website.
|
||||||
|
|
||||||
@ -40,8 +41,6 @@ def get_token(site_name: str, domain: str) -> dict:
|
|||||||
Returns:
|
Returns:
|
||||||
- dict: A dictionary containing session tokens. The keys are 'XSRF_TOKEN', 'animeunity_session', and 'csrf_token'.
|
- dict: A dictionary containing session tokens. The keys are 'XSRF_TOKEN', 'animeunity_session', and 'csrf_token'.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Send a GET request to the specified URL composed of the site name and domain
|
|
||||||
response = httpx.get(
|
response = httpx.get(
|
||||||
url=site_constant.FULL_URL,
|
url=site_constant.FULL_URL,
|
||||||
timeout=max_timeout
|
timeout=max_timeout
|
||||||
@ -50,17 +49,11 @@ def get_token(site_name: str, domain: str) -> dict:
|
|||||||
|
|
||||||
# Initialize variables to store CSRF token
|
# Initialize variables to store CSRF token
|
||||||
find_csrf_token = None
|
find_csrf_token = None
|
||||||
|
|
||||||
# Parse the HTML response using BeautifulSoup
|
|
||||||
soup = BeautifulSoup(response.text, "html.parser")
|
soup = BeautifulSoup(response.text, "html.parser")
|
||||||
|
|
||||||
# Loop through all meta tags in the HTML response
|
|
||||||
for html_meta in soup.find_all("meta"):
|
for html_meta in soup.find_all("meta"):
|
||||||
|
|
||||||
# Check if the meta tag has a 'name' attribute equal to "csrf-token"
|
|
||||||
if html_meta.get('name') == "csrf-token":
|
if html_meta.get('name') == "csrf-token":
|
||||||
|
|
||||||
# If found, retrieve the content of the meta tag, which is the CSRF token
|
|
||||||
find_csrf_token = html_meta.get('content')
|
find_csrf_token = html_meta.get('content')
|
||||||
|
|
||||||
logging.info(f"Extract: ('animeunity_session': {response.cookies['animeunity_session']}, 'csrf_token': {find_csrf_token})")
|
logging.info(f"Extract: ('animeunity_session': {response.cookies['animeunity_session']}, 'csrf_token': {find_csrf_token})")
|
||||||
@ -83,13 +76,12 @@ def get_real_title(record):
|
|||||||
Returns:
|
Returns:
|
||||||
- str: The title found in the record. If no title is found, returns None.
|
- str: The title found in the record. If no title is found, returns None.
|
||||||
"""
|
"""
|
||||||
|
if record['title_eng'] is not None:
|
||||||
if record['title'] is not None:
|
|
||||||
return record['title']
|
|
||||||
|
|
||||||
elif record['title_eng'] is not None:
|
|
||||||
return record['title_eng']
|
return record['title_eng']
|
||||||
|
|
||||||
|
elif record['title'] is not None:
|
||||||
|
return record['title']
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return record['title_it']
|
return record['title_it']
|
||||||
|
|
||||||
@ -117,26 +109,15 @@ def title_search(title: str) -> int:
|
|||||||
console.print("[bold red]Error: Unable to determine valid domain or base URL.[/bold red]")
|
console.print("[bold red]Error: Unable to determine valid domain or base URL.[/bold red]")
|
||||||
console.print("[yellow]The service might be temporarily unavailable or the domain may have changed.[/yellow]")
|
console.print("[yellow]The service might be temporarily unavailable or the domain may have changed.[/yellow]")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
data = get_token(site_constant.SITE_NAME, domain_to_use)
|
|
||||||
|
|
||||||
# Prepare cookies to be used in the request
|
# Create parameter for request
|
||||||
cookies = {
|
data = get_token()
|
||||||
'animeunity_session': data.get('animeunity_session')
|
cookies = {'animeunity_session': data.get('animeunity_session')}
|
||||||
}
|
|
||||||
|
|
||||||
# Prepare headers for the request
|
|
||||||
headers = {
|
headers = {
|
||||||
'accept': 'application/json, text/plain, */*',
|
'user-agent': get_userAgent(),
|
||||||
'accept-language': 'it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7',
|
|
||||||
'content-type': 'application/json;charset=UTF-8',
|
|
||||||
'x-csrf-token': data.get('csrf_token')
|
'x-csrf-token': data.get('csrf_token')
|
||||||
}
|
}
|
||||||
|
json_data = {'title': title}
|
||||||
# Prepare JSON data to be sent in the request
|
|
||||||
json_data = {
|
|
||||||
'title': title
|
|
||||||
}
|
|
||||||
|
|
||||||
# Send a POST request to the API endpoint for live search
|
# Send a POST request to the API endpoint for live search
|
||||||
try:
|
try:
|
||||||
@ -167,8 +148,9 @@ def title_search(title: str) -> int:
|
|||||||
'slug': dict_title.get('slug'),
|
'slug': dict_title.get('slug'),
|
||||||
'name': dict_title.get('name'),
|
'name': dict_title.get('name'),
|
||||||
'type': dict_title.get('type'),
|
'type': dict_title.get('type'),
|
||||||
'score': dict_title.get('score'),
|
'status': dict_title.get('status'),
|
||||||
'episodes_count': dict_title.get('episodes_count')
|
'episodes_count': dict_title.get('episodes_count'),
|
||||||
|
'plot': ' '.join((words := str(dict_title.get('plot', '')).split())[:10]) + ('...' if len(words) > 10 else '')
|
||||||
})
|
})
|
||||||
|
|
||||||
if site_constant.TELEGRAM_BOT:
|
if site_constant.TELEGRAM_BOT:
|
||||||
|
@ -51,7 +51,7 @@ def download_video(index_season_selected: int, index_episode_selected: int, scap
|
|||||||
- bool: kill handler status
|
- bool: kill handler status
|
||||||
"""
|
"""
|
||||||
start_message()
|
start_message()
|
||||||
index_season_selected = dynamic_format_number(index_season_selected)
|
index_season_selected = dynamic_format_number(str(index_season_selected))
|
||||||
|
|
||||||
# Get info about episode
|
# Get info about episode
|
||||||
obj_episode = scape_info_serie.list_episodes[index_episode_selected - 1]
|
obj_episode = scape_info_serie.list_episodes[index_episode_selected - 1]
|
||||||
|
@ -50,7 +50,7 @@ def download_video(index_season_selected: int, index_episode_selected: int, scra
|
|||||||
- bool: kill handler status
|
- bool: kill handler status
|
||||||
"""
|
"""
|
||||||
start_message()
|
start_message()
|
||||||
index_season_selected = dynamic_format_number(index_season_selected)
|
index_season_selected = dynamic_format_number(str(index_season_selected))
|
||||||
|
|
||||||
# Get info about episode
|
# Get info about episode
|
||||||
obj_episode = scrape_serie.episode_manager.get(index_episode_selected - 1)
|
obj_episode = scrape_serie.episode_manager.get(index_episode_selected - 1)
|
||||||
|
@ -22,24 +22,50 @@ console = Console()
|
|||||||
MAP_EPISODE = config_manager.get('OUT_FOLDER', 'map_episode_name')
|
MAP_EPISODE = config_manager.get('OUT_FOLDER', 'map_episode_name')
|
||||||
|
|
||||||
|
|
||||||
def dynamic_format_number(n: int) -> str:
|
def dynamic_format_number(number_str: str) -> str:
|
||||||
"""
|
"""
|
||||||
Formats a number by adding a leading zero if it is less than 9.
|
Formats an episode number string, intelligently handling both integer and decimal episode numbers.
|
||||||
The width of the resulting string is dynamic, calculated as the number of digits in the number plus one
|
|
||||||
for numbers less than 9, otherwise the width remains the same.
|
This function is designed to handle various episode number formats commonly found in media series:
|
||||||
|
1. For integer episode numbers less than 10 (e.g., 1, 2, ..., 9), it adds a leading zero (e.g., 01, 02, ..., 09)
|
||||||
|
2. For integer episode numbers 10 and above, it preserves the original format without adding leading zeros
|
||||||
|
3. For decimal episode numbers (e.g., "7.5", "10.5"), it preserves the decimal format exactly as provided
|
||||||
|
|
||||||
|
The function is particularly useful for media file naming conventions where special episodes
|
||||||
|
or OVAs may have decimal notations (like episode 7.5) which should be preserved in their original format.
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
- n (int): The number to format.
|
- number_str (str): The episode number as a string, which may contain integers or decimals.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
- str: The formatted number as a string with a leading zero if the number is less than 9.
|
- str: The formatted episode number string, with appropriate handling based on the input type.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
>>> dynamic_format_number("7")
|
||||||
|
"07"
|
||||||
|
>>> dynamic_format_number("15")
|
||||||
|
"15"
|
||||||
|
>>> dynamic_format_number("7.5")
|
||||||
|
"7.5"
|
||||||
|
>>> dynamic_format_number("10.5")
|
||||||
|
"10.5"
|
||||||
"""
|
"""
|
||||||
if n < 10:
|
try:
|
||||||
width = len(str(n)) + 1
|
if '.' in number_str:
|
||||||
else:
|
return number_str
|
||||||
width = len(str(n))
|
|
||||||
|
n = int(number_str)
|
||||||
|
|
||||||
return str(n).zfill(width)
|
if n < 10:
|
||||||
|
width = len(str(n)) + 1
|
||||||
|
else:
|
||||||
|
width = len(str(n))
|
||||||
|
|
||||||
|
return str(n).zfill(width)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logging.warning(f"Could not format episode number '{number_str}': {str(e)}. Using original format.")
|
||||||
|
return number_str
|
||||||
|
|
||||||
|
|
||||||
def manage_selection(cmd_insert: str, max_count: int) -> List[int]:
|
def manage_selection(cmd_insert: str, max_count: int) -> List[int]:
|
||||||
@ -103,14 +129,14 @@ def map_episode_title(tv_name: str, number_season: int, episode_number: int, epi
|
|||||||
map_episode_temp = map_episode_temp.replace("%(tv_name)", os_manager.get_sanitize_file(tv_name))
|
map_episode_temp = map_episode_temp.replace("%(tv_name)", os_manager.get_sanitize_file(tv_name))
|
||||||
|
|
||||||
if number_season != None:
|
if number_season != None:
|
||||||
map_episode_temp = map_episode_temp.replace("%(season)", number_season)
|
map_episode_temp = map_episode_temp.replace("%(season)", str(number_season))
|
||||||
else:
|
else:
|
||||||
map_episode_temp = map_episode_temp.replace("%(season)", dynamic_format_number(0))
|
map_episode_temp = map_episode_temp.replace("%(season)", dynamic_format_number(str(0)))
|
||||||
|
|
||||||
if episode_number != None:
|
if episode_number != None:
|
||||||
map_episode_temp = map_episode_temp.replace("%(episode)", dynamic_format_number(episode_number))
|
map_episode_temp = map_episode_temp.replace("%(episode)", dynamic_format_number(str(episode_number)))
|
||||||
else:
|
else:
|
||||||
map_episode_temp = map_episode_temp.replace("%(episode)", dynamic_format_number(0))
|
map_episode_temp = map_episode_temp.replace("%(episode)", dynamic_format_number(str(0)))
|
||||||
|
|
||||||
if episode_name != None:
|
if episode_name != None:
|
||||||
map_episode_temp = map_episode_temp.replace("%(episode_name)", os_manager.get_sanitize_file(episode_name))
|
map_episode_temp = map_episode_temp.replace("%(episode_name)", os_manager.get_sanitize_file(episode_name))
|
||||||
@ -227,7 +253,7 @@ def display_episodes_list(episodes_manager) -> str:
|
|||||||
last_command = table_show_manager.run()
|
last_command = table_show_manager.run()
|
||||||
|
|
||||||
if last_command in ("q", "quit"):
|
if last_command in ("q", "quit"):
|
||||||
console.print("\n[red]Quit [white]...")
|
console.print("\n[red]Quit ...")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
return last_command
|
return last_command
|
@ -72,7 +72,7 @@ def get_select_title(table_show_manager, media_search_manager):
|
|||||||
|
|
||||||
# Handle user's quit command
|
# Handle user's quit command
|
||||||
if last_command == "q" or last_command == "quit":
|
if last_command == "q" or last_command == "quit":
|
||||||
console.print("\n[red]Quit [white]...")
|
console.print("\n[red]Quit ...")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
# Check if the selected index is within range
|
# Check if the selected index is within range
|
||||||
|
@ -73,7 +73,7 @@ def get_select_title(table_show_manager, generic_obj):
|
|||||||
|
|
||||||
# Handle user's quit command
|
# Handle user's quit command
|
||||||
if last_command == "q" or last_command == "quit":
|
if last_command == "q" or last_command == "quit":
|
||||||
console.print("\n[red]Quit [white]...")
|
console.print("\n[red]Quit ...")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
# Check if the selected index is within range
|
# Check if the selected index is within range
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
__title__ = 'StreamingCommunity'
|
__title__ = 'StreamingCommunity'
|
||||||
__version__ = '2.9.2'
|
__version__ = '2.9.3'
|
||||||
__author__ = 'Arrowar'
|
__author__ = 'Arrowar'
|
||||||
__description__ = 'A command-line program to download film'
|
__description__ = 'A command-line program to download film'
|
||||||
__copyright__ = 'Copyright 2024'
|
__copyright__ = 'Copyright 2024'
|
||||||
|
2
setup.py
2
setup.py
@ -10,7 +10,7 @@ with open("requirements.txt", "r", encoding="utf-8-sig") as f:
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="StreamingCommunity",
|
name="StreamingCommunity",
|
||||||
version="2.9.2",
|
version="2.9.3",
|
||||||
long_description=read_readme(),
|
long_description=read_readme(),
|
||||||
long_description_content_type="text/markdown",
|
long_description_content_type="text/markdown",
|
||||||
author="Lovi-0",
|
author="Lovi-0",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user