跳转至

SonglistApi

modules.songlist.SonglistApi

SonglistApi(client: Client)

Bases: ApiModule

歌单相关 API.

Source code in qqmusic_api/modules/_base.py
def __init__(self, client: "Client") -> None:
    self._client = client
    self._session = client._session

get_detail

get_detail(
    songlist_id: int,
    dirid: int = 0,
    num: int = 10,
    page: int = 1,
    *,
    onlysong: bool = False,
    tag: bool = True,
    userinfo: bool = True,
)

获取歌单详细信息和歌曲原始数据.

PARAMETER DESCRIPTION
songlist_id

歌单 ID.

TYPE: int

dirid

目录 ID (可选).

TYPE: int DEFAULT: 0

num

返回歌曲数量.

TYPE: int DEFAULT: 10

page

页码.

TYPE: int DEFAULT: 1

onlysong

是否仅返回歌曲列表.

TYPE: bool DEFAULT: False

tag

是否返回标签信息.

TYPE: bool DEFAULT: True

userinfo

是否返回用户信息.

TYPE: bool DEFAULT: True

Source code in qqmusic_api/modules/songlist.py
def get_detail(
    self,
    songlist_id: int,
    dirid: int = 0,
    num: int = 10,
    page: int = 1,
    *,
    onlysong: bool = False,
    tag: bool = True,
    userinfo: bool = True,
):
    """获取歌单详细信息和歌曲原始数据.

    Args:
        songlist_id: 歌单 ID.
        dirid: 目录 ID (可选).
        num: 返回歌曲数量.
        page: 页码.
        onlysong: 是否仅返回歌曲列表.
        tag: 是否返回标签信息.
        userinfo: 是否返回用户信息.
    """
    return self._build_cgi(
        module="music.srfDissInfo.DissInfo",
        method="CgiGetDiss",
        param={
            "disstid": songlist_id,
            "dirid": dirid,
            "tag": tag,
            "song_begin": num * (page - 1),
            "song_num": num,
            "userinfo": userinfo,
            "orderlist": True,
            "onlysonglist": onlysong,
        },
        response_model=GetSonglistDetailResponse,
        pager_strategy=OffsetStrategy[GetSonglistDetailResponse](
            offset_key="song_begin",
            page_size_key="song_num",
            has_more_extractor=lambda r: bool(r.hasmore),
            total_extractor=lambda r: r.total,
            count_extractor=lambda response: len(response.songs),
        ),
    ).with_extractor(lambda r: r.songs)

create

create(
    dirname: str, *, credential: Credential | None = None
)

创建歌单.

Note

重名歌单并不会创建失败, 服务端会自动添加时间戳.

PARAMETER DESCRIPTION
dirname

歌单名称.

TYPE: str

credential

登录凭证.

TYPE: Credential | None DEFAULT: None

Source code in qqmusic_api/modules/songlist.py
def create(self, dirname: str, *, credential: Credential | None = None):
    """创建歌单.

    Note:
        重名歌单并不会创建失败, 服务端会自动添加时间戳.

    Args:
        dirname: 歌单名称.
        credential: 登录凭证.
    """
    return self._build_cgi(
        module="music.musicasset.PlaylistBaseWrite",
        method="AddPlaylist",
        param={"dirName": dirname},
        credential=credential,
        require_login=True,
        response_model=CreateDeleteSonglistResp,
    )

delete

delete(dirid: int, *, credential: Credential | None = None)

删除歌单.

Note

删除不存在歌单时返回的 dirid 为 0

PARAMETER DESCRIPTION
dirid

歌单目录 ID.

TYPE: int

credential

登录凭证.

TYPE: Credential | None DEFAULT: None

Source code in qqmusic_api/modules/songlist.py
def delete(self, dirid: int, *, credential: Credential | None = None):
    """删除歌单.

    Note:
        删除不存在歌单时返回的 dirid 为 0

    Args:
        dirid: 歌单目录 ID.
        credential: 登录凭证.
    """
    return self._build_cgi(
        module="music.musicasset.PlaylistBaseWrite",
        method="DelPlaylist",
        param={"dirId": dirid},
        credential=credential,
        require_login=True,
        response_model=CreateDeleteSonglistResp,
    )

add_songs async

add_songs(
    dirid: int,
    song_info: list[tuple[int, int]],
    *,
    tid: int = 0,
    credential: Credential | None = None,
) -> bool

添加歌曲到歌单.

PARAMETER DESCRIPTION
dirid

歌单目录 ID.

TYPE: int

song_info

歌曲信息列表, 每项为 (song_id, song_type).

TYPE: list[tuple[int, int]]

tid

歌单 TID.

TYPE: int DEFAULT: 0

credential

登录凭证.

TYPE: Credential | None DEFAULT: None

RETURNS DESCRIPTION
bool

操作成功与否 (歌曲已存在于歌单中也返回 True).

Source code in qqmusic_api/modules/songlist.py
async def add_songs(
    self,
    dirid: int,
    song_info: list[tuple[int, int]],
    *,
    tid: int = 0,
    credential: Credential | None = None,
) -> bool:
    """添加歌曲到歌单.

    Args:
        dirid: 歌单目录 ID.
        song_info: 歌曲信息列表, 每项为 `(song_id, song_type)`.
        tid: 歌单 TID.
        credential: 登录凭证.

    Returns:
        操作成功与否 (歌曲已存在于歌单中也返回 True).
    """
    try:
        data = await self._build_cgi(
            module="music.musicasset.PlaylistDetailWrite",
            method="AddSonglist",
            param=_build_songlist_oper_param(dirid=dirid, song_info=song_info, tid=tid),
            credential=credential,
            require_login=True,
            preserve_bool=True,
        )
        return data.get("retCode") == 0
    except CgiApiException as e:
        if e.code == 80092:
            return False
        raise

del_songs async

del_songs(
    dirid: int,
    song_info: list[tuple[int, int]],
    *,
    tid: int = 0,
    credential: Credential | None = None,
) -> bool

删除歌单中的歌曲.

PARAMETER DESCRIPTION
dirid

歌单目录 ID.

TYPE: int

song_info

歌曲信息列表, 每项为 (song_id, song_type).

TYPE: list[tuple[int, int]]

tid

歌单 TID.

TYPE: int DEFAULT: 0

credential

登录凭证.

TYPE: Credential | None DEFAULT: None

RETURNS DESCRIPTION
bool

操作成功与否 (歌曲不存在于歌单中也返回 True).

Source code in qqmusic_api/modules/songlist.py
async def del_songs(
    self,
    dirid: int,
    song_info: list[tuple[int, int]],
    *,
    tid: int = 0,
    credential: Credential | None = None,
) -> bool:
    """删除歌单中的歌曲.

    Args:
        dirid: 歌单目录 ID.
        song_info: 歌曲信息列表, 每项为 `(song_id, song_type)`.
        tid: 歌单 TID.
        credential: 登录凭证.

    Returns:
        操作成功与否 (歌曲不存在于歌单中也返回 True).
    """
    songs = song_info or []
    try:
        data = await self._build_cgi(
            module="music.musicasset.PlaylistDetailWrite",
            method="DelSonglist",
            param=_build_songlist_oper_param(dirid=dirid, song_info=songs, tid=tid),
            credential=credential,
            require_login=True,
        )
        return data.get("retCode") == 0
    except CgiApiException as e:
        if e.code == 80092:
            return False
        raise

like_song async

like_song(
    song_info: list[tuple[int, int]],
    *,
    credential: Credential | None = None,
) -> bool

收藏歌曲到 "我喜欢" 歌单.

Note

"我喜欢" 歌单的目录 ID 固定为 201, 本方法即以 dirid=201 调用 add_songs.

PARAMETER DESCRIPTION
song_info

歌曲信息列表, 每项为 (song_id, song_type).

TYPE: list[tuple[int, int]]

credential

登录凭证.

TYPE: Credential | None DEFAULT: None

RETURNS DESCRIPTION
bool

操作成功与否 (歌曲已在 "我喜欢" 中也返回 True).

Source code in qqmusic_api/modules/songlist.py
async def like_song(
    self,
    song_info: list[tuple[int, int]],
    *,
    credential: Credential | None = None,
) -> bool:
    """收藏歌曲到 "我喜欢" 歌单.

    Note:
        "我喜欢" 歌单的目录 ID 固定为 201, 本方法即以 dirid=201 调用 `add_songs`.

    Args:
        song_info: 歌曲信息列表, 每项为 `(song_id, song_type)`.
        credential: 登录凭证.

    Returns:
        操作成功与否 (歌曲已在 "我喜欢" 中也返回 True).
    """
    return await self.add_songs(201, song_info, credential=credential)

unlike_song async

unlike_song(
    song_info: list[tuple[int, int]],
    *,
    credential: Credential | None = None,
) -> bool

从 "我喜欢" 歌单移除歌曲.

Note

"我喜欢" 歌单的目录 ID 固定为 201, 本方法即以 dirid=201 调用 del_songs.

PARAMETER DESCRIPTION
song_info

歌曲信息列表, 每项为 (song_id, song_type).

TYPE: list[tuple[int, int]]

credential

登录凭证.

TYPE: Credential | None DEFAULT: None

RETURNS DESCRIPTION
bool

操作成功与否 (歌曲不在 "我喜欢" 中也返回 True).

Source code in qqmusic_api/modules/songlist.py
async def unlike_song(
    self,
    song_info: list[tuple[int, int]],
    *,
    credential: Credential | None = None,
) -> bool:
    """从 "我喜欢" 歌单移除歌曲.

    Note:
        "我喜欢" 歌单的目录 ID 固定为 201, 本方法即以 dirid=201 调用 `del_songs`.

    Args:
        song_info: 歌曲信息列表, 每项为 `(song_id, song_type)`.
        credential: 登录凭证.

    Returns:
        操作成功与否 (歌曲不在 "我喜欢" 中也返回 True).
    """
    return await self.del_songs(201, song_info, credential=credential)