mirror of
https://github.com/Arrowar/StreamingCommunity.git
synced 2025-06-07 12:05:35 +00:00
Merge branch 'Lovi-0:main' into main
This commit is contained in:
commit
5c458df894
@ -1,15 +1,12 @@
|
|||||||
# 26.05.24
|
# 26.05.24
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import os
|
|
||||||
import sys
|
import sys
|
||||||
import time
|
|
||||||
import logging
|
import logging
|
||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
# External libraries
|
# External libraries
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ import logging
|
|||||||
|
|
||||||
|
|
||||||
# External libraries
|
# External libraries
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
from unidecode import unidecode
|
from unidecode import unidecode
|
||||||
|
|
||||||
|
@ -5,8 +5,8 @@ import threading
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|
||||||
# Internal libraries
|
# External libraries
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
|
|
||||||
|
|
||||||
# Internal utilities
|
# Internal utilities
|
||||||
|
@ -1,16 +1,18 @@
|
|||||||
# 01.03.24
|
# 01.03.24
|
||||||
|
|
||||||
|
import sys
|
||||||
import logging
|
import logging
|
||||||
from urllib.parse import urljoin, urlparse, parse_qs, urlencode, urlunparse
|
from urllib.parse import urljoin, urlparse, parse_qs, urlencode, urlunparse
|
||||||
|
|
||||||
|
|
||||||
# External libraries
|
# External libraries
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
|
|
||||||
# Internal utilities
|
# Internal utilities
|
||||||
from Src.Util.headers import get_headers
|
from Src.Util.headers import get_headers
|
||||||
|
from Src.Util.console import console
|
||||||
from Src.Util._jsonConfig import config_manager
|
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
|
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
|
final_url = urlunparse(new_url) # Construct the final URL from the modified parts
|
||||||
|
|
||||||
return final_url
|
return final_url
|
||||||
|
@ -2,4 +2,4 @@
|
|||||||
|
|
||||||
ANIME_FOLDER = "animeunity"
|
ANIME_FOLDER = "animeunity"
|
||||||
SERIES_FOLDER= "Serie"
|
SERIES_FOLDER= "Serie"
|
||||||
MOVIE_FOLDER = "Movie"
|
MOVIE_FOLDER = "Movie"
|
||||||
|
@ -5,7 +5,7 @@ import logging
|
|||||||
|
|
||||||
|
|
||||||
# External libraries
|
# External libraries
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
from unidecode import unidecode
|
from unidecode import unidecode
|
||||||
|
|
||||||
|
@ -5,8 +5,11 @@ import threading
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|
||||||
|
# External library
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
# Internal utilities
|
# Internal utilities
|
||||||
from Src.Lib.Request import requests
|
|
||||||
from Src.Lib.Google import search as google_search
|
from Src.Lib.Google import search as google_search
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ from urllib.parse import urljoin, urlparse, parse_qs, urlencode, urlunparse
|
|||||||
|
|
||||||
|
|
||||||
# External libraries
|
# External libraries
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
|
|
||||||
@ -202,7 +202,6 @@ class VideoSource:
|
|||||||
logging.error(f"Error getting content: {e}")
|
logging.error(f"Error getting content: {e}")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
|
|
||||||
def get_playlist(self) -> str:
|
def get_playlist(self) -> str:
|
||||||
"""
|
"""
|
||||||
Get playlist.
|
Get playlist.
|
||||||
@ -239,5 +238,5 @@ class VideoSource:
|
|||||||
new_query = urlencode(final_params) # Encode final_params into a query string
|
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
|
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
|
final_url = urlunparse(new_url) # Construct the final URL from the modified parts
|
||||||
|
|
||||||
return final_url
|
return final_url
|
||||||
|
@ -4,4 +4,4 @@ STREAMING_FOLDER = "streamingcommunity"
|
|||||||
MOVIE_FOLDER = "Movie"
|
MOVIE_FOLDER = "Movie"
|
||||||
SERIES_FOLDER = "Serie"
|
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']
|
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']
|
@ -18,7 +18,7 @@ from .Core.Vix_player.player import VideoSource
|
|||||||
|
|
||||||
# Config
|
# Config
|
||||||
ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
|
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
|
# Variable
|
||||||
@ -59,4 +59,4 @@ def download_film(id_film: str, title_name: str, domain: str):
|
|||||||
Downloader(
|
Downloader(
|
||||||
m3u8_playlist = master_playlist,
|
m3u8_playlist = master_playlist,
|
||||||
output_filename = os.path.join(mp4_path, mp4_format)
|
output_filename = os.path.join(mp4_path, mp4_format)
|
||||||
).start(SERVER_IP)
|
).start(STATIC_IP_SERVER)
|
@ -20,7 +20,7 @@ from .Core.Util import manage_selection, map_episode_title
|
|||||||
|
|
||||||
# Config
|
# Config
|
||||||
ROOT_PATH = config_manager.get('DEFAULT', 'root_path')
|
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
|
# Variable
|
||||||
@ -96,7 +96,7 @@ def donwload_video(tv_name: str, index_season_selected: int, index_episode_selec
|
|||||||
Downloader(
|
Downloader(
|
||||||
m3u8_playlist = master_playlist,
|
m3u8_playlist = master_playlist,
|
||||||
output_filename = os.path.join(mp4_path, mp4_name)
|
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:
|
def donwload_episode(tv_name: str, index_season_selected: int, donwload_all: bool = False) -> None:
|
||||||
|
@ -8,12 +8,12 @@ from typing import Tuple
|
|||||||
|
|
||||||
|
|
||||||
# External libraries
|
# External libraries
|
||||||
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
from unidecode import unidecode
|
from unidecode import unidecode
|
||||||
|
|
||||||
|
|
||||||
# Internal utilities
|
# Internal utilities
|
||||||
from Src.Lib.Request import requests
|
|
||||||
from Src.Util.headers import get_headers
|
from Src.Util.headers import get_headers
|
||||||
from Src.Util._jsonConfig import config_manager
|
from Src.Util._jsonConfig import config_manager
|
||||||
from Src.Util.console import console
|
from Src.Util.console import console
|
||||||
|
@ -40,6 +40,10 @@ def capture_output(process: subprocess.Popen, description: str) -> None:
|
|||||||
|
|
||||||
logging.info(f"FFMPEG line: {line}")
|
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
|
# Check if termination is requested
|
||||||
if terminate_flag.is_set():
|
if terminate_flag.is_set():
|
||||||
break
|
break
|
||||||
|
@ -19,14 +19,18 @@ except: pass
|
|||||||
from Src.Util._jsonConfig import config_manager
|
from Src.Util._jsonConfig import config_manager
|
||||||
from Src.Util.os import check_file_existence, suppress_output
|
from Src.Util.os import check_file_existence, suppress_output
|
||||||
from Src.Util.console import console
|
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 .capture import capture_ffmpeg_real_time
|
||||||
|
from ..M3U8.parser import M3U8_Codec
|
||||||
|
|
||||||
|
|
||||||
# Config
|
# Config
|
||||||
DEBUG_MODE = config_manager.get_bool("DEFAULT", "debug")
|
DEBUG_MODE = config_manager.get_bool("DEFAULT", "debug")
|
||||||
DEBUG_FFMPEG = "debug" if DEBUG_MODE else "error"
|
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")
|
USE_GPU = config_manager.get_bool("M3U8_CONVERSION", "use_gpu")
|
||||||
FFMPEG_DEFAULT_PRESET = config_manager.get("M3U8_CONVERSION", "default_preset")
|
FFMPEG_DEFAULT_PRESET = config_manager.get("M3U8_CONVERSION", "default_preset")
|
||||||
CHECK_OUTPUT_CONVERSION = config_manager.get_bool("M3U8_CONVERSION", "check_output_after_ffmpeg")
|
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)
|
# --> 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
|
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.")
|
logging.error("Missing input video for ffmpeg conversion.")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
# Start command
|
# Start command
|
||||||
ffmpeg_cmd = ['ffmpeg']
|
ffmpeg_cmd = ['ffmpeg']
|
||||||
|
|
||||||
# Enabled the use of gpu
|
# 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
|
# Add mpegts to force to detect input file as ts file
|
||||||
if need_to_force_to_ts(video_path):
|
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'])
|
ffmpeg_cmd.extend(['-f', 'mpegts'])
|
||||||
vcodec = "libx264"
|
vcodec = "libx264"
|
||||||
|
|
||||||
|
|
||||||
# Insert input video path
|
# Insert input video path
|
||||||
ffmpeg_cmd.extend(['-i', video_path])
|
ffmpeg_cmd.extend(['-i', video_path])
|
||||||
|
|
||||||
# Add output args
|
# Add output args
|
||||||
if USE_CODECS:
|
if USE_CODEC:
|
||||||
if vcodec: ffmpeg_cmd.extend(['-c:v', vcodec])
|
if USE_VCODEC:
|
||||||
if acodec: ffmpeg_cmd.extend(['-c:a', acodec])
|
if codec.video_codec_name:
|
||||||
if bitrate: ffmpeg_cmd.extend(['-b:a', str(bitrate)])
|
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:
|
else:
|
||||||
ffmpeg_cmd.extend(['-c', 'copy'])
|
ffmpeg_cmd.extend(['-c', 'copy'])
|
||||||
|
|
||||||
@ -312,12 +331,10 @@ def join_video(video_path: str, out_path: str, vcodec: str = None, acodec: str =
|
|||||||
else:
|
else:
|
||||||
ffmpeg_cmd.extend(['-preset', 'fast'])
|
ffmpeg_cmd.extend(['-preset', 'fast'])
|
||||||
|
|
||||||
|
|
||||||
# Overwrite
|
# Overwrite
|
||||||
ffmpeg_cmd += [out_path, "-y"]
|
ffmpeg_cmd += [out_path, "-y"]
|
||||||
logging.info(f"FFmpeg command: {ffmpeg_cmd}")
|
logging.info(f"FFmpeg command: {ffmpeg_cmd}")
|
||||||
|
|
||||||
|
|
||||||
# Run join
|
# Run join
|
||||||
if DEBUG_MODE:
|
if DEBUG_MODE:
|
||||||
subprocess.run(ffmpeg_cmd, check=True)
|
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")
|
capture_ffmpeg_real_time(ffmpeg_cmd, "[cyan]Join video")
|
||||||
print()
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Check file output
|
# Check file output
|
||||||
if CHECK_OUTPUT_CONVERSION:
|
if CHECK_OUTPUT_CONVERSION:
|
||||||
console.log("[red]Check output ffmpeg")
|
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)
|
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.
|
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.")
|
logging.error("Missing input video for ffmpeg conversion.")
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
video_audio_same_duration = check_duration_v_a(video_path, audio_tracks[0].get('path'))
|
||||||
|
|
||||||
# Start command
|
# 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
|
# Add audio tracks as input
|
||||||
for i, audio_track in enumerate(audio_tracks):
|
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:
|
else:
|
||||||
logging.error(f"Skip audio join: {audio_track.get('path')} dont exist")
|
logging.error(f"Skip audio join: {audio_track.get('path')} dont exist")
|
||||||
|
|
||||||
|
|
||||||
# Map the video and audio streams
|
# Map the video and audio streams
|
||||||
ffmpeg_cmd.append('-map')
|
ffmpeg_cmd.append('-map')
|
||||||
ffmpeg_cmd.append('0:v') # Map video stream from the first input (video_path)
|
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('-map')
|
||||||
ffmpeg_cmd.append(f'{i}:a') # Map audio streams from subsequent inputs
|
ffmpeg_cmd.append(f'{i}:a') # Map audio streams from subsequent inputs
|
||||||
|
|
||||||
|
|
||||||
# Add output args
|
# Add output args
|
||||||
if USE_CODECS:
|
if USE_CODEC:
|
||||||
ffmpeg_cmd.extend(['-c:v', 'copy', '-c:a', 'copy'])
|
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:
|
else:
|
||||||
ffmpeg_cmd.extend(['-c', 'copy'])
|
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
|
# Overwrite
|
||||||
ffmpeg_cmd += [out_path, "-y"]
|
ffmpeg_cmd += [out_path, "-y"]
|
||||||
logging.info(f"FFmpeg command: {ffmpeg_cmd}")
|
logging.info(f"FFmpeg command: {ffmpeg_cmd}")
|
||||||
|
|
||||||
|
|
||||||
# Run join
|
# Run join
|
||||||
if DEBUG_MODE:
|
if DEBUG_MODE:
|
||||||
subprocess.run(ffmpeg_cmd, check=True)
|
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")
|
capture_ffmpeg_real_time(ffmpeg_cmd, "[cyan]Join audio")
|
||||||
print()
|
print()
|
||||||
|
|
||||||
|
|
||||||
# Check file output
|
# Check file output
|
||||||
if CHECK_OUTPUT_CONVERSION:
|
if CHECK_OUTPUT_CONVERSION:
|
||||||
console.log("[red]Check output ffmpeg")
|
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'])]
|
ffmpeg_cmd += ["-metadata:s:s:{}".format(idx), "title={}".format(subtitle['name'])]
|
||||||
|
|
||||||
# Add output args
|
# Add output args
|
||||||
if USE_CODECS:
|
if USE_CODEC:
|
||||||
ffmpeg_cmd.extend(['-c:v', 'copy', '-c:a', 'copy', '-c:s', 'mov_text'])
|
ffmpeg_cmd.extend(['-c:v', 'copy', '-c:a', 'copy', '-c:s', 'mov_text'])
|
||||||
else:
|
else:
|
||||||
ffmpeg_cmd.extend(['-c', 'copy', '-c:s', 'mov_text'])
|
ffmpeg_cmd.extend(['-c', 'copy', '-c:s', 'mov_text'])
|
||||||
|
@ -71,8 +71,8 @@ def get_video_duration(file_path: str) -> float:
|
|||||||
return float(probe_result['format']['duration'])
|
return float(probe_result['format']['duration'])
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"Error: {e}")
|
logging.error(f"Error get video duration: {e}")
|
||||||
return None
|
sys.exit(0)
|
||||||
|
|
||||||
|
|
||||||
def format_duration(seconds: float) -> Tuple[int, int, int]:
|
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)
|
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.
|
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:
|
if video_duration is not None:
|
||||||
hours, minutes, seconds = format_duration(video_duration)
|
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):
|
def get_ffprobe_info(file_path):
|
||||||
@ -210,3 +213,24 @@ def check_ffmpeg_input(input_file):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logging.error(f"An unexpected error occurred: {e}")
|
logging.error(f"An unexpected error occurred: {e}")
|
||||||
return False
|
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
|
@ -8,7 +8,7 @@ from typing import Generator, Optional
|
|||||||
|
|
||||||
|
|
||||||
# External libraries
|
# External libraries
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ from concurrent.futures import ThreadPoolExecutor
|
|||||||
|
|
||||||
|
|
||||||
# External libraries
|
# External libraries
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
from unidecode import unidecode
|
from unidecode import unidecode
|
||||||
|
|
||||||
|
|
||||||
@ -178,7 +178,7 @@ class Downloader():
|
|||||||
|
|
||||||
# Check if there is some audios, else disable download
|
# Check if there is some audios, else disable download
|
||||||
if self.list_available_audio != None:
|
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:
|
else:
|
||||||
console.log("[red]Cant find a list of audios")
|
console.log("[red]Cant find a list of audios")
|
||||||
|
|
||||||
@ -191,7 +191,7 @@ class Downloader():
|
|||||||
|
|
||||||
# Check if there is some subtitles, else disable download
|
# Check if there is some subtitles, else disable download
|
||||||
if self.list_available_subtitles != None:
|
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:
|
else:
|
||||||
console.log("[red]Cant find a list of audios")
|
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}")
|
logging.info(f"M3U8 index select: {self.m3u8_index}, with resolution: {video_res}")
|
||||||
|
|
||||||
# Get URI of the best quality and codecs parameters
|
# 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\...
|
# Fix URL if it is not complete with http:\\site_name.domain\...
|
||||||
if "http" not in self.m3u8_index:
|
if "http" not in self.m3u8_index:
|
||||||
@ -219,7 +219,7 @@ class Downloader():
|
|||||||
|
|
||||||
# Check if a valid HTTPS URL is obtained
|
# Check if a valid HTTPS URL is obtained
|
||||||
if self.m3u8_index is not None and "https" in self.m3u8_index:
|
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:
|
else:
|
||||||
logging.error("[download_m3u8] Can't find a valid m3u8 index")
|
logging.error("[download_m3u8] Can't find a valid m3u8 index")
|
||||||
raise
|
raise
|
||||||
@ -229,7 +229,8 @@ class Downloader():
|
|||||||
logging.info(f"Find codec: {self.codec}")
|
logging.info(f"Find codec: {self.codec}")
|
||||||
|
|
||||||
if self.codec is not None:
|
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):
|
def __donwload_video__(self, server_ip: list = None):
|
||||||
"""
|
"""
|
||||||
@ -263,6 +264,9 @@ class Downloader():
|
|||||||
# Download the video segments
|
# Download the video segments
|
||||||
video_m3u8.download_streams(f"{Colors.MAGENTA}video")
|
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:
|
else:
|
||||||
console.log("[cyan]Video [red]already exists.")
|
console.log("[cyan]Video [red]already exists.")
|
||||||
|
|
||||||
@ -309,6 +313,9 @@ class Downloader():
|
|||||||
# Download the audio segments
|
# Download the audio segments
|
||||||
audio_m3u8.download_streams(f"{Colors.MAGENTA}audio {Colors.RED}{obj_audio.get('language')}")
|
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:
|
else:
|
||||||
console.log(f"[cyan]Audio [white]([green]{obj_audio.get('language')}[white]) [red]already exists.")
|
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
|
# 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))
|
futures.append(executor.submit(self.__save_subtitle_content, m3u8_sub_parser.subtitle[-1], sub_full_path))
|
||||||
|
|
||||||
# Wait for all downloads to finish
|
# Wait for all downloads to finish
|
||||||
for future in futures:
|
for future in futures:
|
||||||
future.result()
|
future.result()
|
||||||
|
|
||||||
def __join_video__(self, vcodec = 'copy') -> str:
|
def __join_video__(self) -> str:
|
||||||
"""
|
"""
|
||||||
Join downloaded video segments into a single video file.
|
Join downloaded video segments into a single video file.
|
||||||
|
|
||||||
@ -397,10 +404,9 @@ class Downloader():
|
|||||||
join_video(
|
join_video(
|
||||||
video_path = self.downloaded_video[0].get('path'),
|
video_path = self.downloaded_video[0].get('path'),
|
||||||
out_path = path_join_video,
|
out_path = path_join_video,
|
||||||
vcodec = vcodec
|
codec = self.codec
|
||||||
)
|
)
|
||||||
|
|
||||||
print_duration_table(path_join_video)
|
|
||||||
return path_join_video
|
return path_join_video
|
||||||
|
|
||||||
def __join_video_audio__(self) -> str:
|
def __join_video_audio__(self) -> str:
|
||||||
@ -420,10 +426,10 @@ class Downloader():
|
|||||||
join_audios(
|
join_audios(
|
||||||
video_path = self.downloaded_video[0].get('path'),
|
video_path = self.downloaded_video[0].get('path'),
|
||||||
audio_tracks = self.downloaded_audio,
|
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
|
return path_join_video_audio
|
||||||
|
|
||||||
def __join_video_subtitles__(self, input_path: str) -> str:
|
def __join_video_subtitles__(self, input_path: str) -> str:
|
||||||
@ -449,7 +455,6 @@ class Downloader():
|
|||||||
path_join_video_subtitle
|
path_join_video_subtitle
|
||||||
)
|
)
|
||||||
|
|
||||||
print_duration_table(path_join_video_subtitle)
|
|
||||||
return path_join_video_subtitle
|
return path_join_video_subtitle
|
||||||
|
|
||||||
def __clean__(self, out_path: str) -> None:
|
def __clean__(self, out_path: str) -> None:
|
||||||
@ -473,7 +478,11 @@ class Downloader():
|
|||||||
os.rename(out_path, self.output_filename)
|
os.rename(out_path, self.output_filename)
|
||||||
|
|
||||||
# Print size of the file
|
# 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 all files except the output file
|
||||||
delete_files_except_one(self.base_path, os.path.basename(self.output_filename))
|
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_video: bool = (len(self.downloaded_video) > 0)
|
||||||
there_is_audio: bool = (len(self.downloaded_audio) > 0)
|
there_is_audio: bool = (len(self.downloaded_audio) > 0)
|
||||||
there_is_subtitle: bool = (len(self.downloaded_subtitle) > 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
|
# Join audio and video
|
||||||
|
@ -5,7 +5,6 @@ import sys
|
|||||||
import time
|
import time
|
||||||
import queue
|
import queue
|
||||||
import threading
|
import threading
|
||||||
import signal
|
|
||||||
import logging
|
import logging
|
||||||
import binascii
|
import binascii
|
||||||
from concurrent.futures import ThreadPoolExecutor
|
from concurrent.futures import ThreadPoolExecutor
|
||||||
@ -13,7 +12,7 @@ from urllib.parse import urljoin, urlparse, urlunparse
|
|||||||
|
|
||||||
|
|
||||||
# External libraries
|
# External libraries
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
|
||||||
|
|
||||||
@ -23,6 +22,7 @@ from Src.Util.headers import get_headers
|
|||||||
from Src.Util.color import Colors
|
from Src.Util.color import Colors
|
||||||
from Src.Util._jsonConfig import config_manager
|
from Src.Util._jsonConfig import config_manager
|
||||||
|
|
||||||
|
|
||||||
# Logic class
|
# Logic class
|
||||||
from ..M3U8 import (
|
from ..M3U8 import (
|
||||||
M3U8_Decryption,
|
M3U8_Decryption,
|
||||||
@ -32,11 +32,14 @@ from ..M3U8 import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Warning
|
||||||
|
import urllib3
|
||||||
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||||
|
|
||||||
# Config
|
# Config
|
||||||
TQDM_MAX_WORKER = config_manager.get_int('M3U8_DOWNLOAD', 'tdqm_workers')
|
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')
|
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_VERIFY_SSL = config_manager.get_bool('REQUESTS', 'verify_ssl')
|
||||||
REQUEST_DISABLE_ERROR = config_manager.get_bool('REQUESTS', 'disable_error')
|
|
||||||
|
|
||||||
|
|
||||||
# Variable
|
# Variable
|
||||||
@ -55,18 +58,20 @@ class M3U8_Segments:
|
|||||||
- tmp_folder (str): The temporary folder to store downloaded segments.
|
- tmp_folder (str): The temporary folder to store downloaded segments.
|
||||||
"""
|
"""
|
||||||
self.url = url
|
self.url = url
|
||||||
|
self.fake_proxy = False
|
||||||
self.tmp_folder = tmp_folder
|
self.tmp_folder = tmp_folder
|
||||||
self.decryption: M3U8_Decryption = None # Initialize decryption as None
|
self.tmp_file_path = os.path.join(self.tmp_folder, "0.ts")
|
||||||
self.segment_queue = queue.PriorityQueue() # Priority queue to maintain the order of segments
|
os.makedirs(self.tmp_folder, exist_ok=True)
|
||||||
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
|
|
||||||
|
|
||||||
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_ts_estimator = M3U8_Ts_Estimator(0)
|
||||||
self.class_url_fixer = M3U8_UrlFix(url)
|
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):
|
def add_server_ip(self, list_ip):
|
||||||
"""
|
"""
|
||||||
@ -97,8 +102,6 @@ class M3U8_Segments:
|
|||||||
logging.info(f"Uri key: {key_uri}")
|
logging.info(f"Uri key: {key_uri}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
# Send HTTP GET request to fetch the key
|
|
||||||
response = requests.get(key_uri, headers=headers_index)
|
response = requests.get(key_uri, headers=headers_index)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
|
|
||||||
@ -112,6 +115,41 @@ class M3U8_Segments:
|
|||||||
logging.info(f"Key: ('hex': {hex_content}, 'byte': {byte_content})")
|
logging.info(f"Key: ('hex': {hex_content}, 'byte': {byte_content})")
|
||||||
return 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:
|
def parse_data(self, m3u8_content: str) -> None:
|
||||||
"""
|
"""
|
||||||
Parses the M3U8 content to extract segment information.
|
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_content (str): The content of the M3U8 file.
|
||||||
"""
|
"""
|
||||||
m3u8_parser = M3U8_Parser()
|
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
|
# Check if there is an encryption key in the playlis
|
||||||
if m3u8_parser.keys is not None:
|
if m3u8_parser.keys is not None:
|
||||||
@ -156,6 +195,12 @@ class M3U8_Segments:
|
|||||||
for i in range(len(self.segments)):
|
for i in range(len(self.segments)):
|
||||||
segment_url = self.segments[i]
|
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))
|
self.segments[i] = self.__gen_proxy__(segment_url, self.segments.index(segment_url))
|
||||||
|
|
||||||
# Save new playlist of segment
|
# Save new playlist of segment
|
||||||
@ -166,6 +211,7 @@ class M3U8_Segments:
|
|||||||
|
|
||||||
# Update segments for estimator
|
# Update segments for estimator
|
||||||
self.class_ts_estimator.total_segments = len(self.segments)
|
self.class_ts_estimator.total_segments = len(self.segments)
|
||||||
|
logging.info(f"Segmnets to donwload: [{len(self.segments)}]")
|
||||||
|
|
||||||
def get_info(self) -> None:
|
def get_info(self) -> None:
|
||||||
"""
|
"""
|
||||||
@ -196,28 +242,28 @@ class M3U8_Segments:
|
|||||||
Returns:
|
Returns:
|
||||||
str: The modified URL with the new IP address.
|
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
|
new_ip_address = self.fake_proxy_ip[url_index % len(self.fake_proxy_ip)]
|
||||||
parsed_url = urlparse(url)._replace(netloc=new_ip_address)
|
|
||||||
|
|
||||||
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.
|
Downloads a TS segment and adds it to the segment queue.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
- ts_url (str): The URL of the TS segment.
|
- ts_url (str): The URL of the TS segment.
|
||||||
- index (int): The index of the 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.
|
- 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
|
# Generate new user agent
|
||||||
headers_segments['user-agent'] = get_headers()
|
headers_segments['user-agent'] = get_headers()
|
||||||
|
|
||||||
@ -225,16 +271,17 @@ class M3U8_Segments:
|
|||||||
|
|
||||||
# Make request and calculate time duration
|
# Make request and calculate time duration
|
||||||
start_time = time.time()
|
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
|
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:
|
if response.ok:
|
||||||
|
|
||||||
# Get the content of the segment
|
# Get the content of the segment
|
||||||
segment_content = response.content
|
segment_content = response.content
|
||||||
|
|
||||||
# Update bar
|
# 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
|
# Decrypt the segment content if decryption is needed
|
||||||
if self.decryption is not None:
|
if self.decryption is not None:
|
||||||
@ -243,37 +290,29 @@ class M3U8_Segments:
|
|||||||
with self.condition:
|
with self.condition:
|
||||||
self.segment_queue.put((index, segment_content)) # Add the segment to the queue
|
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
|
self.condition.notify() # Notify the writer thread that a new segment is available
|
||||||
|
|
||||||
else:
|
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:
|
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
|
# Update bar
|
||||||
progress_bar.update(1)
|
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.
|
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:
|
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:
|
with self.condition:
|
||||||
while self.segment_queue.empty() and not stop_event.is_set():
|
while self.segment_queue.empty() and self.current_index < len(self.segments):
|
||||||
self.condition.wait(timeout=1) # Wait until a new segment is available or stop_event is set
|
self.condition.wait() # Wait until a new segment is available or all segments are downloaded
|
||||||
|
|
||||||
if stop_event.is_set():
|
if self.segment_queue.empty() and self.current_index >= len(self.segments):
|
||||||
break
|
break # Exit loop if all segments have been processed
|
||||||
|
|
||||||
if not self.segment_queue.empty():
|
if not self.segment_queue.empty():
|
||||||
|
|
||||||
# Get the segment from the queue
|
# Get the segment from the queue
|
||||||
index, segment_content = self.segment_queue.get()
|
index, segment_content = self.segment_queue.get()
|
||||||
|
|
||||||
@ -282,10 +321,9 @@ class M3U8_Segments:
|
|||||||
f.write(segment_content)
|
f.write(segment_content)
|
||||||
self.current_index += 1
|
self.current_index += 1
|
||||||
self.segment_queue.task_done()
|
self.segment_queue.task_done()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.segment_queue.put((index, segment_content)) # Requeue the segment if it is not the next to be written
|
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.condition.notify()
|
||||||
|
|
||||||
def download_streams(self, add_desc):
|
def download_streams(self, add_desc):
|
||||||
"""
|
"""
|
||||||
@ -294,10 +332,8 @@ class M3U8_Segments:
|
|||||||
Args:
|
Args:
|
||||||
- add_desc (str): Additional description for the progress bar.
|
- add_desc (str): Additional description for the progress bar.
|
||||||
"""
|
"""
|
||||||
stop_event = threading.Event() # Event to signal stopping
|
|
||||||
|
|
||||||
if TQDM_USE_LARGE_BAR:
|
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:
|
else:
|
||||||
bar_format=f"{Colors.YELLOW}Proc{Colors.WHITE}: {Colors.RED}{{percentage:.2f}}% {Colors.WHITE}| {Colors.CYAN}{{remaining}}{{postfix}} {Colors.WHITE}]"
|
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),
|
total=len(self.segments),
|
||||||
unit='s',
|
unit='s',
|
||||||
ascii='░▒█',
|
ascii='░▒█',
|
||||||
bar_format=bar_format,
|
bar_format=bar_format
|
||||||
dynamic_ncols=True,
|
|
||||||
ncols=80,
|
|
||||||
mininterval=0.01
|
|
||||||
)
|
)
|
||||||
|
|
||||||
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:
|
with ThreadPoolExecutor(max_workers=TQDM_MAX_WORKER) as executor:
|
||||||
|
|
||||||
# Start a separate thread to write segments to the file
|
# 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()
|
writer_thread.start()
|
||||||
|
|
||||||
# Delay the start of each worker
|
# Start all workers
|
||||||
for index, segment_url in enumerate(self.segments):
|
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
|
# 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
|
# Wait for all segments to be downloaded
|
||||||
executor.shutdown(wait=True)
|
executor.shutdown()
|
||||||
stop_event.set() # Set the stop event to halt the writer thread
|
|
||||||
with self.condition:
|
with self.condition:
|
||||||
self.condition.notify_all() # Wake up the writer thread if it's waiting
|
self.condition.notify_all() # Wake up the writer thread if it's waiting
|
||||||
writer_thread.join() # Wait for the writer thread to finish
|
writer_thread.join() # Wait for the writer thread to finish
|
||||||
|
@ -111,17 +111,16 @@ else:
|
|||||||
"""
|
"""
|
||||||
if self.method == "AES":
|
if self.method == "AES":
|
||||||
openssl_cmd = f'openssl enc -d -aes-256-ecb -K {self.key.hex()} -nosalt'
|
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":
|
elif self.method == "AES-128":
|
||||||
openssl_cmd = f'openssl enc -d -aes-128-cbc -K {self.key[:16].hex()} -iv {self.iv.hex()}'
|
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":
|
elif self.method == "AES-128-CTR":
|
||||||
openssl_cmd = f'openssl enc -d -aes-128-ctr -K {self.key[:16].hex()} -iv {self.iv.hex()}'
|
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:
|
else:
|
||||||
raise ValueError("Invalid or unsupported method")
|
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
|
@ -31,7 +31,7 @@ class M3U8_Ts_Estimator:
|
|||||||
"""
|
"""
|
||||||
self.ts_file_sizes = []
|
self.ts_file_sizes = []
|
||||||
self.now_downloaded_size = 0
|
self.now_downloaded_size = 0
|
||||||
self.average_over = 6
|
self.average_over = 3
|
||||||
self.list_speeds = deque(maxlen=self.average_over)
|
self.list_speeds = deque(maxlen=self.average_over)
|
||||||
self.smoothed_speeds = []
|
self.smoothed_speeds = []
|
||||||
self.total_segments = total_segments
|
self.total_segments = total_segments
|
||||||
@ -52,7 +52,7 @@ class M3U8_Ts_Estimator:
|
|||||||
|
|
||||||
# Calculate speed outside of the lock
|
# Calculate speed outside of the lock
|
||||||
try:
|
try:
|
||||||
speed_mbps = (size_download * 16) / (duration * 1_000_000)
|
speed_mbps = (size_download * 8) / (duration * 1_000_000)
|
||||||
except ZeroDivisionError as e:
|
except ZeroDivisionError as e:
|
||||||
logging.error("Division by zero error while calculating speed: %s", e)
|
logging.error("Division by zero error while calculating speed: %s", e)
|
||||||
return
|
return
|
||||||
@ -114,16 +114,15 @@ class M3U8_Ts_Estimator:
|
|||||||
"""
|
"""
|
||||||
return format_size(self.now_downloaded_size)
|
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.
|
Updates the progress bar with information about the TS segment download.
|
||||||
|
|
||||||
Args:
|
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.
|
duration (float): The duration of the segment download in seconds.
|
||||||
progress_counter (tqdm): The tqdm object representing the progress bar.
|
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
|
# Add the size of the downloaded segment to the estimator
|
||||||
self.add_ts_file(total_downloaded * self.total_segments, total_downloaded, duration)
|
self.add_ts_file(total_downloaded * self.total_segments, total_downloaded, duration)
|
||||||
|
@ -8,7 +8,7 @@ from .lib_parser import load
|
|||||||
|
|
||||||
|
|
||||||
# External libraries
|
# External libraries
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
|
|
||||||
|
|
||||||
# Costant
|
# Costant
|
||||||
@ -48,10 +48,6 @@ RESOLUTIONS = [
|
|||||||
|
|
||||||
|
|
||||||
class M3U8_Codec:
|
class M3U8_Codec:
|
||||||
"""
|
|
||||||
Represents codec information for an M3U8 playlist.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, bandwidth, codecs):
|
def __init__(self, bandwidth, codecs):
|
||||||
"""
|
"""
|
||||||
Initializes the M3U8Codec object with the provided parameters.
|
Initializes the M3U8Codec object with the provided parameters.
|
||||||
@ -64,20 +60,23 @@ class M3U8_Codec:
|
|||||||
self.codecs = codecs
|
self.codecs = codecs
|
||||||
self.audio_codec = None
|
self.audio_codec = None
|
||||||
self.video_codec = None
|
self.video_codec = None
|
||||||
|
self.video_codec_name = None
|
||||||
|
self.audio_codec_name = None
|
||||||
self.extract_codecs()
|
self.extract_codecs()
|
||||||
self.parse_codecs()
|
self.parse_codecs()
|
||||||
|
self.calculate_bitrates()
|
||||||
|
|
||||||
def extract_codecs(self):
|
def extract_codecs(self):
|
||||||
"""
|
"""
|
||||||
Parses the codecs information to extract audio and video codecs.
|
Parses the codecs information to extract audio and video codecs.
|
||||||
Extracted codecs are set as attributes: audio_codec and video_codec.
|
Extracted codecs are set as attributes: audio_codec and video_codec.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Split the codecs string by comma
|
|
||||||
try:
|
try:
|
||||||
|
# Split the codecs string by comma
|
||||||
codecs_list = self.codecs.split(',')
|
codecs_list = self.codecs.split(',')
|
||||||
except Exception as e:
|
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
|
# Separate audio and video codecs
|
||||||
for codec in codecs_list:
|
for codec in codecs_list:
|
||||||
@ -87,7 +86,6 @@ class M3U8_Codec:
|
|||||||
self.audio_codec = codec
|
self.audio_codec = codec
|
||||||
|
|
||||||
def convert_video_codec(self, video_codec_identifier) -> str:
|
def convert_video_codec(self, video_codec_identifier) -> str:
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Convert video codec identifier to codec name.
|
Convert video codec identifier to codec name.
|
||||||
|
|
||||||
@ -97,6 +95,9 @@ class M3U8_Codec:
|
|||||||
Returns:
|
Returns:
|
||||||
str: Codec name corresponding to the identifier.
|
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
|
# Extract codec type from the identifier
|
||||||
codec_type = video_codec_identifier.split('.')[0]
|
codec_type = video_codec_identifier.split('.')[0]
|
||||||
@ -107,13 +108,11 @@ class M3U8_Codec:
|
|||||||
|
|
||||||
if codec_name:
|
if codec_name:
|
||||||
return codec_name
|
return codec_name
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logging.warning(f"No corresponding video codec found for {video_codec_identifier}. Using default codec libx264.")
|
logging.warning(f"No corresponding video codec found for {video_codec_identifier}. Using default codec libx264.")
|
||||||
return "libx264" # Default
|
return "libx264" # Default
|
||||||
|
|
||||||
def convert_audio_codec(self, audio_codec_identifier) -> str:
|
|
||||||
|
|
||||||
|
def convert_audio_codec(self, audio_codec_identifier) -> str:
|
||||||
"""
|
"""
|
||||||
Convert audio codec identifier to codec name.
|
Convert audio codec identifier to codec name.
|
||||||
|
|
||||||
@ -123,6 +122,9 @@ class M3U8_Codec:
|
|||||||
Returns:
|
Returns:
|
||||||
str: Codec name corresponding to the identifier.
|
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
|
# Extract codec type from the identifier
|
||||||
codec_type = audio_codec_identifier.split('.')[0]
|
codec_type = audio_codec_identifier.split('.')[0]
|
||||||
@ -133,25 +135,33 @@ class M3U8_Codec:
|
|||||||
|
|
||||||
if codec_name:
|
if codec_name:
|
||||||
return codec_name
|
return codec_name
|
||||||
|
|
||||||
else:
|
else:
|
||||||
logging.warning(f"No corresponding audio codec found for {audio_codec_identifier}. Using default codec aac.")
|
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):
|
def parse_codecs(self):
|
||||||
"""
|
"""
|
||||||
Parse video and audio codecs.
|
Parse video and audio codecs.
|
||||||
This method updates `video_codec_name` and `audio_codec_name` attributes.
|
This method updates `video_codec_name` and `audio_codec_name` attributes.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.video_codec_name = self.convert_video_codec(self.video_codec)
|
self.video_codec_name = self.convert_video_codec(self.video_codec)
|
||||||
self.audio_codec_name = self.convert_audio_codec(self.audio_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:
|
class M3U8_Video:
|
||||||
@ -394,6 +404,7 @@ class M3U8_Parser:
|
|||||||
self._video: M3U8_Video = None
|
self._video: M3U8_Video = None
|
||||||
self._audio: M3U8_Audio = None
|
self._audio: M3U8_Audio = None
|
||||||
self._subtitle: M3U8_Subtitle = None
|
self._subtitle: M3U8_Subtitle = None
|
||||||
|
self.duration: float = 0
|
||||||
|
|
||||||
self.__create_variable__()
|
self.__create_variable__()
|
||||||
|
|
||||||
@ -547,6 +558,10 @@ class M3U8_Parser:
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
for segment in m3u8_obj.segments:
|
for segment in m3u8_obj.segments:
|
||||||
|
|
||||||
|
# Collect all index duration
|
||||||
|
self.duration += segment.duration
|
||||||
|
|
||||||
if "vtt" not in segment.uri:
|
if "vtt" not in segment.uri:
|
||||||
self.segments.append(segment.uri)
|
self.segments.append(segment.uri)
|
||||||
else:
|
else:
|
||||||
@ -563,3 +578,21 @@ class M3U8_Parser:
|
|||||||
self._video = M3U8_Video(self.video_playlist)
|
self._video = M3U8_Video(self.video_playlist)
|
||||||
self._audio = M3U8_Audio(self.audio_playlist)
|
self._audio = M3U8_Audio(self.audio_playlist)
|
||||||
self._subtitle = M3U8_Subtitle(self.subtitle_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"
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
# 04.4.24
|
|
||||||
|
|
||||||
from .my_requests import requests
|
|
@ -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 <link> elements within the <head> 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()
|
|
@ -1,3 +0,0 @@
|
|||||||
# 04.4.24
|
|
||||||
|
|
||||||
from .user_agent import ua
|
|
@ -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"<a href=\'/.*?>(.+?)</a>", 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()
|
|
@ -10,7 +10,7 @@ from Src.Util.console import console
|
|||||||
|
|
||||||
|
|
||||||
# External library
|
# External library
|
||||||
from Src.Lib.Request import requests
|
import requests
|
||||||
|
|
||||||
|
|
||||||
# Variable
|
# 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\
|
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!")
|
[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")
|
console.print("\n")
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
__title__ = 'Streaming_community'
|
__title__ = 'StreamingCommunity'
|
||||||
__version__ = 'v1.1.0'
|
__version__ = 'v1.1.0'
|
||||||
__author__ = 'Ghost6446'
|
__author__ = 'Lovi-0'
|
||||||
__description__ = 'A command-line program to download film'
|
__description__ = 'A command-line program to download film'
|
||||||
__copyright__ = 'Copyright 2024'
|
__copyright__ = 'Copyright 2024'
|
||||||
|
@ -3,8 +3,12 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
|
||||||
# Internal utilities
|
# External library
|
||||||
from Src.Lib.UserAgent import ua
|
import fake_useragent
|
||||||
|
|
||||||
|
|
||||||
|
# Variable
|
||||||
|
useragent = fake_useragent.UserAgent()
|
||||||
|
|
||||||
|
|
||||||
def get_headers() -> str:
|
def get_headers() -> str:
|
||||||
@ -12,11 +16,8 @@ def get_headers() -> str:
|
|||||||
Generate a random user agent to use in HTTP requests.
|
Generate a random user agent to use in HTTP requests.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
str: A random user agent string.
|
- str: A random user agent string.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Get a random user agent string from the user agent rotator
|
# Get a random user agent string from the user agent rotator
|
||||||
random_headers = ua.get_random_user_agent("firefox")
|
return useragent.firefox
|
||||||
|
|
||||||
#logging.info(f"Use headers: {random_headers}")
|
|
||||||
return random_headers
|
|
@ -53,7 +53,3 @@ class Logger:
|
|||||||
formatter = logging.Formatter('[%(filename)s:%(lineno)s - %(funcName)20s() ] %(asctime)s - %(levelname)s - %(message)s')
|
formatter = logging.Formatter('[%(filename)s:%(lineno)s - %(funcName)20s() ] %(asctime)s - %(levelname)s - %(message)s')
|
||||||
file_handler.setFormatter(formatter)
|
file_handler.setFormatter(formatter)
|
||||||
logging.getLogger('').addHandler(file_handler)
|
logging.getLogger('').addHandler(file_handler)
|
||||||
|
|
||||||
|
|
||||||
# Output
|
|
||||||
logger = Logger()
|
|
@ -41,7 +41,7 @@ def start_message():
|
|||||||
|
|
||||||
if SHOW:
|
if SHOW:
|
||||||
console.print(f"[bold yellow]{msg}")
|
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
|
row = "-" * console.width
|
||||||
console.print(f"[yellow]{row} \n")
|
console.print(f"[yellow]{row} \n")
|
@ -16,6 +16,7 @@ import platform
|
|||||||
import importlib
|
import importlib
|
||||||
import subprocess
|
import subprocess
|
||||||
import contextlib
|
import contextlib
|
||||||
|
import urllib.request
|
||||||
import importlib.metadata
|
import importlib.metadata
|
||||||
|
|
||||||
from typing import List
|
from typing import List
|
||||||
@ -403,6 +404,19 @@ def convert_to_hex(bytes_data: bytes) -> str:
|
|||||||
|
|
||||||
|
|
||||||
# --> OS GET SUMMARY
|
# --> 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):
|
def get_executable_version(command):
|
||||||
try:
|
try:
|
||||||
version_output = subprocess.check_output(command, stderr=subprocess.STDOUT).decode().split('\n')[0]
|
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"
|
return f"{lib_name}-not installed"
|
||||||
|
|
||||||
def get_system_summary():
|
def get_system_summary():
|
||||||
|
|
||||||
|
check_internet()
|
||||||
console.print("[bold blue]System Summary[/bold blue][white]:")
|
console.print("[bold blue]System Summary[/bold blue][white]:")
|
||||||
|
|
||||||
# Python version and platform
|
# Python version and platform
|
||||||
@ -442,7 +457,7 @@ def get_system_summary():
|
|||||||
logging.info(f"Exe versions: ffmpeg {ffmpeg_version}, ffprobe {ffprobe_version}")
|
logging.info(f"Exe versions: ffmpeg {ffmpeg_version}, ffprobe {ffprobe_version}")
|
||||||
|
|
||||||
# Optional libraries versions
|
# 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]
|
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")
|
console.print(f"[cyan]Libraries[white]: [bold red]{', '.join(optional_libs_versions)}[/bold red]\n")
|
||||||
|
@ -5,9 +5,6 @@ import json
|
|||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
|
|
||||||
|
|
||||||
# https://onshopify.com/domains/
|
|
||||||
|
|
||||||
|
|
||||||
# URL of the webpage containing the table
|
# URL of the webpage containing the table
|
||||||
url = 'https://icannwiki.org/New_gTLD_Generic_Applications'
|
url = 'https://icannwiki.org/New_gTLD_Generic_Applications'
|
||||||
|
|
||||||
@ -84,5 +81,6 @@ def main():
|
|||||||
with open('data.json', 'w') as json_file:
|
with open('data.json', 'w') as json_file:
|
||||||
json.dump(data, json_file)
|
json.dump(data, json_file)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
@ -4,10 +4,667 @@
|
|||||||
#EXT-X-PLAYLIST-TYPE:VOD
|
#EXT-X-PLAYLIST-TYPE:VOD
|
||||||
#EXT-X-KEY:METHOD=AES-128,URI="/storage/enc.key",IV=0x43A6D967D5C17290D98322F5C8F6660B
|
#EXT-X-KEY:METHOD=AES-128,URI="/storage/enc.key",IV=0x43A6D967D5C17290D98322F5C8F6660B
|
||||||
#EXTINF:4.010667,
|
#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,
|
#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,
|
#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,
|
#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
|
#EXT-X-ENDLIST
|
@ -4,10 +4,667 @@
|
|||||||
#EXT-X-PLAYLIST-TYPE:VOD
|
#EXT-X-PLAYLIST-TYPE:VOD
|
||||||
#EXT-X-KEY:METHOD=AES-128,URI="/storage/enc.key",IV=0x43A6D967D5C17290D98322F5C8F6660B
|
#EXT-X-KEY:METHOD=AES-128,URI="/storage/enc.key",IV=0x43A6D967D5C17290D98322F5C8F6660B
|
||||||
#EXTINF:4,
|
#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,
|
#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,
|
#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,
|
#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
|
#EXT-X-ENDLIST
|
@ -1,11 +1,12 @@
|
|||||||
#EXTM3U
|
#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=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 [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="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="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=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"
|
#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"
|
#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
|
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
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"2024-5": {
|
|
||||||
"token": "csVhbgxqG_z_tjvJiy1IiA",
|
|
||||||
"token360p": "",
|
|
||||||
"token480p": "S7MTy30iN4BcxC-sXt0fOw",
|
|
||||||
"token720p": "fW_SEvaLezh5bD_iKDxcpw",
|
|
||||||
"token1080p": "HSuRzJwwFYR55KhtOAC85Q",
|
|
||||||
"expires": "1720963565"
|
|
||||||
}
|
|
||||||
}
|
|
86
Test/t_get_server_ip_sc.py
Normal file
86
Test/t_get_server_ip_sc.py
Normal file
@ -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()
|
@ -23,23 +23,15 @@ from Src.Lib.M3U8 import M3U8_Parser
|
|||||||
# Test data
|
# Test data
|
||||||
obj_m3u8_parser = M3U8_Parser()
|
obj_m3u8_parser = M3U8_Parser()
|
||||||
base_path_file = os.path.join('Test', 'data', 'm3u8')
|
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_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_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"))
|
playlist = read_file(os.path.join(base_path_file, "playlist.m3u8"))
|
||||||
|
|
||||||
|
|
||||||
print("AUDIO: ")
|
# Test class
|
||||||
print(M3U8(index_audio).data)
|
obj_m3u8_parser.parse_data("http", index_audio)
|
||||||
print()
|
print(f"Duration : {obj_m3u8_parser.get_duration()}")
|
||||||
|
|
||||||
print("SUBTITLE: ")
|
|
||||||
print(M3U8(index_subtitle).data)
|
|
||||||
print()
|
|
||||||
|
|
||||||
print("INDEX: ")
|
|
||||||
print(M3U8(index_video).data)
|
|
||||||
print()
|
|
||||||
|
|
||||||
print("PLAYLIST: ")
|
|
||||||
print(M3U8(playlist).data)
|
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
"not_close": false
|
"not_close": false
|
||||||
},
|
},
|
||||||
"REQUESTS": {
|
"REQUESTS": {
|
||||||
"disable_error": false,
|
|
||||||
"timeout": 10,
|
"timeout": 10,
|
||||||
"max_retry": 3,
|
"max_retry": 3,
|
||||||
"verify_ssl": false,
|
"verify_ssl": false,
|
||||||
@ -18,7 +17,7 @@
|
|||||||
"segments": { "user-agent": ""}
|
"segments": { "user-agent": ""}
|
||||||
},
|
},
|
||||||
"M3U8_DOWNLOAD": {
|
"M3U8_DOWNLOAD": {
|
||||||
"tdqm_workers": 30,
|
"tdqm_workers": 4,
|
||||||
"tqdm_use_large_bar": true,
|
"tqdm_use_large_bar": true,
|
||||||
"download_video": true,
|
"download_video": true,
|
||||||
"download_audio": true,
|
"download_audio": true,
|
||||||
@ -32,7 +31,10 @@
|
|||||||
},
|
},
|
||||||
"M3U8_CONVERSION": {
|
"M3U8_CONVERSION": {
|
||||||
"use_codec": false,
|
"use_codec": false,
|
||||||
"use_gpu": false,
|
"use_vcodec": true,
|
||||||
|
"use_acodec": true,
|
||||||
|
"use_bitrate": true,
|
||||||
|
"use_gpu": true,
|
||||||
"default_preset": "ultrafast",
|
"default_preset": "ultrafast",
|
||||||
"check_output_after_ffmpeg": false
|
"check_output_after_ffmpeg": false
|
||||||
},
|
},
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
bs4
|
requests
|
||||||
|
bs4
|
||||||
|
certifi
|
||||||
tqdm
|
tqdm
|
||||||
rich
|
rich
|
||||||
unidecode
|
unidecode
|
||||||
|
fake-useragent
|
64
run.py
64
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')
|
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:
|
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.
|
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.
|
func (Callable[..., None]): The function to run.
|
||||||
close_console (bool, optional): Whether to close the console after running the function once. Defaults to False.
|
close_console (bool, optional): Whether to close the console after running the function once. Defaults to False.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
initialize()
|
|
||||||
|
|
||||||
if close_console:
|
if close_console:
|
||||||
while 1:
|
while 1:
|
||||||
func()
|
func()
|
||||||
@ -73,11 +42,40 @@ def run_function(func: Callable[..., None], close_console: bool = False) -> None
|
|||||||
func()
|
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()
|
log_not = Logger()
|
||||||
|
|
||||||
|
# Get system info
|
||||||
get_system_summary()
|
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
|
# Parse command line arguments
|
||||||
parser = argparse.ArgumentParser(description='Script to download film and series from the internet.')
|
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')
|
parser.add_argument('-sa', '--streaming_anime', action='store_true', help='Check into anime category')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user