from __future__ import annotations
from collections.abc import Iterable
from typing import Any, Callable, Iterator, Optional

class exceptions:
    class PytubeError(Exception): ...

class Channel:
    channel_id: str

    def __init__(self, url: str) -> None:
        pass

class innertube:
    class InnerTube:
        base_url: str
        base_data: dict[str, str]
        base_params: dict[str, str]

        def _call_api(
            self, endpoint: str, params: dict[str, str], data: dict[str, str]
        ) -> dict[str, Any]: ...
        def __init__(self, client: str) -> None: ...

class Stream:
    resolution: str
    is_progressive: bool
    is_adaptive: bool
    abr: str
    def download(
        self,
        output_path: Optional[str] = None,
        filename_prefix: Optional[str] = None,
    ) -> str: ...

class StreamQuery(Iterable[Stream]):
    resolution: str
    def filter(
        self,
        type: Optional[str] = None,
        custom_filter_functions: Optional[
            list[Callable[[StreamQuery], bool]]
        ] = None,
        only_audio: bool = False,
    ) -> StreamQuery: ...
    def __iter__(self) -> Iterator[Stream]: ...

class YouTube:
    def __init__(self, url: str) -> None: ...

    length: int
    title: str
    author: str
    watch_url: str
    streams: StreamQuery

class Search:
    results: Optional[list[YouTube]]

    def __init__(self, query: str) -> None: ...