mirror of
https://github.com/Arrowar/StreamingCommunity.git
synced 2025-06-06 19:45:24 +00:00
core: Remove function "check_internet"
This commit is contained in:
parent
45f39b36c3
commit
4a841692e7
@ -6,7 +6,7 @@ from typing import Tuple
|
|||||||
|
|
||||||
# External library
|
# External library
|
||||||
from rich.console import Console
|
from rich.console import Console
|
||||||
from rich.prompt import Prompt, Confirm
|
from rich.prompt import Prompt
|
||||||
|
|
||||||
|
|
||||||
# Internal utilities
|
# Internal utilities
|
||||||
@ -15,7 +15,7 @@ from StreamingCommunity.Lib.Downloader import HLS_Downloader
|
|||||||
from StreamingCommunity.TelegramHelp.telegram_bot import TelegramSession, get_bot_instance
|
from StreamingCommunity.TelegramHelp.telegram_bot import TelegramSession, get_bot_instance
|
||||||
|
|
||||||
# Logic class
|
# Logic class
|
||||||
from .util.ScrapeSerie import ScrapeSerie
|
from .util.ScrapeSerie import GetSerieInfo
|
||||||
from StreamingCommunity.Api.Template.Util import (
|
from StreamingCommunity.Api.Template.Util import (
|
||||||
manage_selection,
|
manage_selection,
|
||||||
map_episode_title,
|
map_episode_title,
|
||||||
@ -37,7 +37,7 @@ msg = Prompt()
|
|||||||
console = Console()
|
console = Console()
|
||||||
|
|
||||||
|
|
||||||
def download_video(index_season_selected: int, index_episode_selected: int, scrape_serie: ScrapeSerie, video_source: VideoSource) -> Tuple[str,bool]:
|
def download_video(index_season_selected: int, index_episode_selected: int, scrape_serie: GetSerieInfo, video_source: VideoSource) -> Tuple[str,bool]:
|
||||||
"""
|
"""
|
||||||
Download a single episode video.
|
Download a single episode video.
|
||||||
|
|
||||||
@ -94,7 +94,7 @@ def download_video(index_season_selected: int, index_episode_selected: int, scra
|
|||||||
|
|
||||||
return r_proc['path'], r_proc['stopped']
|
return r_proc['path'], r_proc['stopped']
|
||||||
|
|
||||||
def download_episode(index_season_selected: int, scrape_serie: ScrapeSerie, video_source: VideoSource, download_all: bool = False) -> None:
|
def download_episode(index_season_selected: int, scrape_serie: GetSerieInfo, video_source: VideoSource, download_all: bool = False) -> None:
|
||||||
"""
|
"""
|
||||||
Download episodes of a selected season.
|
Download episodes of a selected season.
|
||||||
|
|
||||||
@ -156,7 +156,7 @@ def download_series(select_season: MediaItem) -> None:
|
|||||||
start_message()
|
start_message()
|
||||||
|
|
||||||
# Init class
|
# Init class
|
||||||
scrape_serie = ScrapeSerie(site_constant.FULL_URL)
|
scrape_serie = GetSerieInfo(site_constant.FULL_URL)
|
||||||
video_source = VideoSource(site_constant.FULL_URL, True)
|
video_source = VideoSource(site_constant.FULL_URL, True)
|
||||||
|
|
||||||
# Setup video source
|
# Setup video source
|
||||||
|
@ -19,7 +19,7 @@ from StreamingCommunity.Api.Player.Helper.Vixcloud.util import Season, EpisodeMa
|
|||||||
max_timeout = config_manager.get_int("REQUESTS", "timeout")
|
max_timeout = config_manager.get_int("REQUESTS", "timeout")
|
||||||
|
|
||||||
|
|
||||||
class ScrapeSerie:
|
class GetSerieInfo:
|
||||||
def __init__(self, url):
|
def __init__(self, url):
|
||||||
"""
|
"""
|
||||||
Initialize the ScrapeSerie class for scraping TV series information.
|
Initialize the ScrapeSerie class for scraping TV series information.
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
# 18.06.24
|
# 18.06.24
|
||||||
|
|
||||||
import ssl
|
import certifi
|
||||||
import time
|
|
||||||
from urllib.parse import urlparse, unquote
|
from urllib.parse import urlparse, unquote
|
||||||
|
|
||||||
|
|
||||||
@ -18,6 +17,7 @@ from StreamingCommunity.Util.config_json import config_manager
|
|||||||
# Variable
|
# Variable
|
||||||
console = Console()
|
console = Console()
|
||||||
VERIFY = config_manager.get("REQUESTS", "verify")
|
VERIFY = config_manager.get("REQUESTS", "verify")
|
||||||
|
MAX_TIMEOUT = config_manager.get_int("REQUESTS", "timeout")
|
||||||
|
|
||||||
|
|
||||||
def get_tld(url_str):
|
def get_tld(url_str):
|
||||||
@ -54,16 +54,7 @@ def get_base_domain(url_str):
|
|||||||
except Exception:
|
except Exception:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def get_base_url(url_str):
|
def validate_url(url, base_url):
|
||||||
"""Extract base URL including protocol and domain, removing path and query parameters."""
|
|
||||||
try:
|
|
||||||
parsed = urlparse(url_str)
|
|
||||||
return f"{parsed.scheme}://{parsed.netloc}"
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def validate_url(url, base_url, max_timeout, max_retries=2, sleep=1):
|
|
||||||
"""Validate if URL is accessible and matches expected base domain."""
|
"""Validate if URL is accessible and matches expected base domain."""
|
||||||
console.print(f"\n[cyan]Starting validation for URL[white]: [yellow]{url}")
|
console.print(f"\n[cyan]Starting validation for URL[white]: [yellow]{url}")
|
||||||
|
|
||||||
@ -75,54 +66,29 @@ def validate_url(url, base_url, max_timeout, max_retries=2, sleep=1):
|
|||||||
console.print(f"[red]Domain structure mismatch: {url_domain} != {base_domain}")
|
console.print(f"[red]Domain structure mismatch: {url_domain} != {base_domain}")
|
||||||
return False, None
|
return False, None
|
||||||
|
|
||||||
# Count dots to ensure we don't have extra subdomains
|
|
||||||
base_dots = base_url.count('.')
|
|
||||||
url_dots = url.count('.')
|
|
||||||
if url_dots > base_dots + 1:
|
|
||||||
console.print(f"[red]Too many subdomains in URL")
|
|
||||||
return False, None
|
|
||||||
|
|
||||||
client = httpx.Client(
|
client = httpx.Client(
|
||||||
verify=VERIFY,
|
verify=VERIFY,
|
||||||
headers=get_headers(),
|
headers=get_headers(),
|
||||||
timeout=max_timeout
|
timeout=MAX_TIMEOUT
|
||||||
)
|
)
|
||||||
|
|
||||||
for retry in range(max_retries):
|
# Make request to web site
|
||||||
try:
|
|
||||||
time.sleep(sleep)
|
|
||||||
|
|
||||||
# Initial check without redirects
|
|
||||||
response = client.get(url, follow_redirects=False)
|
response = client.get(url, follow_redirects=False)
|
||||||
if response.status_code == 403:
|
|
||||||
console.print(f"[red]Check failed (403) - Attempt {retry + 1}/{max_retries}")
|
|
||||||
continue
|
|
||||||
|
|
||||||
if response.status_code >= 400:
|
if response.status_code >= 400:
|
||||||
console.print(f"[red]Check failed: HTTP {response.status_code}")
|
console.print(f"[red]Check failed: HTTP {response.status_code}")
|
||||||
|
console.print(f"[red]Response content: {response.text}")
|
||||||
return False, None
|
return False, None
|
||||||
|
|
||||||
return True, None
|
return True, base_domain
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
console.print(f"[red]Connection error: {str(e)}")
|
|
||||||
time.sleep(sleep)
|
|
||||||
continue
|
|
||||||
|
|
||||||
return False, None
|
|
||||||
|
|
||||||
def search_domain(site_name: str, base_url: str, get_first: bool = False):
|
def search_domain(site_name: str, base_url: str, get_first: bool = False):
|
||||||
"""Search for valid domain matching site name and base URL."""
|
"""Search for valid domain matching site name and base URL."""
|
||||||
max_timeout = config_manager.get_int("REQUESTS", "timeout")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
is_correct, redirect_tld = validate_url(base_url, base_url, max_timeout)
|
is_correct, redirect_tld = validate_url(base_url, base_url)
|
||||||
|
|
||||||
if is_correct:
|
if is_correct:
|
||||||
tld = redirect_tld or get_tld(base_url)
|
tld = redirect_tld or get_tld(base_url)
|
||||||
config_manager.configSite[site_name]['domain'] = tld
|
|
||||||
|
|
||||||
#console.print(f"[green]Successfully validated initial URL")
|
|
||||||
return tld, base_url
|
return tld, base_url
|
||||||
|
|
||||||
else:
|
else:
|
||||||
@ -130,3 +96,4 @@ def search_domain(site_name: str, base_url: str, get_first: bool = False):
|
|||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
console.print(f"[red]Error testing initial URL: {str(e)}")
|
console.print(f"[red]Error testing initial URL: {str(e)}")
|
||||||
|
return None, None
|
@ -153,7 +153,7 @@ class TheMovieDB:
|
|||||||
|
|
||||||
# Join with colored arrows and print with proper category label
|
# Join with colored arrows and print with proper category label
|
||||||
console.print(
|
console.print(
|
||||||
f"[bold purple]{category}:[/] {' [red][/] '.join(colored_items)}"
|
f"[bold purple]{category}:[/] {' [red]->[/] '.join(colored_items)}"
|
||||||
)
|
)
|
||||||
|
|
||||||
def display_trending_tv_shows(self):
|
def display_trending_tv_shows(self):
|
||||||
|
@ -14,6 +14,8 @@ from rich.console import Console
|
|||||||
|
|
||||||
# Variable
|
# Variable
|
||||||
console = Console()
|
console = Console()
|
||||||
|
download_site_data = True
|
||||||
|
validate_github_config = True
|
||||||
|
|
||||||
|
|
||||||
class ConfigManager:
|
class ConfigManager:
|
||||||
@ -35,16 +37,40 @@ class ConfigManager:
|
|||||||
self.cache = {}
|
self.cache = {}
|
||||||
self.reference_config_url = 'https://raw.githubusercontent.com/Arrowar/StreamingCommunity/refs/heads/main/config.json'
|
self.reference_config_url = 'https://raw.githubusercontent.com/Arrowar/StreamingCommunity/refs/heads/main/config.json'
|
||||||
|
|
||||||
# Validate and update config before proceeding
|
# Read initial config to get use_api setting
|
||||||
self._validate_and_update_config()
|
|
||||||
self._read_initial_config()
|
self._read_initial_config()
|
||||||
|
|
||||||
|
# Validate and update config before proceeding (if enabled)
|
||||||
|
if validate_github_config:
|
||||||
|
self._validate_and_update_config()
|
||||||
|
|
||||||
console.print(f"[bold cyan]ConfigManager initialized:[/bold cyan] [green]{self.file_path}[/green]")
|
console.print(f"[bold cyan]ConfigManager initialized:[/bold cyan] [green]{self.file_path}[/green]")
|
||||||
|
|
||||||
|
def _read_initial_config(self) -> None:
|
||||||
|
"""Read initial configuration to get use_api setting."""
|
||||||
|
try:
|
||||||
|
if os.path.exists(self.file_path):
|
||||||
|
with open(self.file_path, 'r') as f:
|
||||||
|
self.config = json.load(f)
|
||||||
|
|
||||||
|
self.use_api = self.config.get('DEFAULT', {}).get('use_api', True)
|
||||||
|
console.print(f"[bold cyan]API usage setting:[/bold cyan] [{'green' if self.use_api else 'yellow'}]{self.use_api}[/{'green' if self.use_api else 'yellow'}]")
|
||||||
|
console.print(f"[bold cyan]Download site data:[/bold cyan] [{'green' if download_site_data else 'yellow'}]{download_site_data}[/{'green' if download_site_data else 'yellow'}]")
|
||||||
|
console.print(f"[bold cyan]Validate GitHub config:[/bold cyan] [{'green' if validate_github_config else 'yellow'}]{validate_github_config}[/{'green' if validate_github_config else 'yellow'}]")
|
||||||
|
|
||||||
|
else:
|
||||||
|
self.use_api = True
|
||||||
|
console.print("[bold yellow]Configuration file not found. Using default API setting: True[/bold yellow]")
|
||||||
|
console.print(f"[bold yellow]Download site data: {download_site_data}[/bold yellow]")
|
||||||
|
console.print(f"[bold yellow]Validate GitHub config: {validate_github_config}[/bold yellow]")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.use_api = True
|
||||||
|
console.print("[bold red]Error reading API setting. Using default: True[/bold red]")
|
||||||
|
|
||||||
def _validate_and_update_config(self) -> None:
|
def _validate_and_update_config(self) -> None:
|
||||||
"""Validate local config against reference config and update missing keys."""
|
"""Validate local config against reference config and update missing keys."""
|
||||||
try:
|
try:
|
||||||
|
|
||||||
# Load local config if exists
|
# Load local config if exists
|
||||||
local_config = {}
|
local_config = {}
|
||||||
if os.path.exists(self.file_path):
|
if os.path.exists(self.file_path):
|
||||||
@ -56,7 +82,7 @@ class ConfigManager:
|
|||||||
console.print(f"[bold cyan]Downloading reference config from:[/bold cyan] [green]{self.reference_config_url}[/green]")
|
console.print(f"[bold cyan]Downloading reference config from:[/bold cyan] [green]{self.reference_config_url}[/green]")
|
||||||
response = requests.get(self.reference_config_url, timeout=10)
|
response = requests.get(self.reference_config_url, timeout=10)
|
||||||
|
|
||||||
if response.ok:
|
if not response.ok:
|
||||||
raise Exception(f"Failed to download reference config. Status code: {response.status_code}")
|
raise Exception(f"Failed to download reference config. Status code: {response.status_code}")
|
||||||
|
|
||||||
reference_config = response.json()
|
reference_config = response.json()
|
||||||
@ -135,24 +161,6 @@ class ConfigManager:
|
|||||||
|
|
||||||
return merged
|
return merged
|
||||||
|
|
||||||
def _read_initial_config(self) -> None:
|
|
||||||
"""Read initial configuration to get use_api setting."""
|
|
||||||
try:
|
|
||||||
if os.path.exists(self.file_path):
|
|
||||||
with open(self.file_path, 'r') as f:
|
|
||||||
self.config = json.load(f)
|
|
||||||
|
|
||||||
self.use_api = self.config.get('DEFAULT', {}).get('use_api', True)
|
|
||||||
console.print(f"[bold cyan]API usage setting:[/bold cyan] [{'green' if self.use_api else 'yellow'}]{self.use_api}[/{'green' if self.use_api else 'yellow'}]")
|
|
||||||
|
|
||||||
else:
|
|
||||||
self.use_api = True
|
|
||||||
console.print("[bold yellow]Configuration file not found. Using default API setting: True[/bold yellow]")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
self.use_api = True
|
|
||||||
console.print("[bold red]Error reading API setting. Using default: True[/bold red]")
|
|
||||||
|
|
||||||
def read_config(self) -> None:
|
def read_config(self) -> None:
|
||||||
"""Read the configuration file."""
|
"""Read the configuration file."""
|
||||||
try:
|
try:
|
||||||
@ -174,8 +182,14 @@ class ConfigManager:
|
|||||||
self.config = json.load(f)
|
self.config = json.load(f)
|
||||||
console.print(f"[bold green]Configuration downloaded and saved:[/bold green] {len(self.config)} keys")
|
console.print(f"[bold green]Configuration downloaded and saved:[/bold green] {len(self.config)} keys")
|
||||||
|
|
||||||
# Update site configuration separately
|
# Read API setting again in case it was updated in the downloaded config
|
||||||
|
self.use_api = self.config.get('DEFAULT', {}).get('use_api', self.use_api)
|
||||||
|
|
||||||
|
# Update site configuration separately if enabled
|
||||||
|
if download_site_data:
|
||||||
self.update_site_config()
|
self.update_site_config()
|
||||||
|
else:
|
||||||
|
console.print("[bold yellow]Site data download is disabled[/bold yellow]")
|
||||||
|
|
||||||
console.print("[bold cyan]Configuration processing complete[/bold cyan]")
|
console.print("[bold cyan]Configuration processing complete[/bold cyan]")
|
||||||
|
|
||||||
|
@ -287,17 +287,6 @@ class InternManager():
|
|||||||
else:
|
else:
|
||||||
return f"{bytes / (1024 * 1024):.2f} MB/s"
|
return f"{bytes / (1024 * 1024):.2f} MB/s"
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def check_internet():
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
httpx.get("https://www.google.com", timeout=5)
|
|
||||||
break
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
console.log("[bold red]Internet is not available. Waiting...[/bold red]")
|
|
||||||
time.sleep(2)
|
|
||||||
|
|
||||||
|
|
||||||
class OsSummary:
|
class OsSummary:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -346,32 +335,6 @@ class OsSummary:
|
|||||||
except importlib.metadata.PackageNotFoundError:
|
except importlib.metadata.PackageNotFoundError:
|
||||||
return f"{lib_name}-not installed"
|
return f"{lib_name}-not installed"
|
||||||
|
|
||||||
def download_requirements(self, url: str, filename: str):
|
|
||||||
"""
|
|
||||||
Download the requirements.txt file from the specified URL if not found locally using requests.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
url (str): The URL to download the requirements file from.
|
|
||||||
filename (str): The local filename to save the requirements file as.
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
import requests
|
|
||||||
|
|
||||||
logging.info(f"{filename} not found locally. Downloading from {url}...")
|
|
||||||
response = requests.get(url)
|
|
||||||
|
|
||||||
if response.status_code == 200:
|
|
||||||
with open(filename, 'wb') as f:
|
|
||||||
f.write(response.content)
|
|
||||||
|
|
||||||
else:
|
|
||||||
logging.error(f"Failed to download {filename}. HTTP Status code: {response.status_code}")
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logging.error(f"Failed to download {filename}: {e}")
|
|
||||||
sys.exit(0)
|
|
||||||
|
|
||||||
def install_library(self, lib_name: str):
|
def install_library(self, lib_name: str):
|
||||||
"""
|
"""
|
||||||
Install a Python library using pip.
|
Install a Python library using pip.
|
||||||
@ -402,16 +365,6 @@ class OsSummary:
|
|||||||
|
|
||||||
def get_system_summary(self):
|
def get_system_summary(self):
|
||||||
self.check_python_version()
|
self.check_python_version()
|
||||||
InternManager().check_internet()
|
|
||||||
|
|
||||||
# Python info
|
|
||||||
python_version = sys.version.split()[0]
|
|
||||||
python_implementation = platform.python_implementation()
|
|
||||||
arch = platform.machine()
|
|
||||||
os_info = platform.platform()
|
|
||||||
glibc_version = 'glibc ' + '.'.join(map(str, platform.libc_ver()[1]))
|
|
||||||
|
|
||||||
console.print(f"[cyan]Python: [bold red]{python_version} ({python_implementation} {arch}) - {os_info} ({glibc_version})[/bold red]")
|
|
||||||
|
|
||||||
# FFmpeg detection
|
# FFmpeg detection
|
||||||
binary_dir = self.get_binary_directory()
|
binary_dir = self.get_binary_directory()
|
||||||
@ -457,31 +410,6 @@ class OsSummary:
|
|||||||
|
|
||||||
console.print(f"[cyan]Path: [red]ffmpeg [bold yellow]'{self.ffmpeg_path}'[/bold yellow][white], [red]ffprobe '[bold yellow]{self.ffprobe_path}'[/bold yellow]")
|
console.print(f"[cyan]Path: [red]ffmpeg [bold yellow]'{self.ffmpeg_path}'[/bold yellow][white], [red]ffprobe '[bold yellow]{self.ffprobe_path}'[/bold yellow]")
|
||||||
|
|
||||||
# Handle requirements.txt
|
|
||||||
if not getattr(sys, 'frozen', False):
|
|
||||||
requirements_file = 'requirements.txt'
|
|
||||||
|
|
||||||
requirements_file = Path(__file__).parent.parent.parent / requirements_file
|
|
||||||
|
|
||||||
if not os.path.exists(requirements_file):
|
|
||||||
self.download_requirements(
|
|
||||||
'https://raw.githubusercontent.com/Arrowar/StreamingCommunity/refs/heads/main/requirements.txt',
|
|
||||||
requirements_file
|
|
||||||
)
|
|
||||||
|
|
||||||
optional_libraries = [line.strip().split("=")[0] for line in open(requirements_file, 'r', encoding='utf-8-sig')]
|
|
||||||
|
|
||||||
for lib in optional_libraries:
|
|
||||||
installed_version = self.get_library_version(lib.split("<")[0])
|
|
||||||
if 'not installed' in installed_version:
|
|
||||||
user_response = msg.ask(f"{lib} is not installed. Do you want to install it? (yes/no)", default="y")
|
|
||||||
if user_response.lower().strip() in ["yes", "y"]:
|
|
||||||
self.install_library(lib)
|
|
||||||
else:
|
|
||||||
logging.info(f"Library: {installed_version}")
|
|
||||||
|
|
||||||
logging.info(f"Libraries: {', '.join([self.get_library_version(lib) for lib in optional_libraries])}")
|
|
||||||
|
|
||||||
|
|
||||||
os_manager = OsManager()
|
os_manager = OsManager()
|
||||||
internet_manager = InternManager()
|
internet_manager = InternManager()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user