diff --git a/Src/Api/Altadefinizione/Core/Player/supervideo.py b/Src/Api/Altadefinizione/Core/Player/supervideo.py index 9be0249..48e8155 100644 --- a/Src/Api/Altadefinizione/Core/Player/supervideo.py +++ b/Src/Api/Altadefinizione/Core/Player/supervideo.py @@ -1,15 +1,12 @@ # 26.05.24 import re -import os import sys -import time import logging -import subprocess # External libraries -from Src.Lib.Request import requests +import requests from bs4 import BeautifulSoup diff --git a/Src/Api/Altadefinizione/site.py b/Src/Api/Altadefinizione/site.py index 958cc8d..1a53609 100644 --- a/Src/Api/Altadefinizione/site.py +++ b/Src/Api/Altadefinizione/site.py @@ -6,7 +6,7 @@ import logging # External libraries -from Src.Lib.Request import requests +import requests from bs4 import BeautifulSoup from unidecode import unidecode diff --git a/Src/Api/Animeunity/Core/Util/get_domain.py b/Src/Api/Animeunity/Core/Util/get_domain.py index 36e02cd..6730179 100644 --- a/Src/Api/Animeunity/Core/Util/get_domain.py +++ b/Src/Api/Animeunity/Core/Util/get_domain.py @@ -5,8 +5,8 @@ import threading import logging -# Internal libraries -from Src.Lib.Request import requests +# External libraries +import requests # Internal utilities diff --git a/Src/Api/Animeunity/Core/Vix_player/player.py b/Src/Api/Animeunity/Core/Vix_player/player.py index 9fad807..c977888 100644 --- a/Src/Api/Animeunity/Core/Vix_player/player.py +++ b/Src/Api/Animeunity/Core/Vix_player/player.py @@ -1,16 +1,18 @@ # 01.03.24 +import sys import logging from urllib.parse import urljoin, urlparse, parse_qs, urlencode, urlunparse # External libraries -from Src.Lib.Request import requests +import requests from bs4 import BeautifulSoup # Internal utilities from Src.Util.headers import get_headers +from Src.Util.console import console from Src.Util._jsonConfig import config_manager @@ -204,4 +206,4 @@ class VideoSource: new_url = m._replace(query=new_query) # Replace the old query string with the new one final_url = urlunparse(new_url) # Construct the final URL from the modified parts - return final_url \ No newline at end of file + return final_url diff --git a/Src/Api/Animeunity/costant.py b/Src/Api/Animeunity/costant.py index 68ec402..7e75bc2 100644 --- a/Src/Api/Animeunity/costant.py +++ b/Src/Api/Animeunity/costant.py @@ -2,4 +2,4 @@ ANIME_FOLDER = "animeunity" SERIES_FOLDER= "Serie" -MOVIE_FOLDER = "Movie" \ No newline at end of file +MOVIE_FOLDER = "Movie" diff --git a/Src/Api/Animeunity/site.py b/Src/Api/Animeunity/site.py index 28ee558..b885afd 100644 --- a/Src/Api/Animeunity/site.py +++ b/Src/Api/Animeunity/site.py @@ -5,7 +5,7 @@ import logging # External libraries -from Src.Lib.Request import requests +import requests from bs4 import BeautifulSoup from unidecode import unidecode diff --git a/Src/Api/Streamingcommunity/Core/Util/get_domain.py b/Src/Api/Streamingcommunity/Core/Util/get_domain.py index 0faada4..4017c43 100644 --- a/Src/Api/Streamingcommunity/Core/Util/get_domain.py +++ b/Src/Api/Streamingcommunity/Core/Util/get_domain.py @@ -5,8 +5,11 @@ import threading import logging +# External library +import requests + + # Internal utilities -from Src.Lib.Request import requests from Src.Lib.Google import search as google_search diff --git a/Src/Api/Streamingcommunity/Core/Vix_player/player.py b/Src/Api/Streamingcommunity/Core/Vix_player/player.py index 831e216..cb26be4 100644 --- a/Src/Api/Streamingcommunity/Core/Vix_player/player.py +++ b/Src/Api/Streamingcommunity/Core/Vix_player/player.py @@ -6,7 +6,7 @@ from urllib.parse import urljoin, urlparse, parse_qs, urlencode, urlunparse # External libraries -from Src.Lib.Request import requests +import requests from bs4 import BeautifulSoup @@ -202,7 +202,6 @@ class VideoSource: logging.error(f"Error getting content: {e}") raise - def get_playlist(self) -> str: """ Get playlist. @@ -239,5 +238,5 @@ class VideoSource: new_query = urlencode(final_params) # Encode final_params into a query string new_url = m._replace(query=new_query) # Replace the old query string with the new one final_url = urlunparse(new_url) # Construct the final URL from the modified parts - - return final_url \ No newline at end of file + + return final_url diff --git a/Src/Api/Streamingcommunity/costant.py b/Src/Api/Streamingcommunity/costant.py index e1e8653..de48a7f 100644 --- a/Src/Api/Streamingcommunity/costant.py +++ b/Src/Api/Streamingcommunity/costant.py @@ -4,4 +4,4 @@ STREAMING_FOLDER = "streamingcommunity" MOVIE_FOLDER = "Movie" SERIES_FOLDER = "Serie" -SERVER_IP = ['162.19.231.20', '162.19.255.224', '162.19.254.232', '162.19.254.230', '51.195.107.230', '162.19.255.36', '162.19.228.128', '51.195.107.7', '162.19.253.242', '141.95.0.248', '57.129.4.77', '57.129.7.85'] \ No newline at end of file +STATIC_IP_SERVER = ['57.129.7.85', '57.129.7.188', '57.129.7.174', '57.129.4.77', '57.129.16.196', '57.129.16.156', '57.129.16.139', '57.129.16.135', '57.129.13.175', '57.129.13.157', '51.38.112.237', '51.195.107.7', '51.195.107.230', '162.19.255.78', '162.19.255.36', '162.19.255.224', '162.19.255.223', '162.19.254.244', '162.19.254.232', '162.19.254.230', '162.19.253.242', '162.19.249.48', '162.19.245.142', '162.19.231.20', '162.19.229.177', '162.19.228.128', '162.19.228.127', '162.19.228.105', '141.95.1.32', '141.95.1.196', '141.95.1.102', '141.95.0.50', '141.95.0.248', '135.125.237.84', '135.125.233.236'] \ No newline at end of file diff --git a/Src/Api/Streamingcommunity/film.py b/Src/Api/Streamingcommunity/film.py index 47b0e90..765a5cf 100644 --- a/Src/Api/Streamingcommunity/film.py +++ b/Src/Api/Streamingcommunity/film.py @@ -18,7 +18,7 @@ from .Core.Vix_player.player import VideoSource # Config ROOT_PATH = config_manager.get('DEFAULT', 'root_path') -from .costant import STREAMING_FOLDER, MOVIE_FOLDER, SERVER_IP +from .costant import STREAMING_FOLDER, MOVIE_FOLDER, STATIC_IP_SERVER # Variable @@ -59,4 +59,4 @@ def download_film(id_film: str, title_name: str, domain: str): Downloader( m3u8_playlist = master_playlist, output_filename = os.path.join(mp4_path, mp4_format) - ).start(SERVER_IP) \ No newline at end of file + ).start(STATIC_IP_SERVER) \ No newline at end of file diff --git a/Src/Api/Streamingcommunity/series.py b/Src/Api/Streamingcommunity/series.py index f10be43..1d0458b 100644 --- a/Src/Api/Streamingcommunity/series.py +++ b/Src/Api/Streamingcommunity/series.py @@ -20,7 +20,7 @@ from .Core.Util import manage_selection, map_episode_title # Config ROOT_PATH = config_manager.get('DEFAULT', 'root_path') -from .costant import STREAMING_FOLDER, SERIES_FOLDER, SERVER_IP +from .costant import STREAMING_FOLDER, SERIES_FOLDER, STATIC_IP_SERVER # Variable @@ -96,7 +96,7 @@ def donwload_video(tv_name: str, index_season_selected: int, index_episode_selec Downloader( m3u8_playlist = master_playlist, output_filename = os.path.join(mp4_path, mp4_name) - ).start(SERVER_IP) + ).start(STATIC_IP_SERVER) def donwload_episode(tv_name: str, index_season_selected: int, donwload_all: bool = False) -> None: diff --git a/Src/Api/Streamingcommunity/site.py b/Src/Api/Streamingcommunity/site.py index 606e77c..bdd5ec9 100644 --- a/Src/Api/Streamingcommunity/site.py +++ b/Src/Api/Streamingcommunity/site.py @@ -8,12 +8,12 @@ from typing import Tuple # External libraries +import requests from bs4 import BeautifulSoup from unidecode import unidecode # Internal utilities -from Src.Lib.Request import requests from Src.Util.headers import get_headers from Src.Util._jsonConfig import config_manager from Src.Util.console import console diff --git a/Src/Lib/FFmpeg/capture.py b/Src/Lib/FFmpeg/capture.py index fe4ddbd..561820e 100644 --- a/Src/Lib/FFmpeg/capture.py +++ b/Src/Lib/FFmpeg/capture.py @@ -40,6 +40,10 @@ def capture_output(process: subprocess.Popen, description: str) -> None: logging.info(f"FFMPEG line: {line}") + # Capture only error + if "rror" in str(line): + console.log(f"[red]FFMPEG: {str(line).strip()}") + # Check if termination is requested if terminate_flag.is_set(): break diff --git a/Src/Lib/FFmpeg/command.py b/Src/Lib/FFmpeg/command.py index af2f57b..f3b85c1 100644 --- a/Src/Lib/FFmpeg/command.py +++ b/Src/Lib/FFmpeg/command.py @@ -19,14 +19,18 @@ except: pass from Src.Util._jsonConfig import config_manager from Src.Util.os import check_file_existence, suppress_output from Src.Util.console import console -from .util import has_audio_stream, need_to_force_to_ts, check_ffmpeg_input +from .util import has_audio_stream, need_to_force_to_ts, check_ffmpeg_input, check_duration_v_a from .capture import capture_ffmpeg_real_time +from ..M3U8.parser import M3U8_Codec # Config DEBUG_MODE = config_manager.get_bool("DEFAULT", "debug") DEBUG_FFMPEG = "debug" if DEBUG_MODE else "error" -USE_CODECS = config_manager.get_bool("M3U8_CONVERSION", "use_codec") +USE_CODEC = config_manager.get_bool("M3U8_CONVERSION", "use_codec") +USE_VCODEC = config_manager.get_bool("M3U8_CONVERSION", "use_vcodec") +USE_ACODEC = config_manager.get_bool("M3U8_CONVERSION", "use_acodec") +USE_BITRATE = config_manager.get_bool("M3U8_CONVERSION", "use_bitrate") USE_GPU = config_manager.get_bool("M3U8_CONVERSION", "use_gpu") FFMPEG_DEFAULT_PRESET = config_manager.get("M3U8_CONVERSION", "default_preset") CHECK_OUTPUT_CONVERSION = config_manager.get_bool("M3U8_CONVERSION", "check_output_after_ffmpeg") @@ -263,7 +267,7 @@ def __transcode_with_subtitles(video: str, subtitles_list: List[Dict[str, str]], # --> v 1.1 (new) -def join_video(video_path: str, out_path: str, vcodec: str = None, acodec: str = None, bitrate: str = None): +def join_video(video_path: str, out_path: str, codec: M3U8_Codec = None): """ Joins single ts video file to mp4 @@ -281,12 +285,12 @@ def join_video(video_path: str, out_path: str, vcodec: str = None, acodec: str = logging.error("Missing input video for ffmpeg conversion.") sys.exit(0) - # Start command ffmpeg_cmd = ['ffmpeg'] # Enabled the use of gpu - ffmpeg_cmd.extend(['-hwaccel', 'cuda', '-hwaccel_output_format', 'cuda']) + if USE_GPU: + ffmpeg_cmd.extend(['-hwaccel', 'cuda', '-hwaccel_output_format', 'cuda']) # Add mpegts to force to detect input file as ts file if need_to_force_to_ts(video_path): @@ -294,15 +298,30 @@ def join_video(video_path: str, out_path: str, vcodec: str = None, acodec: str = ffmpeg_cmd.extend(['-f', 'mpegts']) vcodec = "libx264" - # Insert input video path ffmpeg_cmd.extend(['-i', video_path]) # Add output args - if USE_CODECS: - if vcodec: ffmpeg_cmd.extend(['-c:v', vcodec]) - if acodec: ffmpeg_cmd.extend(['-c:a', acodec]) - if bitrate: ffmpeg_cmd.extend(['-b:a', str(bitrate)]) + if USE_CODEC: + if USE_VCODEC: + if codec.video_codec_name: + if not USE_GPU: + ffmpeg_cmd.extend(['-c:v', codec.video_codec_name]) + else: + ffmpeg_cmd.extend(['-c:v', 'h264_nvenc']) + else: + console.log("[red]Cant find vcodec for 'join_audios'") + + if USE_ACODEC: + if codec.audio_codec_name: + ffmpeg_cmd.extend(['-c:a', codec.audio_codec_name]) + else: + console.log("[red]Cant find acodec for 'join_audios'") + + if USE_BITRATE: + ffmpeg_cmd.extend(['-b:v', f'{codec.video_bitrate // 1000}k']) + ffmpeg_cmd.extend(['-b:a', f'{codec.audio_bitrate // 1000}k']) + else: ffmpeg_cmd.extend(['-c', 'copy']) @@ -312,12 +331,10 @@ def join_video(video_path: str, out_path: str, vcodec: str = None, acodec: str = else: ffmpeg_cmd.extend(['-preset', 'fast']) - # Overwrite ffmpeg_cmd += [out_path, "-y"] logging.info(f"FFmpeg command: {ffmpeg_cmd}") - # Run join if DEBUG_MODE: subprocess.run(ffmpeg_cmd, check=True) @@ -333,8 +350,6 @@ def join_video(video_path: str, out_path: str, vcodec: str = None, acodec: str = capture_ffmpeg_real_time(ffmpeg_cmd, "[cyan]Join video") print() - - # Check file output if CHECK_OUTPUT_CONVERSION: console.log("[red]Check output ffmpeg") @@ -347,7 +362,7 @@ def join_video(video_path: str, out_path: str, vcodec: str = None, acodec: str = sys.exit(0) -def join_audios(video_path: str, audio_tracks: List[Dict[str, str]], out_path: str): +def join_audios(video_path: str, audio_tracks: List[Dict[str, str]], out_path: str, codec: M3U8_Codec = None): """ Joins audio tracks with a video file using FFmpeg. @@ -362,9 +377,17 @@ def join_audios(video_path: str, audio_tracks: List[Dict[str, str]], out_path: s logging.error("Missing input video for ffmpeg conversion.") sys.exit(0) + video_audio_same_duration = check_duration_v_a(video_path, audio_tracks[0].get('path')) # Start command - ffmpeg_cmd = ['ffmpeg', '-i', video_path] + ffmpeg_cmd = ['ffmpeg'] + + # Enabled the use of gpu + if USE_GPU: + ffmpeg_cmd.extend(['-hwaccel', 'cuda', '-hwaccel_output_format', 'cuda']) + + # Insert input video path + ffmpeg_cmd.extend(['-i', video_path]) # Add audio tracks as input for i, audio_track in enumerate(audio_tracks): @@ -373,7 +396,6 @@ def join_audios(video_path: str, audio_tracks: List[Dict[str, str]], out_path: s else: logging.error(f"Skip audio join: {audio_track.get('path')} dont exist") - # Map the video and audio streams ffmpeg_cmd.append('-map') ffmpeg_cmd.append('0:v') # Map video stream from the first input (video_path) @@ -382,18 +404,45 @@ def join_audios(video_path: str, audio_tracks: List[Dict[str, str]], out_path: s ffmpeg_cmd.append('-map') ffmpeg_cmd.append(f'{i}:a') # Map audio streams from subsequent inputs - # Add output args - if USE_CODECS: - ffmpeg_cmd.extend(['-c:v', 'copy', '-c:a', 'copy']) + if USE_CODEC: + if USE_VCODEC: + if codec.video_codec_name: + if not USE_GPU: + ffmpeg_cmd.extend(['-c:v', codec.video_codec_name]) + else: + ffmpeg_cmd.extend(['-c:v', 'h264_nvenc']) + else: + console.log("[red]Cant find vcodec for 'join_audios'") + + if USE_ACODEC: + if codec.audio_codec_name: + ffmpeg_cmd.extend(['-c:a', codec.audio_codec_name]) + else: + console.log("[red]Cant find acodec for 'join_audios'") + + if USE_BITRATE: + ffmpeg_cmd.extend(['-b:v', f'{codec.video_bitrate // 1000}k']) + ffmpeg_cmd.extend(['-b:a', f'{codec.audio_bitrate // 1000}k']) + else: ffmpeg_cmd.extend(['-c', 'copy']) + # Ultrafast preset always or fast for gpu + if not USE_GPU: + ffmpeg_cmd.extend(['-preset', FFMPEG_DEFAULT_PRESET]) + else: + ffmpeg_cmd.extend(['-preset', 'fast']) + + # Use shortest input path for video and audios + if not video_audio_same_duration: + console.log("[red]Use shortest input.") + ffmpeg_cmd.extend(['-shortest', '-strict', 'experimental']) + # Overwrite ffmpeg_cmd += [out_path, "-y"] logging.info(f"FFmpeg command: {ffmpeg_cmd}") - # Run join if DEBUG_MODE: subprocess.run(ffmpeg_cmd, check=True) @@ -409,7 +458,6 @@ def join_audios(video_path: str, audio_tracks: List[Dict[str, str]], out_path: s capture_ffmpeg_real_time(ffmpeg_cmd, "[cyan]Join audio") print() - # Check file output if CHECK_OUTPUT_CONVERSION: console.log("[red]Check output ffmpeg") @@ -456,7 +504,7 @@ def join_subtitle(video_path: str, subtitles_list: List[Dict[str, str]], out_pat ffmpeg_cmd += ["-metadata:s:s:{}".format(idx), "title={}".format(subtitle['name'])] # Add output args - if USE_CODECS: + if USE_CODEC: ffmpeg_cmd.extend(['-c:v', 'copy', '-c:a', 'copy', '-c:s', 'mov_text']) else: ffmpeg_cmd.extend(['-c', 'copy', '-c:s', 'mov_text']) diff --git a/Src/Lib/FFmpeg/util.py b/Src/Lib/FFmpeg/util.py index 4e03244..1f46cf4 100644 --- a/Src/Lib/FFmpeg/util.py +++ b/Src/Lib/FFmpeg/util.py @@ -71,8 +71,8 @@ def get_video_duration(file_path: str) -> float: return float(probe_result['format']['duration']) except Exception as e: - logging.error(f"Error: {e}") - return None + logging.error(f"Error get video duration: {e}") + sys.exit(0) def format_duration(seconds: float) -> Tuple[int, int, int]: @@ -92,7 +92,7 @@ def format_duration(seconds: float) -> Tuple[int, int, int]: return int(hours), int(minutes), int(seconds) -def print_duration_table(file_path: str) -> None: +def print_duration_table(file_path: str, show = True) -> None: """ Print duration of a video file in hours, minutes, and seconds. @@ -104,7 +104,10 @@ def print_duration_table(file_path: str) -> None: if video_duration is not None: hours, minutes, seconds = format_duration(video_duration) - console.log(f"[cyan]Duration for [white]([green]{os.path.basename(file_path)}[white]): [yellow]{int(hours)}[red]h [yellow]{int(minutes)}[red]m [yellow]{int(seconds)}[red]s") + if show: + console.print(f"[cyan]Duration for [white]([green]{os.path.basename(file_path)}[white]): [yellow]{int(hours)}[red]h [yellow]{int(minutes)}[red]m [yellow]{int(seconds)}[red]s") + else: + return f"[yellow]{int(hours)}[red]h [yellow]{int(minutes)}[red]m [yellow]{int(seconds)}[red]s" def get_ffprobe_info(file_path): @@ -210,3 +213,24 @@ def check_ffmpeg_input(input_file): except Exception as e: logging.error(f"An unexpected error occurred: {e}") return False + +def check_duration_v_a(video_path, audio_path): + """ + Check if the duration of the video and audio matches. + + Args: + - video_path (str): Path to the video file. + - audio_path (str): Path to the audio file. + + Returns: + - bool: True if the duration of the video and audio matches, False otherwise. + """ + + # Ottieni la durata del video + video_duration = get_video_duration(video_path) + + # Ottieni la durata dell'audio + audio_duration = get_video_duration(audio_path) + + # Verifica se le durate corrispondono + return video_duration == audio_duration \ No newline at end of file diff --git a/Src/Lib/Google/page.py b/Src/Lib/Google/page.py index 2185ad7..54e976f 100644 --- a/Src/Lib/Google/page.py +++ b/Src/Lib/Google/page.py @@ -8,7 +8,7 @@ from typing import Generator, Optional # External libraries -from Src.Lib.Request import requests +import requests from bs4 import BeautifulSoup diff --git a/Src/Lib/Hls/downloader.py b/Src/Lib/Hls/downloader.py index a3fea2c..26bd443 100644 --- a/Src/Lib/Hls/downloader.py +++ b/Src/Lib/Hls/downloader.py @@ -8,7 +8,7 @@ from concurrent.futures import ThreadPoolExecutor # External libraries -from Src.Lib.Request import requests +import requests from unidecode import unidecode @@ -178,7 +178,7 @@ class Downloader(): # Check if there is some audios, else disable download if self.list_available_audio != None: - console.log(f"[cyan]Find audios [white]=> [red]{[obj_audio.get('language') for obj_audio in self.list_available_audio]}") + console.print(f"[cyan]Find audios [white]=> [red]{[obj_audio.get('language') for obj_audio in self.list_available_audio]}") else: console.log("[red]Cant find a list of audios") @@ -191,7 +191,7 @@ class Downloader(): # Check if there is some subtitles, else disable download if self.list_available_subtitles != None: - console.log(f"[cyan]Find subtitles [white]=> [red]{[obj_sub.get('language') for obj_sub in self.list_available_subtitles]}") + console.print(f"[cyan]Find subtitles [white]=> [red]{[obj_sub.get('language') for obj_sub in self.list_available_subtitles]}") else: console.log("[red]Cant find a list of audios") @@ -208,7 +208,7 @@ class Downloader(): logging.info(f"M3U8 index select: {self.m3u8_index}, with resolution: {video_res}") # Get URI of the best quality and codecs parameters - console.log(f"[cyan]Find resolution [white]=> [red]{sorted(list_available_resolution, reverse=True)}") + console.print(f"[cyan]Find resolution [white]=> [red]{sorted(list_available_resolution, reverse=True)}") # Fix URL if it is not complete with http:\\site_name.domain\... if "http" not in self.m3u8_index: @@ -219,7 +219,7 @@ class Downloader(): # Check if a valid HTTPS URL is obtained if self.m3u8_index is not None and "https" in self.m3u8_index: - console.log(f"[cyan]Found m3u8 index [white]=> [red]{self.m3u8_index}") + console.print(f"[cyan]Found m3u8 index [white]=> [red]{self.m3u8_index}") else: logging.error("[download_m3u8] Can't find a valid m3u8 index") raise @@ -229,7 +229,8 @@ class Downloader(): logging.info(f"Find codec: {self.codec}") if self.codec is not None: - console.log(f"[cyan]Find codec [white]=> ([green]'v'[white]: [yellow]{self.codec.video_codec_name}[white], [green]'a'[white]: [yellow]{self.codec.audio_codec_name}[white], [green]'b'[white]: [yellow]{self.codec.bandwidth})") + console.print(f"[cyan]Find codec [white]=> ([green]'v'[white]: [yellow]{self.codec.video_codec_name}[white] ([green]b[white]: [yellow]{self.codec.video_bitrate // 1000}k[white]), [green]'a'[white]: [yellow]{self.codec.audio_codec_name}[white] ([green]b[white]: [yellow]{self.codec.audio_bitrate // 1000}k[white]))") + def __donwload_video__(self, server_ip: list = None): """ @@ -263,6 +264,9 @@ class Downloader(): # Download the video segments video_m3u8.download_streams(f"{Colors.MAGENTA}video") + # Get time of output file + print_duration_table(os.path.join(full_path_video, "0.ts")) + else: console.log("[cyan]Video [red]already exists.") @@ -309,6 +313,9 @@ class Downloader(): # Download the audio segments audio_m3u8.download_streams(f"{Colors.MAGENTA}audio {Colors.RED}{obj_audio.get('language')}") + # Get time of output file + print_duration_table(os.path.join(full_path_audio, "0.ts")) + else: console.log(f"[cyan]Audio [white]([green]{obj_audio.get('language')}[white]) [red]already exists.") @@ -373,14 +380,14 @@ class Downloader(): ) # Initiate the download of the subtitle content - console.log(f"[cyan]Downloading subtitle: [red]{sub_language.lower()}") + console.print(f"[cyan]Downloading subtitle: [red]{sub_language.lower()}") futures.append(executor.submit(self.__save_subtitle_content, m3u8_sub_parser.subtitle[-1], sub_full_path)) # Wait for all downloads to finish for future in futures: future.result() - def __join_video__(self, vcodec = 'copy') -> str: + def __join_video__(self) -> str: """ Join downloaded video segments into a single video file. @@ -397,10 +404,9 @@ class Downloader(): join_video( video_path = self.downloaded_video[0].get('path'), out_path = path_join_video, - vcodec = vcodec + codec = self.codec ) - print_duration_table(path_join_video) return path_join_video def __join_video_audio__(self) -> str: @@ -420,10 +426,10 @@ class Downloader(): join_audios( video_path = self.downloaded_video[0].get('path'), audio_tracks = self.downloaded_audio, - out_path = path_join_video_audio + out_path = path_join_video_audio, + codec = self.codec ) - print_duration_table(path_join_video_audio) return path_join_video_audio def __join_video_subtitles__(self, input_path: str) -> str: @@ -449,7 +455,6 @@ class Downloader(): path_join_video_subtitle ) - print_duration_table(path_join_video_subtitle) return path_join_video_subtitle def __clean__(self, out_path: str) -> None: @@ -473,7 +478,11 @@ class Downloader(): os.rename(out_path, self.output_filename) # Print size of the file - console.print(Panel(f"[bold green]Download completed![/bold green]\nFile size: [bold red]{format_size(os.path.getsize(self.output_filename))}[/bold red]", title=f"{os.path.basename(self.output_filename.replace('.mp4', ''))}", border_style="green")) + console.print(Panel( + f"[bold green]Download completed![/bold green]\n" + f"File size: [bold red]{format_size(os.path.getsize(self.output_filename))}[/bold red]\n" + f"Duration: [bold]{print_duration_table(self.output_filename, show=False)}[/bold]", + title=f"{os.path.basename(self.output_filename.replace('.mp4', ''))}", border_style="green")) # Delete all files except the output file delete_files_except_one(self.base_path, os.path.basename(self.output_filename)) @@ -535,7 +544,7 @@ class Downloader(): there_is_video: bool = (len(self.downloaded_video) > 0) there_is_audio: bool = (len(self.downloaded_audio) > 0) there_is_subtitle: bool = (len(self.downloaded_subtitle) > 0) - console.log(f"[cyan]Conversion [white]=> ([green]Audio: [yellow]{there_is_audio}[white], [green]Subtitle: [yellow]{there_is_subtitle}[white])") + console.print(f"[cyan]Conversion [white]=> ([green]Audio: [yellow]{there_is_audio}[white], [green]Subtitle: [yellow]{there_is_subtitle}[white])") # Join audio and video diff --git a/Src/Lib/Hls/segments.py b/Src/Lib/Hls/segments.py index beeb831..050706e 100644 --- a/Src/Lib/Hls/segments.py +++ b/Src/Lib/Hls/segments.py @@ -5,7 +5,6 @@ import sys import time import queue import threading -import signal import logging import binascii from concurrent.futures import ThreadPoolExecutor @@ -13,7 +12,7 @@ from urllib.parse import urljoin, urlparse, urlunparse # External libraries -from Src.Lib.Request import requests +import requests from tqdm import tqdm @@ -23,6 +22,7 @@ from Src.Util.headers import get_headers from Src.Util.color import Colors from Src.Util._jsonConfig import config_manager + # Logic class from ..M3U8 import ( M3U8_Decryption, @@ -32,11 +32,14 @@ from ..M3U8 import ( ) +# Warning +import urllib3 +urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) + # Config TQDM_MAX_WORKER = config_manager.get_int('M3U8_DOWNLOAD', 'tdqm_workers') TQDM_USE_LARGE_BAR = config_manager.get_int('M3U8_DOWNLOAD', 'tqdm_use_large_bar') REQUEST_VERIFY_SSL = config_manager.get_bool('REQUESTS', 'verify_ssl') -REQUEST_DISABLE_ERROR = config_manager.get_bool('REQUESTS', 'disable_error') # Variable @@ -55,18 +58,20 @@ class M3U8_Segments: - tmp_folder (str): The temporary folder to store downloaded segments. """ self.url = url + self.fake_proxy = False self.tmp_folder = tmp_folder - self.decryption: M3U8_Decryption = None # Initialize decryption as None - self.segment_queue = queue.PriorityQueue() # Priority queue to maintain the order of segments - self.current_index = 0 # Index of the current segment to be written - self.tmp_file_path = os.path.join(self.tmp_folder, "0.ts") # Path to the temporary file - self.condition = threading.Condition() # Condition variable for thread synchronization - self.ctrl_c_detected = False # Global variable to track Ctrl+C detection + self.tmp_file_path = os.path.join(self.tmp_folder, "0.ts") + os.makedirs(self.tmp_folder, exist_ok=True) - os.makedirs(self.tmp_folder, exist_ok=True) # Create the temporary folder if it does not exist + # Util class + self.decryption: M3U8_Decryption = None self.class_ts_estimator = M3U8_Ts_Estimator(0) self.class_url_fixer = M3U8_UrlFix(url) - self.fake_proxy = False + + # Sync + self.current_index = 0 # Index of the current segment to be written + self.segment_queue = queue.PriorityQueue() # Priority queue to maintain the order of segments + self.condition = threading.Condition() # Condition variable for thread synchronization def add_server_ip(self, list_ip): """ @@ -97,8 +102,6 @@ class M3U8_Segments: logging.info(f"Uri key: {key_uri}") try: - - # Send HTTP GET request to fetch the key response = requests.get(key_uri, headers=headers_index) response.raise_for_status() @@ -112,6 +115,41 @@ class M3U8_Segments: logging.info(f"Key: ('hex': {hex_content}, 'byte': {byte_content})") return byte_content + def __test_ip(self, url_to_test: str): + """ + Tests each proxy IP by sending a request to a corresponding segment URL. + """ + + failed_ips = [] + + for i in range(len(self.fake_proxy_ip)): + + try: + response = requests.get(url_to_test, verify=False, retries=0) + + if response == None: + logging.error(f"[Work] to make request using: {url_to_test}") + failed_ips.append(i) + + except: + + # Log the error and add the IP to the list of failed IPs + logging.error(f"[Fail] to make request using IP in this request: {url_to_test}") + failed_ips.append(i) + + # Remove the failed IPs from the fake_proxy_ip list + self.fake_proxy_ip = [ip for j, ip in enumerate(self.fake_proxy_ip) if j not in failed_ips] + + # Exit the program if 50% requests failed + if len(failed_ips) / 2 > len(self.fake_proxy_ip): + logging.error("All requests with ip failed.") + + # Set to not use proxy + self.fake_proxy_ip = None + self.fake_proxy = False + + return False + def parse_data(self, m3u8_content: str) -> None: """ Parses the M3U8 content to extract segment information. @@ -120,9 +158,10 @@ class M3U8_Segments: - m3u8_content (str): The content of the M3U8 file. """ m3u8_parser = M3U8_Parser() - m3u8_parser.parse_data(uri=self.url, raw_content=m3u8_content) # Parse the content of the M3U8 playlist + m3u8_parser.parse_data(uri=self.url, raw_content=m3u8_content) - console.log(f"[cyan]There is key: [yellow]{m3u8_parser.keys is not None}") + console.log(f"[red]Expected duration after download: {m3u8_parser.get_duration()}") + console.log(f"[red]There is key: [yellow]{m3u8_parser.keys is not None}") # Check if there is an encryption key in the playlis if m3u8_parser.keys is not None: @@ -156,6 +195,12 @@ class M3U8_Segments: for i in range(len(self.segments)): segment_url = self.segments[i] + # Set to not use proxy if 50% failed + if not self.__test_ip(segment_url): + console.log("[red]Cant use proxy switch to normal url.") + self.fake_proxy = False + break + self.segments[i] = self.__gen_proxy__(segment_url, self.segments.index(segment_url)) # Save new playlist of segment @@ -166,6 +211,7 @@ class M3U8_Segments: # Update segments for estimator self.class_ts_estimator.total_segments = len(self.segments) + logging.info(f"Segmnets to donwload: [{len(self.segments)}]") def get_info(self) -> None: """ @@ -196,28 +242,28 @@ class M3U8_Segments: Returns: str: The modified URL with the new IP address. """ - new_ip_address = self.fake_proxy_ip[url_index % len(self.fake_proxy_ip)] + if self.fake_proxy: - # Parse the original URL and replace the hostname with the new IP address - parsed_url = urlparse(url)._replace(netloc=new_ip_address) + new_ip_address = self.fake_proxy_ip[url_index % len(self.fake_proxy_ip)] - return urlunparse(parsed_url) + # Parse the original URL and replace the hostname with the new IP address + parsed_url = urlparse(url)._replace(netloc=new_ip_address) - def make_requests_stream(self, ts_url: str, index: int, stop_event: threading.Event, progress_bar: tqdm) -> None: + return urlunparse(parsed_url) + + else: + return url + + def make_requests_stream(self, ts_url: str, index: int, progress_bar: tqdm) -> None: """ Downloads a TS segment and adds it to the segment queue. Args: - ts_url (str): The URL of the TS segment. - index (int): The index of the segment. - - stop_event (threading.Event): Event to signal the stop of downloading. - progress_bar (tqdm): Progress counter for tracking download progress. - - add_desc (str): Additional description for the progress bar. """ - if stop_event.is_set(): - return # Exit if the stop event is set - # Generate new user agent headers_segments['user-agent'] = get_headers() @@ -225,16 +271,17 @@ class M3U8_Segments: # Make request and calculate time duration start_time = time.time() - response = requests.get(ts_url, headers=headers_segments, verify_ssl=REQUEST_VERIFY_SSL) + response = requests.get(ts_url, headers=headers_segments, verify=REQUEST_VERIFY_SSL, timeout=15) duration = time.time() - start_time - + logging.info(f"Make request to get segment: [{index} - {len(self.segments)}] in: {duration}, len data: {len(response.content)}") + if response.ok: # Get the content of the segment segment_content = response.content # Update bar - self.class_ts_estimator.update_progress_bar(segment_content, duration, progress_bar) + self.class_ts_estimator.update_progress_bar(int(response.headers.get('Content-Length', 0)), duration, progress_bar) # Decrypt the segment content if decryption is needed if self.decryption is not None: @@ -243,37 +290,29 @@ class M3U8_Segments: with self.condition: self.segment_queue.put((index, segment_content)) # Add the segment to the queue self.condition.notify() # Notify the writer thread that a new segment is available - else: - if not REQUEST_DISABLE_ERROR: - logging.error(f"Failed to download segment: {ts_url}") + logging.error(f"Failed to download segment: {ts_url}") except Exception as e: - if not REQUEST_DISABLE_ERROR: - logging.error(f"Exception while downloading segment: {e}") + logging.error(f"Exception while downloading segment: {e}") # Update bar progress_bar.update(1) - def write_segments_to_file(self, stop_event: threading.Event): + def write_segments_to_file(self): """ Writes downloaded segments to a file in the correct order. - - Args: - - stop_event (threading.Event): Event to signal the stop of writing. """ - with open(self.tmp_file_path, 'ab') as f: - while not stop_event.is_set() or not self.segment_queue.empty(): + while True: with self.condition: - while self.segment_queue.empty() and not stop_event.is_set(): - self.condition.wait(timeout=1) # Wait until a new segment is available or stop_event is set + while self.segment_queue.empty() and self.current_index < len(self.segments): + self.condition.wait() # Wait until a new segment is available or all segments are downloaded - if stop_event.is_set(): - break + if self.segment_queue.empty() and self.current_index >= len(self.segments): + break # Exit loop if all segments have been processed if not self.segment_queue.empty(): - # Get the segment from the queue index, segment_content = self.segment_queue.get() @@ -282,10 +321,9 @@ class M3U8_Segments: f.write(segment_content) self.current_index += 1 self.segment_queue.task_done() - else: - self.segment_queue.put((index, segment_content)) # Requeue the segment if it is not the next to be written - self.condition.notify() # Notify that a segment has been requeued + self.segment_queue.put((index, segment_content)) # Requeue the segment if it is not the next to be written + self.condition.notify() def download_streams(self, add_desc): """ @@ -294,10 +332,8 @@ class M3U8_Segments: Args: - add_desc (str): Additional description for the progress bar. """ - stop_event = threading.Event() # Event to signal stopping - if TQDM_USE_LARGE_BAR: - bar_format=f"{Colors.YELLOW}Downloading {Colors.WHITE}({add_desc}{Colors.WHITE}): {Colors.RED}{{percentage:.2f}}% {Colors.MAGENTA}{{bar}} {Colors.YELLOW}{{elapsed}} {Colors.WHITE}< {Colors.CYAN}{{remaining}}{{postfix}} {Colors.WHITE}]" + bar_format=f"{Colors.YELLOW}Downloading {Colors.WHITE}({add_desc}{Colors.WHITE}): {Colors.RED}{{percentage:.2f}}% {Colors.MAGENTA}{{bar}} {Colors.WHITE}| {Colors.YELLOW}{{n_fmt}}{Colors.WHITE} / {Colors.RED}{{total_fmt}} {Colors.WHITE}| {Colors.YELLOW}{{elapsed}} {Colors.WHITE}< {Colors.CYAN}{{remaining}}{{postfix}} {Colors.WHITE}]" else: bar_format=f"{Colors.YELLOW}Proc{Colors.WHITE}: {Colors.RED}{{percentage:.2f}}% {Colors.WHITE}| {Colors.CYAN}{{remaining}}{{postfix}} {Colors.WHITE}]" @@ -305,49 +341,24 @@ class M3U8_Segments: total=len(self.segments), unit='s', ascii='░▒█', - bar_format=bar_format, - dynamic_ncols=True, - ncols=80, - mininterval=0.01 + bar_format=bar_format ) - def signal_handler(sig, frame): - self.ctrl_c_detected = True # Set global variable to indicate Ctrl+C detection - - stop_event.set() - with self.condition: - self.condition.notify_all() # Wake up the writer thread if it's waiting - - # Register the signal handler for Ctrl+C - signal.signal(signal.SIGINT, signal_handler) - with ThreadPoolExecutor(max_workers=TQDM_MAX_WORKER) as executor: # Start a separate thread to write segments to the file - writer_thread = threading.Thread(target=self.write_segments_to_file, args=(stop_event,)) + writer_thread = threading.Thread(target=self.write_segments_to_file) writer_thread.start() - # Delay the start of each worker + # Start all workers for index, segment_url in enumerate(self.segments): - # Check for Ctrl+C before starting each download task - time.sleep(0.03) - - if self.ctrl_c_detected: - console.log("[red]Ctrl+C detected. Stopping further downloads.") - - stop_event.set() - with self.condition: - self.condition.notify_all() # Wake up the writer thread if it's waiting - - break - # Submit the download task to the executor - executor.submit(self.make_requests_stream, segment_url, index, stop_event, progress_bar) + executor.submit(self.make_requests_stream, segment_url, index, progress_bar) # Wait for all segments to be downloaded - executor.shutdown(wait=True) - stop_event.set() # Set the stop event to halt the writer thread + executor.shutdown() + with self.condition: self.condition.notify_all() # Wake up the writer thread if it's waiting writer_thread.join() # Wait for the writer thread to finish diff --git a/Src/Lib/M3U8/decryption.py b/Src/Lib/M3U8/decryption.py index b02946c..48aef02 100644 --- a/Src/Lib/M3U8/decryption.py +++ b/Src/Lib/M3U8/decryption.py @@ -111,17 +111,16 @@ else: """ if self.method == "AES": openssl_cmd = f'openssl enc -d -aes-256-ecb -K {self.key.hex()} -nosalt' - decrypted_data = subprocess.check_output(openssl_cmd.split(), input=ciphertext) - elif self.method == "AES-128": openssl_cmd = f'openssl enc -d -aes-128-cbc -K {self.key[:16].hex()} -iv {self.iv.hex()}' - decrypted_data = subprocess.check_output(openssl_cmd.split(), input=ciphertext) - elif self.method == "AES-128-CTR": openssl_cmd = f'openssl enc -d -aes-128-ctr -K {self.key[:16].hex()} -iv {self.iv.hex()}' - decrypted_data = subprocess.check_output(openssl_cmd.split(), input=ciphertext) - else: raise ValueError("Invalid or unsupported method") - return decrypted_data + try: + decrypted_data = subprocess.check_output(openssl_cmd.split(), input=ciphertext, stderr=subprocess.STDOUT) + except subprocess.CalledProcessError as e: + raise ValueError(f"Decryption failed: {e.output.decode()}") + + return decrypted_data \ No newline at end of file diff --git a/Src/Lib/M3U8/estimator.py b/Src/Lib/M3U8/estimator.py index e0e6596..e762a40 100644 --- a/Src/Lib/M3U8/estimator.py +++ b/Src/Lib/M3U8/estimator.py @@ -31,7 +31,7 @@ class M3U8_Ts_Estimator: """ self.ts_file_sizes = [] self.now_downloaded_size = 0 - self.average_over = 6 + self.average_over = 3 self.list_speeds = deque(maxlen=self.average_over) self.smoothed_speeds = [] self.total_segments = total_segments @@ -52,7 +52,7 @@ class M3U8_Ts_Estimator: # Calculate speed outside of the lock try: - speed_mbps = (size_download * 16) / (duration * 1_000_000) + speed_mbps = (size_download * 8) / (duration * 1_000_000) except ZeroDivisionError as e: logging.error("Division by zero error while calculating speed: %s", e) return @@ -114,16 +114,15 @@ class M3U8_Ts_Estimator: """ return format_size(self.now_downloaded_size) - def update_progress_bar(self, segment_content: bytes, duration: float, progress_counter: tqdm) -> None: + def update_progress_bar(self, total_downloaded: int, duration: float, progress_counter: tqdm) -> None: """ Updates the progress bar with information about the TS segment download. Args: - segment_content (bytes): The content of the downloaded TS segment. + total_downloaded (int): The len of the content of the downloaded TS segment. duration (float): The duration of the segment download in seconds. progress_counter (tqdm): The tqdm object representing the progress bar. """ - total_downloaded = len(segment_content) # Add the size of the downloaded segment to the estimator self.add_ts_file(total_downloaded * self.total_segments, total_downloaded, duration) diff --git a/Src/Lib/M3U8/parser.py b/Src/Lib/M3U8/parser.py index 2e3b647..bf364eb 100644 --- a/Src/Lib/M3U8/parser.py +++ b/Src/Lib/M3U8/parser.py @@ -8,7 +8,7 @@ from .lib_parser import load # External libraries -from Src.Lib.Request import requests +import requests # Costant @@ -48,10 +48,6 @@ RESOLUTIONS = [ class M3U8_Codec: - """ - Represents codec information for an M3U8 playlist. - """ - def __init__(self, bandwidth, codecs): """ Initializes the M3U8Codec object with the provided parameters. @@ -64,20 +60,23 @@ class M3U8_Codec: self.codecs = codecs self.audio_codec = None self.video_codec = None + self.video_codec_name = None + self.audio_codec_name = None self.extract_codecs() self.parse_codecs() + self.calculate_bitrates() def extract_codecs(self): """ Parses the codecs information to extract audio and video codecs. Extracted codecs are set as attributes: audio_codec and video_codec. """ - - # Split the codecs string by comma try: + # Split the codecs string by comma codecs_list = self.codecs.split(',') except Exception as e: - logging.error(f"Cant split codec list: {self.codecs} with error {e}") + logging.error(f"Can't split codec list: {self.codecs} with error {e}") + return # Separate audio and video codecs for codec in codecs_list: @@ -87,7 +86,6 @@ class M3U8_Codec: self.audio_codec = codec def convert_video_codec(self, video_codec_identifier) -> str: - """ Convert video codec identifier to codec name. @@ -97,6 +95,9 @@ class M3U8_Codec: Returns: str: Codec name corresponding to the identifier. """ + if not video_codec_identifier: + logging.warning("No video codec identifier provided. Using default codec libx264.") + return "libx264" # Default # Extract codec type from the identifier codec_type = video_codec_identifier.split('.')[0] @@ -107,13 +108,11 @@ class M3U8_Codec: if codec_name: return codec_name - else: logging.warning(f"No corresponding video codec found for {video_codec_identifier}. Using default codec libx264.") - return "libx264" # Default - - def convert_audio_codec(self, audio_codec_identifier) -> str: + return "libx264" # Default + def convert_audio_codec(self, audio_codec_identifier) -> str: """ Convert audio codec identifier to codec name. @@ -123,6 +122,9 @@ class M3U8_Codec: Returns: str: Codec name corresponding to the identifier. """ + if not audio_codec_identifier: + logging.warning("No audio codec identifier provided. Using default codec aac.") + return "aac" # Default # Extract codec type from the identifier codec_type = audio_codec_identifier.split('.')[0] @@ -133,25 +135,33 @@ class M3U8_Codec: if codec_name: return codec_name - else: logging.warning(f"No corresponding audio codec found for {audio_codec_identifier}. Using default codec aac.") - return "aac" # Default - + return "aac" # Default + def parse_codecs(self): """ Parse video and audio codecs. This method updates `video_codec_name` and `audio_codec_name` attributes. """ - self.video_codec_name = self.convert_video_codec(self.video_codec) self.audio_codec_name = self.convert_audio_codec(self.audio_codec) - def __str__(self): + def calculate_bitrates(self): """ - Returns a string representation of the M3U8Codec object. + Calculate video and audio bitrates based on the available bandwidth. """ - return f"BANDWIDTH={self.bandwidth},RESOLUTION={self.resolution},CODECS=\"{self.codecs}\"" + if self.bandwidth: + + # Define the video and audio bitrates + video_bitrate = int(self.bandwidth * 0.8) # Using 80% of bandwidth for video + audio_bitrate = self.bandwidth - video_bitrate + + self.video_bitrate = video_bitrate + self.audio_bitrate = audio_bitrate + else: + logging.warning("No bandwidth provided. Bitrates cannot be calculated.") + class M3U8_Video: @@ -394,6 +404,7 @@ class M3U8_Parser: self._video: M3U8_Video = None self._audio: M3U8_Audio = None self._subtitle: M3U8_Subtitle = None + self.duration: float = 0 self.__create_variable__() @@ -547,6 +558,10 @@ class M3U8_Parser: try: for segment in m3u8_obj.segments: + + # Collect all index duration + self.duration += segment.duration + if "vtt" not in segment.uri: self.segments.append(segment.uri) else: @@ -563,3 +578,21 @@ class M3U8_Parser: self._video = M3U8_Video(self.video_playlist) self._audio = M3U8_Audio(self.audio_playlist) self._subtitle = M3U8_Subtitle(self.subtitle_playlist) + + def get_duration(self): + """ + Convert duration from seconds to hours, minutes, and remaining seconds. + + Parameters: + - seconds (float): Duration in seconds. + + Returns: + - formatted_duration (str): Formatted duration string with hours, minutes, and seconds. + """ + # Calculate hours, minutes, and remaining seconds + hours = int(self.duration / 3600) + minutes = int((self.duration % 3600) / 60) + remaining_seconds = int(self.duration % 60) + + # Format the duration string with colors + return f"[yellow]{int(hours)}[red]h [yellow]{int(minutes)}[red]m [yellow]{int(remaining_seconds)}[red]s" diff --git a/Src/Lib/Request/__init__.py b/Src/Lib/Request/__init__.py deleted file mode 100644 index f6af28d..0000000 --- a/Src/Lib/Request/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# 04.4.24 - -from .my_requests import requests \ No newline at end of file diff --git a/Src/Lib/Request/my_requests.py b/Src/Lib/Request/my_requests.py deleted file mode 100644 index 5c8c06c..0000000 --- a/Src/Lib/Request/my_requests.py +++ /dev/null @@ -1,543 +0,0 @@ -# 04.4.24 - -import os -import sys -import base64 -import json -import logging -import ssl -import time -import re -import subprocess -import urllib.parse -import urllib.request -import urllib.error - -from typing import Dict, Optional, Union, Any - - -try: - from typing import Unpack, TypedDict -except ImportError: - # (Python <= 3.10), - try: - from typing_extensions import Unpack, TypedDict # type: ignore - except ImportError: - raise ImportError("Unable to import Unpack from typing or typing_extensions. " - "Please make sure you have the necessary libraries installed.") - - -# External library -from bs4 import BeautifulSoup - - -# Internal utilities -from Src.Util._jsonConfig import config_manager - - -# Default settings -HTTP_TIMEOUT = config_manager.get_int('REQUESTS', 'timeout') -HTTP_RETRIES = config_manager.get_int('REQUESTS', 'max_retry') -HTTP_DELAY = 1 -HTTP_DISABLE_ERROR = config_manager.get_bool('REQUESTS', 'disable_error') - - - -class RequestError(Exception): - """Custom exception class for request errors.""" - - def __init__(self, message: str, original_exception: Optional[Exception] = None) -> None: - """ - Initialize a RequestError instance. - - Args: - - message (str): The error message. - - original_exception (Optional[Exception], optional): The original exception that occurred. Defaults to None. - """ - super().__init__(message) - self.original_exception = original_exception - - def __str__(self) -> str: - """Return a string representation of the exception.""" - if self.original_exception: - return f"{super().__str__()} Original Exception: {type(self.original_exception).__name__}: {str(self.original_exception)}" - else: - return super().__str__() - - -def parse_http_error(error_string: str): - """ - Parse the HTTP error string to extract the error code and message. - - Args: - - error_string (str): The error string from an HTTP response. - - Returns: - dict: A dictionary with 'error_code' and 'message' if the string is parsed successfully, or None if parsing fails. - """ - - # Regular expression to match the error pattern - error_pattern = re.compile(r"HTTP Error (\d{3}): (.+)") - match = error_pattern.search(error_string) - - if match: - error_code = match.group(1) - message = match.group(2) - return {'error_code': error_code, 'message': message} - - else: - logging.error(f"Error string does not match expected format: {error_string}") - return None - - -class Response: - """ - Class representing an HTTP response. - """ - def __init__( - self, - status: int, - text: str, - is_json: bool = False, - content: bytes = b"", - headers: Optional[Dict[str, str]] = None, - cookies: Optional[Dict[str, str]] = None, - redirect_url: Optional[str] = None, - response_time: Optional[float] = None, - timeout: Optional[float] = None, - ): - """ - Initialize a Response object. - - Args: - - status (int): The HTTP status code of the response. - - text (str): The response content as text. - - is_json (bool, optional): Indicates if the response content is JSON. Defaults to False. - - content (bytes, optional): The response content as bytes. Defaults to b"". - - headers (Optional[Dict[str, str]], optional): The response headers. Defaults to None. - - cookies (Optional[Dict[str, str]], optional): The cookies set in the response. Defaults to None. - - redirect_url (Optional[str], optional): The URL if a redirection occurred. Defaults to None. - - response_time (Optional[float], optional): The time taken to receive the response. Defaults to None. - - timeout (Optional[float], optional): The request timeout. Defaults to None. - """ - self.status_code = status - self.text = text - self.is_json = is_json - self.content = content - self.headers = headers or {} - self.cookies = cookies or {} - self.redirect_url = redirect_url - self.response_time = response_time - self.timeout = timeout - self.ok = 200 <= status < 300 - - def raise_for_status(self): - """ - Raise an error if the response status code is not in the 2xx range. - """ - if not self.ok: - raise RequestError(f"Request failed with status code {self.status_code}") - - def json(self): - """ - Return the response content as JSON if it is JSON. - - Returns: - dict or list or None: A Python dictionary or list parsed from JSON if the response content is JSON, otherwise None. - """ - if self.is_json: - return json.loads(self.text) - else: - return None - - def get_redirects(self): - """ - Extracts unique site URLs from HTML elements within the
section. - - Returns: - list or None: A list of unique site URLs if found, otherwise None. - """ - - site_find = [] - - if self.text: - soup = BeautifulSoup(self.text, "html.parser") - - for links in soup.find("head").find_all('link'): - if links is not None: - parsed_url = urllib.parse.urlparse(links.get('href')) - site = parsed_url.scheme + "://" + parsed_url.netloc - - if site not in site_find: - site_find.append(site) - - if site_find: - return site_find - else: - return None - - -class ManageRequests: - """ - Class for managing HTTP requests. - """ - def __init__( - self, - url: str, - method: str = 'GET', - headers: Optional[Dict[str, str]] = None, - timeout: float = HTTP_TIMEOUT, - retries: int = HTTP_RETRIES, - params: Optional[Dict[str, str]] = None, - verify_ssl: bool = True, - auth: Optional[tuple] = None, - proxy: Optional[str] = None, - cookies: Optional[Dict[str, str]] = None, - json_data: Optional[Dict[str, Any]] = None, - redirection_handling: bool = True, - ): - """ - Initialize a ManageRequests object. - - Args: - - url (str): The URL to which the request will be sent. - - method (str, optional): The HTTP method to be used for the request. Defaults to 'GET'. - - headers (Optional[Dict[str, str]], optional): The request headers. Defaults to None. - - timeout (float, optional): The request timeout. Defaults to HTTP_TIMEOUT. - - retries (int, optional): The number of retries in case of request failure. Defaults to HTTP_RETRIES. - - params (Optional[Dict[str, str]], optional): The query parameters for the request. Defaults to None. - - verify_ssl (bool, optional): Indicates whether SSL certificate verification should be performed. Defaults to True. - - auth (Optional[tuple], optional): Tuple containing the username and password for basic authentication. Defaults to None. - - proxy (Optional[str], optional): The proxy URL. Defaults to None. - - cookies (Optional[Dict[str, str]], optional): The cookies to be included in the request. Defaults to None. - - redirection_handling (bool, optional): Indicates whether redirections should be followed. Defaults to True. - """ - self.url = url - self.method = method - self.headers = headers or {} - self.timeout = timeout - self.retries = retries - self.params = params - self.verify_ssl = verify_ssl - self.auth = auth - self.proxy = proxy - self.cookies = cookies - self.json_data = json_data - self.redirection_handling = redirection_handling - - def add_header(self, key: str, value: str) -> None: - """ - Add a header to the request. - """ - self.headers[key] = value - - def send(self) -> Response: - """ - Send the HTTP request. - """ - - start_time = time.time() - self.attempt = 0 - redirect_url = None - - while self.attempt < self.retries: - try: - req = self._build_request() - response = self._perform_request(req) - - return self._process_response(response, start_time, redirect_url) - - except (urllib.error.URLError, urllib.error.HTTPError) as e: - self._handle_error(e) - self.attempt += 1 - - def log_request(self): - """ - Constructs a log message based on the request parameters and logs it. - """ - log_message = "Request: (" - - if self.url: - log_message += f"'url': {self.url}, " - if self.headers: - log_message += f"'headers': {self.headers}, " - if self.cookies: - log_message += f"'cookies': {self.cookies}, " - if self.json_data: - log_message += f"'body': {json.dumps(self.json_data).encode('utf-8')}, " - - # Remove the trailing comma and add parentheses - log_message = log_message.rstrip(", ") + ")" - logging.info(log_message) - - def _build_request(self) -> urllib.request.Request: - """ - Build the urllib Request object. - """ - - # Make a copy of headers to avoid modifying the original dictionary - headers = self.headers.copy() - - # Construct the URL with query parameters if present - if self.params: - url = self.url + '?' + urllib.parse.urlencode(self.params) - else: - url = self.url - - # Create the initial Request object - req = urllib.request.Request(url, headers=headers, method=self.method) - - # Add JSON data if provided - if self.json_data: - req.add_header('Content-Type', 'application/json') - req.data = json.dumps(self.json_data).encode('utf-8') - - # Add authorization header if provided - if self.auth: - req.add_header('Authorization', 'Basic ' + base64.b64encode(f"{self.auth[0]}:{self.auth[1]}".encode()).decode()) - - # Add cookies if provided - if self.cookies: - cookie_str = '; '.join([f"{name}={value}" for name, value in self.cookies.items()]) - req.add_header('Cookie', cookie_str) - - # Add default user agent if not already present - if 'user-agent' not in headers: - default_user_agent = 'Mozilla/5.0' - req.add_header('user-agent', default_user_agent) - - - self.log_request() - return req - - def _perform_request(self, req: urllib.request.Request) -> urllib.response.addinfourl: - """ - Perform the HTTP request. - """ - if self.proxy: - proxy_handler = urllib.request.ProxyHandler({'http': self.proxy, 'https': self.proxy}) - opener = urllib.request.build_opener(proxy_handler) - urllib.request.install_opener(opener) - - if not self.verify_ssl: - - # Create SSL context - ssl_context = ssl.create_default_context() - ssl_context.check_hostname = False - ssl_context.verify_mode = ssl.CERT_NONE - - # Build the request with SSL context - response = urllib.request.urlopen(req, timeout=self.timeout, context=ssl_context) - - else: - response = urllib.request.urlopen(req, timeout=self.timeout, context=ssl.create_default_context()) - - return response - - def _process_response(self, response: urllib.response.addinfourl, start_time: float, redirect_url: Optional[str]) -> Response: - """ - Process the HTTP response. - """ - response_data = response.read() - content_type = response.headers.get('Content-Type', '').lower() - - if self.redirection_handling and response.status in (301, 302, 303, 307, 308): - location = response.headers.get('Location') - logging.info(f"Redirecting to: {location}") - redirect_url = location - self.url = location - return self.send() - - return self._build_response(response, response_data, start_time, redirect_url, content_type) - - def _build_response(self, response: urllib.response.addinfourl, response_data: bytes, start_time: float, redirect_url: Optional[str], content_type: str) -> Response: - """ - Build the Response object. - """ - response_time = time.time() - start_time - response_headers = dict(response.headers) - response_cookies = {} - - for cookie in response.headers.get_all('Set-Cookie', []): - cookie_parts = cookie.split(';') - cookie_name, cookie_value = cookie_parts[0].split('=', 1) # Only the first - response_cookies[cookie_name.strip()] = cookie_value.strip() - - return Response( - status=response.status, - text=response_data.decode('latin-1'), - is_json=("json" in content_type), - content=response_data, - headers=response_headers, - cookies=response_cookies, - redirect_url=redirect_url, - response_time=response_time, - timeout=self.timeout, - ) - - def _handle_error(self, e: Union[urllib.error.URLError, urllib.error.HTTPError]) -> None: - """ - Handle request error. - """ - if not HTTP_DISABLE_ERROR: - logging.error(f"Request failed for URL '{self.url}': {parse_http_error(str(e))}") - - if self.attempt < self.retries: - logging.error(f"Retry request for URL '{self.url}' (attempt {self.attempt}/{self.retries})") - time.sleep(HTTP_DELAY) - - else: - logging.error(f"Maximum retries reached for URL '{self.url}'") - raise RequestError(str(e)) - - -class ValidateRequest: - """ - Class for validating request inputs. - """ - @staticmethod - def validate_url(url: str) -> bool: - """Validate URL format.""" - - url_regex = re.compile( - r'^(?:http|ftp)s?://' # http:// or https:// - r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?|' # domain... - r'localhost|' # localhost... - r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', re.IGNORECASE) - return re.match(url_regex, url) is not None - - @staticmethod - def validate_headers(headers: Dict[str, str]) -> bool: - """Validate header values.""" - - for key, value in headers.items(): - if not isinstance(key, str) or not isinstance(value, str): - return False - return True - - -class ValidateResponse: - """ - Class for validating response data. - """ - @staticmethod - def is_valid_json(data: str) -> bool: - """Check if response data is a valid JSON.""" - - try: - json.loads(data) - return True - except ValueError: - return False - - -class SSLHandler: - """Class for handling SSL certificates.""" - @staticmethod - def load_certificate(custom_cert_path: str) -> None: - """Load custom SSL certificate.""" - ssl_context = ssl.create_default_context(cafile=custom_cert_path) - ssl_context.check_hostname = False - ssl_context.verify_mode = ssl.CERT_NONE - - -class KwargsRequest(TypedDict, total = False): - url: str - headers: Optional[Dict[str, str]] = None - timeout: float = HTTP_TIMEOUT - retries: int = HTTP_RETRIES - params: Optional[Dict[str, str]] = None - cookies: Optional[Dict[str, str]] = None - verify_ssl: bool = True - json_data: Optional[Dict[str, Any]] = None - - -class Request: - """ - Class for making HTTP requests. - """ - def __init__(self) -> None: - - # Ensure SSL certificate is set up - self.__setup_ssl_certificate__() - - def __setup_ssl_certificate__(self): - """ - Set up SSL certificate environment variables. - """ - try: - # Determine the Python executable - python_executable = sys.executable - logging.info("Python path: ", python_executable) - - # Check if certifi package is installed, install it if not - if subprocess.run([python_executable, "-c", "import certifi"], capture_output=True).returncode != 0: - subprocess.run(["pip", "install", "certifi"], check=True) - logging.info("Installed certifi package.") - - # Get path to SSL certificate - cert_path = subprocess.run([python_executable, "-c", "import certifi; print(certifi.where())"], capture_output=True, text=True, check=True).stdout.strip() - logging.info("Path cert: ", cert_path) - - if not cert_path: - raise ValueError("Unable to determine the path to the SSL certificate.") - - # Set SSL certificate environment variables - os.environ['SSL_CERT_FILE'] = cert_path - os.environ['REQUESTS_CA_BUNDLE'] = cert_path - - except subprocess.CalledProcessError as e: - raise ValueError(f"Error executing subprocess: {e}") from e - - def get(self, url: str, **kwargs: Unpack[KwargsRequest])-> 'Response': - """ - Send a GET request. - - Args: - - url (str): The URL to which the request will be sent. - **kwargs: Additional keyword arguments for the request. - - Returns: - Response: The response object. - """ - return self._send_request(url, 'GET', **kwargs) - - def post(self, url: str, **kwargs: Unpack[KwargsRequest]) -> 'Response': - """ - Send a POST request. - - Args: - - url (str): The URL to which the request will be sent. - **kwargs: Additional keyword arguments for the request. - - Returns: - Response: The response object. - """ - return self._send_request(url, 'POST', **kwargs) - - def head(self, url: str, **kwargs: Unpack[KwargsRequest]) -> 'Response': - """ - Send a HEAD request. - - Args: - - url (str): The URL to which the request will be sent. - **kwargs: Additional keyword arguments for the request. - - Returns: - Response: The response object. - """ - return self._send_request(url, 'HEAD', **kwargs) - - def _send_request(self, url: str, method: str, **kwargs: Unpack[KwargsRequest]) -> 'Response': - """Send an HTTP request.""" - if not ValidateRequest.validate_url(url): - raise ValueError("Invalid URL format") - - if 'headers' in kwargs and not ValidateRequest.validate_headers(kwargs['headers']): - raise ValueError("Invalid header values") - - return ManageRequests(url, method, **kwargs).send() - - -# Output -requests: Request = Request() \ No newline at end of file diff --git a/Src/Lib/UserAgent/__init__.py b/Src/Lib/UserAgent/__init__.py deleted file mode 100644 index b90fa6e..0000000 --- a/Src/Lib/UserAgent/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# 04.4.24 - -from .user_agent import ua \ No newline at end of file diff --git a/Src/Lib/UserAgent/user_agent.py b/Src/Lib/UserAgent/user_agent.py deleted file mode 100644 index b7c5b74..0000000 --- a/Src/Lib/UserAgent/user_agent.py +++ /dev/null @@ -1,112 +0,0 @@ -# 04.4.24 - -import logging -import re -import os -import random -import threading -import json -import tempfile - -from typing import Dict, List - - -# Internal libraries -from Src.Lib.Request import requests - - - -def get_browser_user_agents_online(browser: str) -> List[str]: - """ - Retrieve browser user agent strings from a website. - - Args: - - browser (str): The name of the browser (e.g., 'chrome', 'firefox', 'safari'). - - Returns: - List[str]: List of user agent strings for the specified browser. - """ - url = f"https://useragentstring.com/pages/{browser}/" - - try: - - # Make request and find all user agents - html = requests.get(url).text - browser_user_agents = re.findall(r"(.+?)", html, re.UNICODE) - return [ua for ua in browser_user_agents if "more" not in ua.lower()] - - except Exception as e: - logging.error(f"Failed to fetch user agents for '{browser}': {str(e)}") - return [] - - -def update_user_agents(browser_name: str, browser_user_agents: Dict[str, List[str]]) -> None: - """ - Update browser user agents dictionary with new requests. - - Args: - - browser_name (str): Name of the browser. - - browser_user_agents (Dict[str, List[str]]): Dictionary to store browser user agents. - """ - browser_user_agents[browser_name] = get_browser_user_agents_online(browser_name) - - -def create_or_update_user_agent_file() -> None: - """ - Create or update the user agent file with browser user agents. - """ - user_agent_file = os.path.join(tempfile.gettempdir(), 'fake_user_agent.json') - logging.info(f"Upload file: {user_agent_file}") - - if not os.path.exists(user_agent_file): - browser_user_agents: Dict[str, List[str]] = {} - threads = [] - - for browser_name in ['chrome', 'firefox', 'safari']: - t = threading.Thread(target=update_user_agents, args=(browser_name, browser_user_agents)) - threads.append(t) - t.start() - - for t in threads: - t.join() - - with open(user_agent_file, 'w') as f: - json.dump(browser_user_agents, f, indent=4) - logging.info(f"User agent file created at: {user_agent_file}") - - else: - logging.info("User agent file already exists.") - - -class UserAgentManager: - """ - Manager class to access browser user agents from a file. - """ - def __init__(self): - - # Get path to temp file where save all user agents - self.user_agent_file = os.path.join(tempfile.gettempdir(), 'fake_user_agent.json') - logging.info(f"Check file: {self.user_agent_file}") - - # If file dont exist, creaet it - if not os.path.exists(self.user_agent_file): - create_or_update_user_agent_file() - logging.info(f"Create file: {self.user_agent_file}") - - def get_random_user_agent(self, browser: str) -> str: - """ - Get a random user agent for the specified browser. - - Args: - browser (str): The name of the browser ('chrome', 'firefox', 'safari'). - - Returns: - Optional[str]: Random user agent string for the specified browser. - """ - with open(self.user_agent_file, 'r') as f: - browser_user_agents = json.load(f) - return random.choice(browser_user_agents.get(browser.lower(), [])) - - -# Output -ua: UserAgentManager = UserAgentManager() \ No newline at end of file diff --git a/Src/Upload/update.py b/Src/Upload/update.py index 82d7402..6e3e543 100644 --- a/Src/Upload/update.py +++ b/Src/Upload/update.py @@ -10,7 +10,7 @@ from Src.Util.console import console # External library -from Src.Lib.Request import requests +import requests # Variable @@ -62,5 +62,4 @@ def update(): console.print(f"[red]{repo_name} has been downloaded [yellow]{total_download_count} [red]times, but only [yellow]{percentual_stars}% [red]of users have starred it.\n\ [cyan]Help the repository grow today by leaving a [yellow]star [cyan]and [yellow]sharing [cyan]it with others online!") - time.sleep(1) console.print("\n") diff --git a/Src/Upload/version.py b/Src/Upload/version.py index bb50b0f..c69e058 100644 --- a/Src/Upload/version.py +++ b/Src/Upload/version.py @@ -1,5 +1,5 @@ -__title__ = 'Streaming_community' +__title__ = 'StreamingCommunity' __version__ = 'v1.1.0' -__author__ = 'Ghost6446' +__author__ = 'Lovi-0' __description__ = 'A command-line program to download film' __copyright__ = 'Copyright 2024' diff --git a/Src/Util/headers.py b/Src/Util/headers.py index ca76388..b84f4e9 100644 --- a/Src/Util/headers.py +++ b/Src/Util/headers.py @@ -3,8 +3,12 @@ import logging -# Internal utilities -from Src.Lib.UserAgent import ua +# External library +import fake_useragent + + +# Variable +useragent = fake_useragent.UserAgent() def get_headers() -> str: @@ -12,11 +16,8 @@ def get_headers() -> str: Generate a random user agent to use in HTTP requests. Returns: - str: A random user agent string. + - str: A random user agent string. """ # Get a random user agent string from the user agent rotator - random_headers = ua.get_random_user_agent("firefox") - - #logging.info(f"Use headers: {random_headers}") - return random_headers \ No newline at end of file + return useragent.firefox \ No newline at end of file diff --git a/Src/Util/logger.py b/Src/Util/logger.py index 216c314..0aac96b 100644 --- a/Src/Util/logger.py +++ b/Src/Util/logger.py @@ -53,7 +53,3 @@ class Logger: formatter = logging.Formatter('[%(filename)s:%(lineno)s - %(funcName)20s() ] %(asctime)s - %(levelname)s - %(message)s') file_handler.setFormatter(formatter) logging.getLogger('').addHandler(file_handler) - - -# Output -logger = Logger() \ No newline at end of file diff --git a/Src/Util/message.py b/Src/Util/message.py index 4a5706c..b20000d 100644 --- a/Src/Util/message.py +++ b/Src/Util/message.py @@ -41,7 +41,7 @@ def start_message(): if SHOW: console.print(f"[bold yellow]{msg}") - console.print(f"[magenta]Created by: Ghost6446\n") + console.print(f"[magenta]Created by: Lovi\n") row = "-" * console.width console.print(f"[yellow]{row} \n") \ No newline at end of file diff --git a/Src/Util/os.py b/Src/Util/os.py index f2ab1de..bc905a2 100644 --- a/Src/Util/os.py +++ b/Src/Util/os.py @@ -16,6 +16,7 @@ import platform import importlib import subprocess import contextlib +import urllib.request import importlib.metadata from typing import List @@ -403,6 +404,19 @@ def convert_to_hex(bytes_data: bytes) -> str: # --> OS GET SUMMARY +def check_internet(): + while True: + try: + # Attempt to open a connection to a website to check for internet connection + urllib.request.urlopen("http://www.google.com", timeout=1) + console.log("[bold green]Internet is available![/bold green]") + break + + except urllib.error.URLError: + console.log("[bold red]Internet is not available. Waiting...[/bold red]") + time.sleep(5) + print() + def get_executable_version(command): try: version_output = subprocess.check_output(command, stderr=subprocess.STDOUT).decode().split('\n')[0] @@ -419,7 +433,8 @@ def get_library_version(lib_name): return f"{lib_name}-not installed" def get_system_summary(): - + + check_internet() console.print("[bold blue]System Summary[/bold blue][white]:") # Python version and platform @@ -442,7 +457,7 @@ def get_system_summary(): logging.info(f"Exe versions: ffmpeg {ffmpeg_version}, ffprobe {ffprobe_version}") # Optional libraries versions - optional_libraries = ['bs4', 'certifi', 'tqdm', 'rich', 'unidecode'] + optional_libraries = [line.strip() for line in open('requirements.txt', 'r', encoding='utf-8-sig')] optional_libs_versions = [get_library_version(lib) for lib in optional_libraries] console.print(f"[cyan]Libraries[white]: [bold red]{', '.join(optional_libs_versions)}[/bold red]\n") diff --git a/Test/data/TLD/creation.py b/Test/data/TLD/creation.py index 2116efa..d60341f 100644 --- a/Test/data/TLD/creation.py +++ b/Test/data/TLD/creation.py @@ -5,9 +5,6 @@ import json from bs4 import BeautifulSoup -# https://onshopify.com/domains/ - - # URL of the webpage containing the table url = 'https://icannwiki.org/New_gTLD_Generic_Applications' @@ -84,5 +81,6 @@ def main(): with open('data.json', 'w') as json_file: json.dump(data, json_file) + if __name__ == '__main__': main() \ No newline at end of file diff --git a/Test/data/m3u8/index_audio.m3u8 b/Test/data/m3u8/index_audio.m3u8 index 0928d49..d59ac13 100644 --- a/Test/data/m3u8/index_audio.m3u8 +++ b/Test/data/m3u8/index_audio.m3u8 @@ -4,10 +4,667 @@ #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-KEY:METHOD=AES-128,URI="/storage/enc.key",IV=0x43A6D967D5C17290D98322F5C8F6660B #EXTINF:4.010667, -https://sc-u10-01.scws-content.net/hls/40/6/58/6585b748-cef6-4048-a9ab-c01b9366c3b9/audio/ita/0000-0100.ts +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0000-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 #EXTINF:3.989333, -https://sc-u10-01.scws-content.net/hls/40/6/58/6585b748-cef6-4048-a9ab-c01b9366c3b9/audio/ita/0001-0100.ts +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0001-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 #EXTINF:4.010667, -https://sc-u10-01.scws-content.net/hls/40/6/58/6585b748-cef6-4048-a9ab-c01b9366c3b9/audio/ita/0002-0075.ts +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0002-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 #EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0003-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0004-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0005-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0006-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0007-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0008-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0009-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0010-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0011-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0012-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0013-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0014-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0015-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0016-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0017-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0018-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0019-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0020-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0021-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0022-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0023-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0024-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0025-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0026-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0027-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0028-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0029-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0030-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0031-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0032-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0033-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0034-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0035-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0036-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0037-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0038-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0039-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0040-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0041-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0042-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0043-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0044-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0045-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0046-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0047-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0048-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0049-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0050-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0051-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0052-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0053-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0054-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0055-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0056-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0057-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0058-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0059-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0060-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0061-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0062-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0063-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0064-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0065-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0066-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0067-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0068-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0069-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0070-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0071-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0072-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0073-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0074-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0075-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0076-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0077-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0078-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0079-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0080-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0081-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0082-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0083-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0084-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0085-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0086-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0087-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0088-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0089-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0090-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0091-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0092-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0093-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0094-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0095-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0096-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0097-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0098-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0099-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0100-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0101-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0102-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0103-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0104-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0105-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0106-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0107-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0108-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0109-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0110-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0111-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0112-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0113-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0114-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0115-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0116-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0117-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0118-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0119-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0120-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0121-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0122-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0123-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0124-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0125-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0126-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0127-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0128-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0129-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0130-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0131-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0132-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0133-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0134-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0135-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0136-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0137-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0138-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0139-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0140-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0141-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0142-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0143-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0144-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0145-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0146-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0147-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0148-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0149-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0150-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0151-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0152-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0153-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0154-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0155-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0156-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0157-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0158-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0159-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0160-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0161-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0162-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0163-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0164-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0165-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0166-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0167-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0168-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0169-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0170-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0171-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0172-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0173-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0174-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0175-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0176-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0177-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0178-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0179-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0180-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0181-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0182-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0183-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0184-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0185-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0186-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0187-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0188-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0189-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0190-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0191-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0192-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0193-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0194-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0195-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0196-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0197-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0198-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0199-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0200-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0201-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0202-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0203-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0204-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0205-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0206-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0207-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0208-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0209-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0210-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0211-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0212-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0213-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0214-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0215-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0216-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0217-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0218-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0219-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0220-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0221-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0222-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0223-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0224-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0225-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0226-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0227-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0228-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0229-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0230-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0231-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0232-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0233-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0234-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0235-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0236-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0237-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0238-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0239-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0240-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0241-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0242-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0243-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0244-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0245-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0246-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0247-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0248-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0249-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0250-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0251-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0252-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0253-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0254-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0255-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0256-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0257-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0258-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0259-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0260-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0261-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0262-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0263-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0264-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0265-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0266-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0267-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0268-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0269-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0270-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0271-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0272-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0273-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0274-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0275-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0276-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0277-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0278-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0279-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0280-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0281-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0282-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0283-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0284-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0285-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0286-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0287-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0288-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0289-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0290-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0291-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0292-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0293-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0294-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0295-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0296-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0297-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0298-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0299-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0300-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0301-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0302-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0303-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0304-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0305-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0306-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0307-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0308-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0309-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0310-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0311-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0312-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0313-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0314-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0315-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0316-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0317-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0318-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0319-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0320-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0321-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0322-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0323-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0324-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0325-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0326-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0327-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0328-0100.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:3.989333, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0329-0075.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:4.010667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0330-0025.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 +#EXTINF:0.266667, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/audio/ita/0331-0025.ts?token=r1bvf1Wwun-McFrLkW1jyQ&expires=1722499729 #EXT-X-ENDLIST \ No newline at end of file diff --git a/Test/data/m3u8/index_video.m3u8 b/Test/data/m3u8/index_video.m3u8 index 49b39ec..4274422 100644 --- a/Test/data/m3u8/index_video.m3u8 +++ b/Test/data/m3u8/index_video.m3u8 @@ -4,10 +4,667 @@ #EXT-X-PLAYLIST-TYPE:VOD #EXT-X-KEY:METHOD=AES-128,URI="/storage/enc.key",IV=0x43A6D967D5C17290D98322F5C8F6660B #EXTINF:4, -https://sc-u10-01.scws-content.net/hls/40/6/58/6585b748-cef6-4048-a9ab-c01b9366c3b9/video/720p/0000-0250.ts +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0000-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 #EXTINF:4, -https://sc-u10-01.scws-content.net/hls/40/6/58/6585b748-cef6-4048-a9ab-c01b9366c3b9/video/720p/0001-0250.ts +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0001-0250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 #EXTINF:4, -https://sc-u10-01.scws-content.net/hls/40/6/58/6585b748-cef6-4048-a9ab-c01b9366c3b9/video/720p/0002-0075.ts +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0002-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 #EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0003-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0004-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0005-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0006-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0007-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0008-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0009-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0010-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0011-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0012-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0013-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0014-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0015-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0016-1750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0017-2000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0018-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0019-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0020-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0021-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0022-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0023-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0024-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0025-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0026-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0027-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0028-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0029-2000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0030-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0031-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0032-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0033-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0034-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0035-3000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0036-2000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0037-2000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0038-2000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0039-2000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0040-2500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0041-1750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0042-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0043-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0044-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0045-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0046-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0047-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0048-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0049-1750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0050-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0051-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0052-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0053-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0054-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0055-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0056-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0057-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0058-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0059-0250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0060-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0061-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0062-2500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0063-2000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0064-2500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0065-2000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0066-1750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0067-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0068-1750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0069-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0070-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0071-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0072-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0073-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0074-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0075-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0076-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0077-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0078-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0079-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0080-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0081-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0082-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0083-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0084-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0085-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0086-1750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0087-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0088-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0089-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0090-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0091-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0092-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0093-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0094-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0095-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0096-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0097-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0098-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0099-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0100-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0101-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0102-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0103-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0104-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0105-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0106-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0107-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0108-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0109-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0110-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0111-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0112-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0113-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0114-2000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0115-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0116-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0117-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0118-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0119-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0120-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0121-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0122-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0123-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0124-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0125-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0126-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0127-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0128-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0129-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0130-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0131-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0132-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0133-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0134-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0135-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0136-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0137-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0138-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0139-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0140-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0141-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0142-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0143-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0144-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0145-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0146-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0147-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0148-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0149-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0150-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0151-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0152-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0153-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0154-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0155-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0156-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0157-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0158-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0159-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0160-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0161-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0162-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0163-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0164-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0165-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0166-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0167-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0168-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0169-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0170-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0171-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0172-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0173-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0174-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0175-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0176-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0177-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0178-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0179-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0180-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0181-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0182-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0183-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0184-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0185-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0186-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0187-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0188-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0189-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0190-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0191-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0192-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0193-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0194-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0195-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0196-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0197-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0198-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0199-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0200-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0201-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0202-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0203-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0204-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0205-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0206-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0207-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0208-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0209-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0210-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0211-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0212-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0213-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0214-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0215-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0216-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0217-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0218-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0219-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0220-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0221-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0222-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0223-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0224-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0225-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0226-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0227-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0228-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0229-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0230-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0231-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0232-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0233-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0234-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0235-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0236-1750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0237-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0238-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0239-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0240-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0241-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0242-1750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0243-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0244-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0245-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0246-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0247-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0248-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0249-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0250-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0251-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0252-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0253-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0254-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0255-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0256-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0257-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0258-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0259-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0260-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0261-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0262-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0263-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0264-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0265-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0266-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0267-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0268-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0269-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0270-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0271-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0272-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0273-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0274-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0275-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0276-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0277-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0278-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0279-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0280-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0281-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0282-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0283-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0284-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0285-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0286-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0287-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0288-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0289-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0290-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0291-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0292-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0293-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0294-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0295-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0296-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0297-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0298-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0299-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0300-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0301-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0302-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0303-1750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0304-1500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0305-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0306-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0307-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0308-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0309-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0310-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0311-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0312-1750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0313-0750.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0314-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0315-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0316-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0317-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0318-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0319-1000.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0320-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0321-1250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0322-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0323-0075.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0324-0125.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0325-0250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0326-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0327-0500.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0328-0250.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0329-0100.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:4, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0330-0100.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 +#EXTINF:0.25, +https://sc-u2-01.scws-content.net/hls/190/4/13/4130abf2-c2e7-4b66-8907-f11b4ee38a27/video/1080p/0331-0050.ts?token=Yce8pl2-m8bk6uQvq7W0fg&expires=1722499729 #EXT-X-ENDLIST \ No newline at end of file diff --git a/Test/data/m3u8/playlist.m3u8 b/Test/data/m3u8/playlist.m3u8 index f047f01..5fd46ff 100644 --- a/Test/data/m3u8/playlist.m3u8 +++ b/Test/data/m3u8/playlist.m3u8 @@ -1,11 +1,12 @@ #EXTM3U -#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="Italian",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="ita",URI="https://vixcloud.co/playlist/213349?type=audio&rendition=ita&token=J0FBqnixXmTN24xdMdxAVg&expires=1720013276" - -#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English [CC]",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO,LANGUAGE="eng",URI="https://vixcloud.co/playlist/213349?type=subtitle&rendition=3-eng&token=J0FBqnixXmTN24xdMdxAVg&expires=1720013276" -#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Czech",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO,LANGUAGE="cze",URI="https://vixcloud.co/playlist/213349?type=subtitle&rendition=4-cze&token=J0FBqnixXmTN24xdMdxAVg&expires=1720013276" - +#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="Italian",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="ita",URI="https://vixcloud.co/playlist/175761?type=audio&rendition=ita&token=AfHdAGc26qqpBDVFAdKJCQ&expires=1722501194&edge=sc-u2-01" +#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="English",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO,LANGUAGE="eng",URI="https://vixcloud.co/playlist/175761?type=audio&rendition=eng&token=AfHdAGc26qqpBDVFAdKJCQ&expires=1722501194&edge=sc-u2-01" +#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="English",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO,LANGUAGE="eng",URI="https://vixcloud.co/playlist/175761?type=subtitle&rendition=eng&token=AfHdAGc26qqpBDVFAdKJCQ&expires=1722501194&edge=sc-u2-01" +#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Italian [Forced]",DEFAULT=YES,AUTOSELECT=YES,FORCED=NO,LANGUAGE="forced-ita",URI="https://vixcloud.co/playlist/175761?type=subtitle&rendition=forced-ita&token=AfHdAGc26qqpBDVFAdKJCQ&expires=1722501194&edge=sc-u2-01" +#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Italian",DEFAULT=NO,AUTOSELECT=NO,FORCED=NO,LANGUAGE="ita",URI="https://vixcloud.co/playlist/175761?type=subtitle&rendition=ita&token=AfHdAGc26qqpBDVFAdKJCQ&expires=1722501194&edge=sc-u2-01" #EXT-X-STREAM-INF:BANDWIDTH=1200000,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=854x480,AUDIO="audio",SUBTITLES="subs" -https://vixcloud.co/playlist/213349?type=video&rendition=480p&token=WcQHF0VYTJnnWXRVzGyI4A&expires=1720013276 - +https://vixcloud.co/playlist/175761?type=video&rendition=480p&token=VQk6xhvJbSGMsktylrOqLg&expires=1722501194&edge=sc-u2-01 #EXT-X-STREAM-INF:BANDWIDTH=2150000,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1280x720,AUDIO="audio",SUBTITLES="subs" -https://vixcloud.co/playlist/213349?type=video&rendition=720p&token=pYMwBEGivMnsWlzTJodYQw&expires=1720013276 \ No newline at end of file +https://vixcloud.co/playlist/175761?type=video&rendition=720p&token=ecGWDJYeeYgEJTP_fjDQKQ&expires=1722501194&edge=sc-u2-01 +#EXT-X-STREAM-INF:BANDWIDTH=4500000,CODECS="avc1.640028,mp4a.40.2",RESOLUTION=1920x1080,AUDIO="audio",SUBTITLES="subs" +https://vixcloud.co/playlist/175761?type=video&rendition=1080p&token=AhO8JTM1VfOMfrZFpEfjUw&expires=1722501194&edge=sc-u2-01 \ No newline at end of file diff --git a/Test/data/playlist_info.json b/Test/data/playlist_info.json deleted file mode 100644 index 26d3f2b..0000000 --- a/Test/data/playlist_info.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "2024-5": { - "token": "csVhbgxqG_z_tjvJiy1IiA", - "token360p": "", - "token480p": "S7MTy30iN4BcxC-sXt0fOw", - "token720p": "fW_SEvaLezh5bD_iKDxcpw", - "token1080p": "HSuRzJwwFYR55KhtOAC85Q", - "expires": "1720963565" - } -} \ No newline at end of file diff --git a/Test/t_get_server_ip_sc.py b/Test/t_get_server_ip_sc.py new file mode 100644 index 0000000..d89ebac --- /dev/null +++ b/Test/t_get_server_ip_sc.py @@ -0,0 +1,86 @@ +# 13.05.24 + +import socket +import logging +import urllib3 +from urllib.parse import urlparse, urlunparse + + +import warnings +warnings.filterwarnings("ignore", category=urllib3.exceptions.InsecureRequestWarning) + + +# Variable +url_test = "https://sc-b1-18.scws-content.net/hls/100/b/d3/bd3a430d-0a13-4bec-8fcc-ea41af183555/audio/ita/0010-0100.ts?token=CiEPTIyvEoTkGk3szgDu9g&expires=1722801022" + + +def get_ip_from_url(url): + """ + Extracts the IP address from a given URL. + + Args: + url (str): The URL from which to extract the IP address. + + Returns: + str or None: The extracted IP address if successful, otherwise None. + """ + try: + parsed_url = urlparse(url) + if not parsed_url.hostname: + logging.error(f"Invalid URL: {url}") + return None + + ip_address = socket.gethostbyname(parsed_url.hostname) + return ip_address + + except Exception as e: + logging.error(f"Error: {e}") + return None + +def replace_random_number(url, random_number): + """ + Replaces a random number in the URL. + + Args: + url (str): The URL in which to replace the random number. + random_number (int): The random number to replace in the URL. + + Returns: + str: The modified URL with the random number replaced. + """ + parsed_url = urlparse(url) + parts = parsed_url.netloc.split('.') + prefix = None + + for i, part in enumerate(parts): + if '-' in part and part.startswith("sc-"): + prefix = part.split('-')[0] + '-' + part.split('-')[1] + '-' + new_part = prefix + f"{random_number:02d}" + parts[i] = new_part + break + + new_netloc = '.'.join(parts) + return urlunparse((parsed_url.scheme, new_netloc, parsed_url.path, parsed_url.params, parsed_url.query, parsed_url.fragment)) + +def main(): + """ + Main function to test the URL manipulation. + """ + valid_ip = [] + + for i in range(1, 36): + try: + ip = get_ip_from_url(replace_random_number(url_test, i)) + + if ip: + valid_ip.append(ip) + + except Exception as e: + logging.error(f"Error: {e}") + pass + + print(f"Valid IP addresses: {sorted(valid_ip, reverse=True)}") + + +if __name__ == '__main__': + main() diff --git a/Test/t_m3u8_parser.py b/Test/t_m3u8_parser.py index 88bb31f..c6468e5 100644 --- a/Test/t_m3u8_parser.py +++ b/Test/t_m3u8_parser.py @@ -23,23 +23,15 @@ from Src.Lib.M3U8 import M3U8_Parser # Test data obj_m3u8_parser = M3U8_Parser() base_path_file = os.path.join('Test', 'data', 'm3u8') + + +# Collect all index +index_video = read_file(os.path.join(base_path_file, "index_video.m3u8")) index_audio = read_file(os.path.join(base_path_file, "index_audio.m3u8")) index_subtitle = read_file(os.path.join(base_path_file,"index_subtitle.m3u8")) -index_video = read_file(os.path.join(base_path_file, "index_video.m3u8")) playlist = read_file(os.path.join(base_path_file, "playlist.m3u8")) -print("AUDIO: ") -print(M3U8(index_audio).data) -print() - -print("SUBTITLE: ") -print(M3U8(index_subtitle).data) -print() - -print("INDEX: ") -print(M3U8(index_video).data) -print() - -print("PLAYLIST: ") -print(M3U8(playlist).data) +# Test class +obj_m3u8_parser.parse_data("http", index_audio) +print(f"Duration : {obj_m3u8_parser.get_duration()}") diff --git a/config.json b/config.json index 2603713..4cfd9e6 100644 --- a/config.json +++ b/config.json @@ -10,7 +10,6 @@ "not_close": false }, "REQUESTS": { - "disable_error": false, "timeout": 10, "max_retry": 3, "verify_ssl": false, @@ -18,7 +17,7 @@ "segments": { "user-agent": ""} }, "M3U8_DOWNLOAD": { - "tdqm_workers": 30, + "tdqm_workers": 4, "tqdm_use_large_bar": true, "download_video": true, "download_audio": true, @@ -32,7 +31,10 @@ }, "M3U8_CONVERSION": { "use_codec": false, - "use_gpu": false, + "use_vcodec": true, + "use_acodec": true, + "use_bitrate": true, + "use_gpu": true, "default_preset": "ultrafast", "check_output_after_ffmpeg": false }, diff --git a/requirements.txt b/requirements.txt index 21218f8..d9a07e1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,7 @@ -bs4 +requests +bs4 +certifi tqdm rich -unidecode \ No newline at end of file +unidecode +fake-useragent \ No newline at end of file diff --git a/run.py b/run.py index 762982a..e99a551 100644 --- a/run.py +++ b/run.py @@ -27,34 +27,6 @@ from Src.Api.Altadefinizione import main_film as altadefinizione_film CLOSE_CONSOLE = config_manager.get_bool('DEFAULT', 'not_close') -def initialize(): - """ - Initialize the application. - Checks Python version, removes temporary folder, and displays start message. - """ - - # Set terminal size for win 7 - if platform.system() == "Windows" and "7" in platform.version(): - os.system('mode 120, 40') - - - # Check python version - if sys.version_info < (3, 7): - console.log("[red]Install python version > 3.7.16") - sys.exit(0) - - - # Removing temporary folder - start_message() - - - # Attempting GitHub update - """try: - git_update() - except Exception as e: - console.print(f"[blue]Req github [white]=> [red]Failed: {e}")""" - - def run_function(func: Callable[..., None], close_console: bool = False) -> None: """ Run a given function indefinitely or once, depending on the value of close_console. @@ -63,9 +35,6 @@ def run_function(func: Callable[..., None], close_console: bool = False) -> None func (Callable[..., None]): The function to run. close_console (bool, optional): Whether to close the console after running the function once. Defaults to False. """ - - initialize() - if close_console: while 1: func() @@ -73,11 +42,40 @@ def run_function(func: Callable[..., None], close_console: bool = False) -> None func() -def main(): - +def initialize(): + """ + Initialize the application. + Checks Python version, removes temporary folder, and displays start message. + """ + + start_message() + + # Create logger log_not = Logger() + + # Get system info get_system_summary() + # Set terminal size for win 7 + if platform.system() == "Windows" and "7" in platform.version(): + os.system('mode 120, 40') + + # Check python version + if sys.version_info < (3, 7): + console.log("[red]Install python version > 3.7.16") + sys.exit(0) + + # Attempting GitHub update + try: + git_update() + except Exception as e: + console.print(f"[blue]Req github [white]=> [red]Failed: {e}") + + +def main(): + + initialize() + # Parse command line arguments parser = argparse.ArgumentParser(description='Script to download film and series from the internet.') parser.add_argument('-sa', '--streaming_anime', action='store_true', help='Check into anime category')