跳转至

SingerApi

modules.singer.SingerApi

SingerApi(executor: RequestExecutor)

Bases: ApiModule

歌手相关 API.

Source code in qqmusic_api/modules/_base.py
def __init__(self, executor: RequestExecutor) -> None:
    """绑定请求执行器."""
    from ..core.client import Client

    self._executor = executor
    self._client = executor if isinstance(executor, Client) else None

get_singer_list

get_singer_list(
    area: int | AreaType = ALL,
    sex: int | SexType = ALL,
    genre: int | GenreType = ALL,
) -> CgiRequestData

获取歌手列表原始数据.

PARAMETER DESCRIPTION
area

地区类型.

TYPE: int | AreaType DEFAULT: ALL

sex

性别类型.

TYPE: int | SexType DEFAULT: ALL

genre

风格类型.

TYPE: int | GenreType DEFAULT: ALL

Source code in qqmusic_api/modules/singer.py
@cgi_endpoint(
    key="singer.get_singer_list",
    module="music.musichallSinger.SingerList",
    method="GetSingerList",
    response_model=SingerTypeListResponse,
)
def get_singer_list(
    self,
    area: int | AreaType = AreaType.ALL,
    sex: int | SexType = SexType.ALL,
    genre: int | GenreType = GenreType.ALL,
) -> CgiRequestData:
    """获取歌手列表原始数据.

    Args:
        area: 地区类型.
        sex: 性别类型.
        genre: 风格类型.
    """
    return CgiRequestData(
        param={
            "hastag": 0,
            "area": int(AreaType(area)),
            "sex": int(SexType(sex)),
            "genre": int(GenreType(genre)),
        },
    )

get_singer_list_index

get_singer_list_index(
    area: int | AreaType = ALL,
    sex: int | SexType = ALL,
    genre: int | GenreType = ALL,
    index: int | IndexType = ALL,
    page: int = 1,
    num: int = 80,
) -> CgiRequestData

获取按索引分页的歌手列表原始数据.

PARAMETER DESCRIPTION
area

地区类型.

TYPE: int | AreaType DEFAULT: ALL

sex

性别类型.

TYPE: int | SexType DEFAULT: ALL

genre

风格类型.

TYPE: int | GenreType DEFAULT: ALL

index

首字母索引.

TYPE: int | IndexType DEFAULT: ALL

page

页码.

TYPE: int DEFAULT: 1

num

每页返回数量.

TYPE: int DEFAULT: 80

Source code in qqmusic_api/modules/singer.py
@cgi_endpoint(
    key="singer.get_singer_list_index",
    module="music.musichallSinger.SingerList",
    method="GetSingerListIndex",
    response_model=SingerIndexPageResponse,
    item_type=SingerBrief,
)
def get_singer_list_index(
    self,
    area: int | AreaType = AreaType.ALL,
    sex: int | SexType = SexType.ALL,
    genre: int | GenreType = GenreType.ALL,
    index: int | IndexType = IndexType.ALL,
    page: int = 1,
    num: int = 80,
) -> CgiRequestData:
    """获取按索引分页的歌手列表原始数据.

    Args:
        area: 地区类型.
        sex: 性别类型.
        genre: 风格类型.
        index: 首字母索引.
        page: 页码.
        num: 每页返回数量.
    """
    return CgiRequestData(
        param={
            "area": int(AreaType(area)),
            "sex": int(SexType(sex)),
            "genre": int(GenreType(genre)),
            "index": int(IndexType(index)),
            "sin": (page - 1) * num,
            "cur_page": page,
        },
        pager_strategy=MultiFieldContinuationStrategy[SingerIndexPageResponse](
            lambda params, response: (
                None
                if not response.singerlist or params["sin"] + len(response.singerlist) >= (response.total or 0)
                else {
                    **cast("dict[str, int]", params),
                    "sin": cast("dict[str, int]", params)["sin"] + len(response.singerlist),
                    "cur_page": cast("dict[str, int]", params)["cur_page"] + 1,
                }
            ),
            context_name="singer_list_index",
        ),
        items_extractor=lambda r: r.singerlist,
    )

get_info

get_info(mid: str) -> CgiRequestData

获取歌手主页基本信息.

固定使用 Android 平台.

PARAMETER DESCRIPTION
mid

歌手 MID.

TYPE: str

Source code in qqmusic_api/modules/singer.py
@cgi_endpoint(
    key="singer.get_info",
    module="music.UnifiedHomepage.UnifiedHomepageSrv",
    method="GetHomepageHeader",
    platform=Platform.ANDROID,
    response_model=HomepageHeaderResponse,
)
def get_info(self, mid: str) -> CgiRequestData:
    """获取歌手主页基本信息.

    固定使用 Android 平台.

    Args:
        mid: 歌手 MID.
    """
    return CgiRequestData(
        param={"SingerMid": mid},
    )

get_tab_detail

get_tab_detail(
    mid: str,
    tab_type: Literal[VIDEO],
    page: int = 1,
    num: int = 10,
    order: OrderType | int = LATEST,
    extension: VideoExtension | None = None,
) -> PaginatedCgiRequest[HomepageTabDetailResponse]
get_tab_detail(
    mid: str,
    tab_type: Literal[ALBUM],
    page: int = 1,
    num: int = 10,
    order: OrderType | int = LATEST,
    extension: AlbumExtension | None = None,
) -> PaginatedCgiRequest[HomepageTabDetailResponse]
get_tab_detail(
    mid: str,
    tab_type: TabType,
    page: int = 1,
    num: int = 10,
    order: OrderType | int = LATEST,
) -> PaginatedCgiRequest[HomepageTabDetailResponse]
get_tab_detail(
    mid: str,
    tab_type: TabType,
    page: int = 1,
    num: int = 10,
    order: OrderType | int = LATEST,
    extension: VideoExtension
    | AlbumExtension
    | None = None,
) -> CgiRequestData

获取歌手主页特定 Tab 的详情原始数据.

PARAMETER DESCRIPTION
mid

歌手 MID.

TYPE: str

tab_type

Tab 类型.

TYPE: TabType

page

页码.

TYPE: int DEFAULT: 1

num

返回数量.

TYPE: int DEFAULT: 10

order

排序方式 (最新 / 最热).

TYPE: OrderType | int DEFAULT: LATEST

extension

Tab 请求扩展参数.

TYPE: VideoExtension | AlbumExtension | None DEFAULT: None

Source code in qqmusic_api/modules/singer.py
@cgi_endpoint(
    key="singer.get_tab_detail",
    module="music.UnifiedHomepage.UnifiedHomepageSrv",
    method="GetHomepageTabDetail",
    response_model=HomepageTabDetailResponse,
    pager=True,
)
def get_tab_detail(
    self,
    mid: str,
    tab_type: TabType,
    page: int = 1,
    num: int = 10,
    order: OrderType | int = OrderType.LATEST,
    extension: VideoExtension | AlbumExtension | None = None,
) -> CgiRequestData:
    """获取歌手主页特定 Tab 的详情原始数据.

    Args:
        mid: 歌手 MID.
        tab_type: Tab 类型.
        page: 页码.
        num: 返回数量.
        order: 排序方式 (最新 / 最热).
        extension: Tab 请求扩展参数.
    """
    param: dict[str, Any] = {
        "SingerMid": mid,
        "IsQueryTabDetail": 1,
        "TabID": tab_type.tab_id,
        "PageNum": page - 1,
        "PageSize": num,
        "Order": int(order),
    }
    if extension:
        param[tab_type.value[1].replace("Tab", "") + "Extension"] = extension
    return CgiRequestData(
        param=param,
        pager_strategy=PageStrategy[HomepageTabDetailResponse](
            page_key="PageNum",
            page_size=num,
            start_page=page - 1,
            has_more_extractor=lambda response: bool(response.has_more),
        ),
    )

get_desc

get_desc(
    mids: list[str],
    *,
    ex_singer: bool = True,
    wiki_singer: bool = True,
    group_singer: bool = True,
    pic: bool = True,
    photos: bool = True,
) -> CgiRequestData

获取歌手列表的描述信息.

PARAMETER DESCRIPTION
mids

歌手 MID 列表.

TYPE: list[str]

ex_singer

是否返回扩展描述信息.

TYPE: bool DEFAULT: True

wiki_singer

是否返回百科 XML 数据.

TYPE: bool DEFAULT: True

group_singer

是否返回组合成员信息.

TYPE: bool DEFAULT: True

pic

是否返回头像/立绘图片 URL.

TYPE: bool DEFAULT: True

photos

是否返回相册大图列表.

TYPE: bool DEFAULT: True

Source code in qqmusic_api/modules/singer.py
@cgi_endpoint(
    key="singer.get_desc",
    module="music.musichallSinger.SingerInfoInter",
    method="GetSingerDetail",
    response_model=SingerDetailResponse,
)
def get_desc(
    self,
    mids: list[str],
    *,
    ex_singer: bool = True,
    wiki_singer: bool = True,
    group_singer: bool = True,
    pic: bool = True,
    photos: bool = True,
) -> CgiRequestData:
    """获取歌手列表的描述信息.

    Args:
        mids: 歌手 MID 列表.
        ex_singer: 是否返回扩展描述信息.
        wiki_singer: 是否返回百科 XML 数据.
        group_singer: 是否返回组合成员信息.
        pic: 是否返回头像/立绘图片 URL.
        photos: 是否返回相册大图列表.
    """
    return CgiRequestData(
        param={
            "singer_mids": mids,
            "group_singer": group_singer,
            "wiki_singer": wiki_singer,
            "ex_singer": ex_singer,
            "pic": pic,
            "photos": photos,
        },
    )

get_similar

get_similar(mid: str, number: int = 10) -> CgiRequestData

获取相似歌手列表.

PARAMETER DESCRIPTION
mid

歌手 MID.

TYPE: str

number

返回相似歌手的数量.

TYPE: int DEFAULT: 10

Source code in qqmusic_api/modules/singer.py
@cgi_endpoint(
    key="singer.get_similar",
    module="music.SimilarSingerSvr",
    method="GetSimilarSingerList",
    response_model=SimilarSingerResponse,
)
def get_similar(self, mid: str, number: int = 10) -> CgiRequestData:
    """获取相似歌手列表.

    Args:
        mid: 歌手 MID.
        number: 返回相似歌手的数量.
    """
    return CgiRequestData(
        param={"singerMid": mid, "number": number},
    )

get_songs_list

get_songs_list(
    mid: str,
    num: int = 10,
    page: int = 1,
    order: OrderType | int = HOT,
) -> CgiRequestData

获取歌手的歌曲列表.

PARAMETER DESCRIPTION
mid

歌手 MID.

TYPE: str

num

返回歌曲数量.

TYPE: int DEFAULT: 10

page

分页页码.

TYPE: int DEFAULT: 1

order

排序方式.

TYPE: OrderType | int DEFAULT: HOT

Source code in qqmusic_api/modules/singer.py
@cgi_endpoint(
    key="singer.get_songs_list",
    module="musichall.song_list_server",
    method="GetSingerSongList",
    response_model=SingerSongListResponse,
    item_type=Song,
)
def get_songs_list(
    self,
    mid: str,
    num: int = 10,
    page: int = 1,
    order: OrderType | int = OrderType.HOT,
) -> CgiRequestData:
    """获取歌手的歌曲列表.

    Args:
        mid: 歌手 MID.
        num: 返回歌曲数量.
        page: 分页页码.
        order: 排序方式.
    """
    return CgiRequestData(
        param={"singerMid": mid, "order": int(order), "number": num, "begin": (page - 1) * num},
        pager_strategy=OffsetStrategy[SingerSongListResponse](
            offset_key="begin",
            page_size_key="number",
            total_extractor=lambda r: r.total_num,
            count_extractor=lambda r: len(r.song_list),
        ),
        items_extractor=lambda response: response.song_list,
    )

get_album_list

get_album_list(
    mid: str,
    num: int = 10,
    page: int = 1,
    order: OrderType | int = HOT,
) -> CgiRequestData

获取歌手的专辑列表.

PARAMETER DESCRIPTION
mid

歌手 MID.

TYPE: str

num

返回专辑数量.

TYPE: int DEFAULT: 10

page

分页页码.

TYPE: int DEFAULT: 1

order

排序方式.

TYPE: OrderType | int DEFAULT: HOT

Source code in qqmusic_api/modules/singer.py
@cgi_endpoint(
    key="singer.get_album_list",
    module="music.musichallAlbum.AlbumListServer",
    method="GetAlbumList",
    response_model=SingerAlbumListResponse,
    item_type=AlbumBrief,
)
def get_album_list(
    self,
    mid: str,
    num: int = 10,
    page: int = 1,
    order: OrderType | int = OrderType.HOT,
) -> CgiRequestData:
    """获取歌手的专辑列表.

    Args:
        mid: 歌手 MID.
        num: 返回专辑数量.
        page: 分页页码.
        order: 排序方式.
    """
    return CgiRequestData(
        param={"singerMid": mid, "order": int(order), "number": num, "begin": (page - 1) * num},
        pager_strategy=OffsetStrategy[SingerAlbumListResponse](
            offset_key="begin",
            page_size_key="number",
            total_extractor=lambda r: r.total,
            count_extractor=lambda r: len(r.album_list),
        ),
        items_extractor=lambda r: r.album_list,
    )

get_mv_list

get_mv_list(
    mid: str,
    num: int = 10,
    page: int = 1,
    order: OrderType | int = HOT,
) -> CgiRequestData

获取歌手 MV 列表数据.

PARAMETER DESCRIPTION
mid

歌手 MID.

TYPE: str

num

返回数量.

TYPE: int DEFAULT: 10

page

分页页码.

TYPE: int DEFAULT: 1

order

排序方式.

TYPE: OrderType | int DEFAULT: HOT

Source code in qqmusic_api/modules/singer.py
@cgi_endpoint(
    key="singer.get_mv_list",
    module="MvService.MvInfoProServer",
    method="GetSingerMvList",
    response_model=SingerMvListResponse,
    item_type=VideoBrief,
)
def get_mv_list(
    self,
    mid: str,
    num: int = 10,
    page: int = 1,
    order: OrderType | int = OrderType.HOT,
) -> CgiRequestData:
    """获取歌手 MV 列表数据.

    Args:
        mid: 歌手 MID.
        num: 返回数量.
        page: 分页页码.
        order: 排序方式.
    """
    return CgiRequestData(
        param={"singermid": mid, "order": order, "count": num, "start": (page - 1) * num},
        pager_strategy=OffsetStrategy[SingerMvListResponse](
            offset_key="start",
            page_size_key="count",
            total_extractor=lambda r: r.total,
            count_extractor=lambda r: len(r.mv_list),
        ),
        items_extractor=lambda r: r.mv_list,
    )