SYMBOL INDEX (234 symbols across 20 files) FILE: isubrip/__main__.py function main (line 44) | def main() -> None: function _main (line 66) | async def _main() -> None: function check_for_updates (line 126) | def check_for_updates(current_package_version: str) -> None: function handle_log_rotation (line 160) | def handle_log_rotation(rotation_size: int) -> None: function parse_config (line 174) | def parse_config(config_file_location: Path) -> Config: function update_settings (line 211) | def update_settings(config: Config) -> None: FILE: isubrip/cli.py function conditional_live (line 13) | def conditional_live(renderable: Any) -> Iterator[Live | None]: FILE: isubrip/commands/download.py function download (line 34) | async def download(*urls: str, function download_media (line 102) | async def download_media(scraper: Scraper, media_item: MediaData, downlo... function download_media_item (line 137) | async def download_media_item(scraper: Scraper, media_item: Movie | Epis... function download_subtitles (line 194) | async def download_subtitles(scraper: Scraper, media_data: Movie | Episo... FILE: isubrip/config.py class ConfigCategory (line 14) | class ConfigCategory(BaseModel, ABC): class GeneralCategory (line 24) | class GeneralCategory(ConfigCategory): class DownloadsCategory (line 31) | class DownloadsCategory(ConfigCategory): method assure_path_exists (line 39) | def assure_path_exists(cls, value: Path) -> Path: class WebVTTSubcategory (line 55) | class WebVTTSubcategory(ConfigCategory): class SubtitlesCategory (line 59) | class SubtitlesCategory(ConfigCategory): class ScrapersCategory (line 66) | class ScrapersCategory(ConfigCategory): class Config (line 86) | class Config(BaseSettings): method settings_customise_sources (line 97) | def settings_customise_sources( FILE: isubrip/constants.py function data_folder_path (line 15) | def data_folder_path() -> Path: function temp_folder_path (line 19) | def temp_folder_path() -> Path: function user_config_file_path (line 23) | def user_config_file_path() -> Path: function log_files_path (line 28) | def log_files_path() -> Path: FILE: isubrip/data_structures.py class SubtitlesDownloadResults (line 21) | class SubtitlesDownloadResults(NamedTuple): class SubtitlesFormat (line 37) | class SubtitlesFormat(BaseModel): class SubtitlesFormatType (line 49) | class SubtitlesFormatType(Enum): class SubtitlesType (line 61) | class SubtitlesType(Enum): class SubtitlesData (line 73) | class SubtitlesData(BaseModel): class ConfigDict (line 92) | class ConfigDict: class MediaBase (line 96) | class MediaBase(BaseModel, ABC): class Movie (line 100) | class Movie(MediaBase): class Episode (line 126) | class Episode(MediaBase): class Season (line 160) | class Season(MediaBase): class Series (line 186) | class Series(MediaBase): class ScrapedMediaResponse (line 206) | class ScrapedMediaResponse(BaseModel, Generic[MediaData]): FILE: isubrip/logger.py function set_logger (line 28) | def set_logger(_logger: logging.Logger) -> None: class CustomStdoutFormatter (line 39) | class CustomStdoutFormatter(RichHandler): method __init__ (line 52) | def __init__(self, console: Console | None = None, debug_mode: bool = ... method emit (line 73) | def emit(self, record: logging.LogRecord) -> None: method format (line 85) | def format(self, record: logging.LogRecord) -> str: class CustomLogFileFormatter (line 105) | class CustomLogFileFormatter(logging.Formatter): method __init__ (line 109) | def __init__(self) -> None: method _remove_rich_markup (line 121) | def _remove_rich_markup(text: str) -> str: method format (line 135) | def format(self, record: logging.LogRecord) -> str: function setup_loggers (line 170) | def setup_loggers(stdout_output: bool = True, stdout_console: Console | ... FILE: isubrip/scrapers/appletv_scraper.py class AppleTVScraper (line 18) | class AppleTVScraper(HLSScraper): class Channel (line 56) | class Channel(Enum): method __init__ (line 70) | def __init__(self, *args: Any, **kwargs: Any) -> None: method _decide_locale (line 74) | def _decide_locale(self, preferred_locales: str | list[str], default_l... method _fetch_api_data (line 98) | async def _fetch_api_data(self, storefront_id: str, endpoint: str, add... method _fetch_request_params (line 135) | async def _fetch_request_params(self, storefront_id: str) -> dict[str,... method _get_configuration_data (line 173) | async def _get_configuration_data(self, storefront_id: str) -> dict: method _map_playables_by_channel (line 196) | def _map_playables_by_channel(self, playables: list[dict]) -> dict[str... method get_movie_data (line 214) | async def get_movie_data(self, storefront_id: str, movie_id: str) -> S... method _extract_itunes_movie_data (line 245) | def _extract_itunes_movie_data(self, playable_data: dict) -> Movie: method get_episode_data (line 284) | async def get_episode_data(self, storefront_id: str, episode_id: str) ... method get_season_data (line 287) | async def get_season_data(self, storefront_id: str, season_id: str, sh... method get_show_data (line 290) | async def get_show_data(self, storefront_id: str, show_id: str) -> Scr... method get_data (line 293) | async def get_data(self, url: str) -> ScrapedMediaResponse: FILE: isubrip/scrapers/itunes_scraper.py class ItunesScraper (line 20) | class ItunesScraper(HLSScraper): method __init__ (line 35) | def __init__(self, *args: Any, **kwargs: Any) -> None: method get_data (line 42) | async def get_data(self, url: str) -> ScrapedMediaResponse[Movie]: method parse_language_name (line 94) | def parse_language_name(media_data: Media) -> str | None: FILE: isubrip/scrapers/scraper.py class ScraperConfigBase (line 44) | class ScraperConfigBase(BaseModel, ABC): class DefaultScraperConfig (line 68) | class DefaultScraperConfig(ScraperConfigBase): class ScraperConfigSubcategory (line 87) | class ScraperConfigSubcategory(BaseModel, ABC): class Scraper (line 96) | class Scraper(ABC, metaclass=SingletonMeta): class ScraperConfig (line 128) | class ScraperConfig(ScraperConfigBase): method __init__ (line 150) | def __init__(self, timeout: int | float | None = None, user_agent: str... method _increment_requests_counter (line 206) | def _increment_requests_counter(self, request: httpx.Request) -> None:... method _async_increment_requests_counter (line 209) | async def _async_increment_requests_counter(self, request: httpx.Reque... method requests_count (line 213) | def requests_count(self) -> int: method match_url (line 218) | def match_url(cls, url: str, raise_error: Literal[True] = ...) -> re.M... method match_url (line 223) | def match_url(cls, url: str, raise_error: Literal[False] = ...) -> re.... method match_url (line 227) | def match_url(cls, url: str, raise_error: bool = False) -> re.Match | ... method async_close (line 254) | async def async_close(self) -> None: method get_data (line 258) | async def get_data(self, url: str) -> ScrapedMediaResponse: method download_subtitles (line 270) | async def download_subtitles(self, media_data: PlaylistMediaItem, subr... method find_matching_media (line 286) | def find_matching_media(self, main_playlist: MainPlaylist, method find_matching_subtitles (line 301) | def find_matching_subtitles(self, main_playlist: MainPlaylist, method load_playlist (line 316) | async def load_playlist(self, url: str | list[str], headers: dict | No... method detect_subtitles_type (line 333) | def detect_subtitles_type(subtitles_media: PlaylistMediaItem) -> Subti... method format_subtitles_description (line 347) | def format_subtitles_description(cls, subtitles_media: PlaylistMediaIt... class HLSScraper (line 362) | class HLSScraper(Scraper, ABC): class M3U8Attribute (line 364) | class M3U8Attribute(Enum): class ScraperConfig (line 405) | class ScraperConfig(Scraper.ScraperConfig): method __init__ (line 411) | def __init__(self, playlist_filters: dict[str, str | list[str] | None]... method parse_language_name (line 425) | def parse_language_name(media_data: m3u8.Media) -> str | None: method load_playlist (line 439) | async def load_playlist(self, url: str | list[str], headers: dict[str,... method detect_subtitles_type (line 468) | def detect_subtitles_type(subtitles_media: m3u8.Media) -> SubtitlesTyp... method download_subtitles (line 486) | async def download_subtitles(self, media_data: m3u8.Media, subrip_conv... method download_segments (line 534) | async def download_segments(self, playlist: m3u8.M3U8) -> list[bytes]: method find_matching_media (line 554) | def find_matching_media(self, main_playlist: m3u8.M3U8, method find_matching_subtitles (line 602) | def find_matching_subtitles(self, main_playlist: m3u8.M3U8, method format_subtitles_description (line 612) | def format_subtitles_description(cls, subtitles_media: m3u8.Media) -> ... class ScraperFactory (line 620) | class ScraperFactory: method get_initialized_scrapers (line 626) | def get_initialized_scrapers(cls) -> list[Scraper]: method get_scraper_classes (line 636) | def get_scraper_classes(cls) -> list[type[Scraper]]: method _get_scraper_instance (line 664) | def _get_scraper_instance(cls, scraper_class: type[ScraperT], kwargs: ... method get_scraper_instance (line 698) | def get_scraper_instance(cls, scraper_class: type[ScraperT], scraper_i... method get_scraper_instance (line 705) | def get_scraper_instance(cls, scraper_class: type[ScraperT], scraper_i... method get_scraper_instance (line 712) | def get_scraper_instance(cls, scraper_class: None = ..., scraper_id: s... method get_scraper_instance (line 719) | def get_scraper_instance(cls, scraper_class: None = ..., scraper_id: s... method get_scraper_instance (line 725) | def get_scraper_instance(cls, scraper_class: type[Scraper] | None = No... class ScraperError (line 782) | class ScraperError(Exception): class DownloadError (line 786) | class DownloadError(ScraperError): class PlaylistLoadError (line 790) | class PlaylistLoadError(ScraperError): class SubtitlesDownloadError (line 794) | class SubtitlesDownloadError(ScraperError): method __init__ (line 795) | def __init__(self, language_code: str | None, language_name: str | Non... FILE: isubrip/subtitle_formats/subrip.py class SubRipCaptionBlock (line 9) | class SubRipCaptionBlock(SubtitlesCaptionBlock): method __eq__ (line 11) | def __eq__(self, other: Any) -> bool: method __str__ (line 15) | def __str__(self) -> str: method to_srt (line 24) | def to_srt(self) -> SubRipCaptionBlock: class SubRipSubtitles (line 28) | class SubRipSubtitles(Subtitles[SubRipCaptionBlock]): method _dumps (line 32) | def _dumps(self) -> str: method _loads (line 40) | def _loads(self, data: str) -> None: FILE: isubrip/subtitle_formats/subtitles.py class SubtitlesBlock (line 23) | class SubtitlesBlock(ABC): method __init__ (line 31) | def __init__(self) -> None: method __copy__ (line 35) | def __copy__(self) -> SubtitlesBlock: method __eq__ (line 39) | def __eq__(self, other: Any) -> bool: method __str__ (line 43) | def __str__(self) -> str: class SubtitlesCaptionBlock (line 47) | class SubtitlesCaptionBlock(SubtitlesBlock, ABC): method __init__ (line 57) | def __init__(self, start_time: time, end_time: time, payload: str): method __copy__ (line 71) | def __copy__(self) -> SubtitlesCaptionBlock: method fix_rtl (line 76) | def fix_rtl(self) -> None: method to_srt (line 91) | def to_srt(self) -> SubRipCaptionBlock: class Subtitles (line 101) | class Subtitles(Generic[SubtitlesBlockT], ABC): method __init__ (line 115) | def __init__(self, data: bytes | None, language_code: str, encoding: s... method __add__ (line 136) | def __add__(self: SubtitlesT, obj: SubtitlesBlockT | SubtitlesT) -> Su... method __copy__ (line 157) | def __copy__(self: SubtitlesT) -> SubtitlesT: method __eq__ (line 165) | def __eq__(self, other: Any) -> bool: method __str__ (line 168) | def __str__(self) -> str: method _dump (line 171) | def _dump(self) -> bytes: method _dumps (line 181) | def _dumps(self) -> str: method _load (line 190) | def _load(self, data: bytes) -> None: method _loads (line 201) | def _loads(self, data: str) -> None: method dump (line 210) | def dump(self) -> bytes: method dumps (line 224) | def dumps(self) -> str: method add_blocks (line 238) | def add_blocks(self: SubtitlesT, method append_subtitles (line 266) | def append_subtitles(self: SubtitlesT, method polish (line 285) | def polish(self: SubtitlesT, method modified (line 321) | def modified(self) -> bool: method to_srt (line 330) | def to_srt(self) -> SubRipSubtitles: function split_timestamp (line 350) | def split_timestamp(timestamp: str) -> tuple[time, time]: FILE: isubrip/subtitle_formats/webvtt.py class WebVTTBlock (line 24) | class WebVTTBlock(SubtitlesBlock, metaclass=ABCMeta): class WebVTTCaptionBlock (line 31) | class WebVTTCaptionBlock(SubtitlesCaptionBlock, WebVTTBlock): method __init__ (line 37) | def __init__(self, start_time: time, end_time: time, payload: str, set... method __copy__ (line 51) | def __copy__(self) -> WebVTTCaptionBlock: method to_srt (line 57) | def to_srt(self) -> SubRipCaptionBlock: method __eq__ (line 72) | def __eq__(self, other: Any) -> bool: method __str__ (line 76) | def __str__(self) -> str: class WebVTTCommentBlock (line 94) | class WebVTTCommentBlock(WebVTTBlock): method __init__ (line 98) | def __init__(self, payload: str, inline: bool = False) -> None: method __copy__ (line 109) | def __copy__(self) -> WebVTTCommentBlock: method __eq__ (line 114) | def __eq__(self, other: Any) -> bool: method __str__ (line 117) | def __str__(self) -> str: class WebVTTStyleBlock (line 127) | class WebVTTStyleBlock(WebVTTBlock): method __init__ (line 131) | def __init__(self, payload: str) -> None: method __copy__ (line 141) | def __copy__(self) -> WebVTTStyleBlock: method __eq__ (line 146) | def __eq__(self, other: Any) -> bool: method __str__ (line 149) | def __str__(self) -> str: class WebVTTRegionBlock (line 153) | class WebVTTRegionBlock(WebVTTBlock): method __init__ (line 157) | def __init__(self, payload: str) -> None: method __copy__ (line 167) | def __copy__(self) -> WebVTTRegionBlock: method __eq__ (line 172) | def __eq__(self, other: Any) -> bool: method __str__ (line 175) | def __str__(self) -> str: class WebVTTSubtitles (line 179) | class WebVTTSubtitles(Subtitles[WebVTTBlock]): method _dumps (line 183) | def _dumps(self) -> str: method _loads (line 197) | def _loads(self, data: str) -> None: method append_subtitles (line 279) | def append_subtitles(self: WebVTTSubtitles, method remove_head_blocks (line 294) | def remove_head_blocks(self) -> None: FILE: isubrip/ui.py class MinsAndSecsTimeElapsedColumn (line 13) | class MinsAndSecsTimeElapsedColumn(TimeElapsedColumn): method render (line 16) | def render(self, task: Task) -> Text: FILE: isubrip/utils.py class SingletonMeta (line 38) | class SingletonMeta(ABCMeta): method __call__ (line 45) | def __call__(cls, *args: Any, **kwargs: Any) -> object: class TemporaryDirectory (line 52) | class TemporaryDirectory: method __init__ (line 60) | def __init__(self, directory_name: str | None = None): method __enter__ (line 68) | def __enter__(self) -> Path: method __exit__ (line 79) | def __exit__(self, exc_type: type[BaseException] | None, method cleanup (line 84) | def cleanup(self) -> None: function convert_epoch_to_datetime (line 96) | def convert_epoch_to_datetime(epoch_timestamp: int) -> dt.datetime: function convert_log_level (line 112) | def convert_log_level(log_level: str) -> int: function download_subtitles_to_file (line 132) | def download_subtitles_to_file(media_data: Movie | Episode, subtitles_da... function format_config_validation_error (line 184) | def format_config_validation_error(exc: ValidationError) -> str: function format_list (line 242) | def format_list(items: list[str], width: int = 80) -> str: function format_media_description (line 283) | def format_media_description(media_data: MediaBase, shortened: bool = Fa... function format_release_name (line 357) | def format_release_name(title: str, function format_subtitles_description (line 433) | def format_subtitles_description(language_code: str | None = None, langu... function get_model_field (line 464) | def get_model_field(model: BaseModel | None, field: str, convert_to_dict... function generate_non_conflicting_path (line 489) | def generate_non_conflicting_path(file_path: Path, has_extension: bool =... function merge_dict_values (line 523) | def merge_dict_values(*dictionaries: dict) -> dict: function raise_for_status (line 571) | def raise_for_status(response: httpx.Response) -> None: function parse_url_params (line 601) | def parse_url_params(url_params: str) -> dict: function return_first_valid (line 622) | def return_first_valid(*values: T | None, raise_error: Literal[True] = .... function return_first_valid (line 627) | def return_first_valid(*values: T | None, raise_error: Literal[False] = ... function return_first_valid (line 631) | def return_first_valid(*values: T | None, raise_error: bool = False) -> ... function single_string_to_list (line 654) | def single_string_to_list(item: str | list[str]) -> list[str]: function split_subtitles_timestamp (line 674) | def split_subtitles_timestamp(timestamp: str) -> tuple[dt.time, dt.time]: function slugify_title (line 697) | def slugify_title(title: str, separator: str = " ") -> str: function sanitize_path_segment (line 732) | def sanitize_path_segment(segment: str, platform: str | None = None) -> ... FILE: tests/benchmarks/download_benchmark.py function main (line 7) | def main() -> None: FILE: tests/benchmarks/download_benchmark_module.py function benchmark (line 13) | async def benchmark() -> None: FILE: tests/test_utils.py class TestSlugifyTitle (line 14) | class TestSlugifyTitle: method test_slugify_title (line 49) | def test_slugify_title(self, input_title: str, separator: str, expecte... class TestSanitizePath (line 53) | class TestSanitizePath: method test_sanitize_common_illegal_chars (line 66) | def test_sanitize_common_illegal_chars(self, name: str, expected_name:... method test_sanitize_platform_specific (line 83) | def test_sanitize_platform_specific(self, name: str, expected_unix: st... class TestFormatMediaDescription (line 91) | class TestFormatMediaDescription: method test_movie_with_datetime_and_id (line 92) | def test_movie_with_datetime_and_id(self) -> None: method test_series_with_year_no_id (line 96) | def test_series_with_year_no_id(self) -> None: method test_season_full_with_name_and_id (line 100) | def test_season_full_with_name_and_id(self) -> None: method test_season_full_with_name_and_id_and_extra_spaces (line 105) | def test_season_full_with_name_and_id_and_extra_spaces(self) -> None: method test_season_shortened_no_id (line 110) | def test_season_shortened_no_id(self) -> None: method test_episode_full_with_name_and_id (line 114) | def test_episode_full_with_name_and_id(self) -> None: method test_episode_shortened_no_id (line 119) | def test_episode_shortened_no_id(self) -> None: class TestFormatReleaseName (line 125) | class TestFormatReleaseName: method test_movie_with_source_and_web_default (line 126) | def test_movie_with_source_and_web_default(self) -> None: method test_movie_with_source_type_none (line 133) | def test_movie_with_source_type_none(self) -> None: method test_episode_with_source_web (line 141) | def test_episode_with_source_web(self) -> None: method test_episode_with_name_included (line 149) | def test_episode_with_name_included(self) -> None: method test_additional_info_language_and_subtitles_type_and_format_enum (line 158) | def test_additional_info_language_and_subtitles_type_and_format_enum(s... method test_movie_zip_with_source_and_web (line 169) | def test_movie_zip_with_source_and_web(self) -> None: FILE: tests/tools/generate_mock_data.py class MockDataGenerator (line 35) | class MockDataGenerator(ABC): method __init_subclass__ (line 39) | def __init_subclass__(cls, **kwargs: Any) -> None: method __init__ (line 54) | def __init__(self, scraper: Scraper): method output_path (line 58) | def output_path(self, url: str) -> Path: method generate (line 69) | async def generate(self, url: str, languages: list[str] | None = None,... class AppleTVMockDataGenerator (line 168) | class AppleTVMockDataGenerator(MockDataGenerator): method output_path (line 172) | def output_path(self, url: str) -> Path: function main (line 179) | async def main() -> None: FILE: tests/tools/mock_loader.py class MockLoader (line 11) | class MockLoader: method __init__ (line 15) | def __init__(self, mock_data_dir: Path | str, logger: logging.Logger |... method mock_send_handler (line 48) | async def mock_send_handler(self, request: httpx.Request, *args: Any, ...