feat: tell which of my playlists contain a song

This commit is contained in:
DiheChen committed 2026-11-09 21:29:43 +08:00
1 parent b26019f459
commit cd84727b6b
19 files changed
+282 -3

No files matched your search

+19
View File
@@ -110,6 +110,10 @@ func DecodeMoveMyPlaylistItemsRequest(body []byte) (MoveMyPlaylistItemsRequest,
return decodeMoveMyPlaylistItemsRequest(body, "")
}
func DecodeListMyTrackPlaylistsRequest(body []byte) (ListMyTrackPlaylistsRequest, error) {
return decodeListMyTrackPlaylistsRequest(body, "")
}
func DecodeCreateRoomRequest(body []byte) (CreateRoomRequest, error) {
return decodeCreateRoomRequest(body, "")
}
@@ -574,6 +578,21 @@ func decodeHelloRequest(raw json.RawMessage, path string) (HelloRequest, error)
return v, nil
}
func decodeListMyTrackPlaylistsRequest(raw json.RawMessage, path string) (ListMyTrackPlaylistsRequest, error) {
var v ListMyTrackPlaylistsRequest
m, err := decodeObject(raw, path, "track")
if err != nil {
return v, err
}
if err = requireFields(m, path, "track"); err != nil {
return v, err
}
if v.Track, err = decodeTrack(m["track"], field(path, "track")); err != nil {
return v, err
}
return v, nil
}
func decodeLoginRequest(raw json.RawMessage, path string) (LoginRequest, error) {
var v LoginRequest
m, err := decodeObject(raw, path, "password", "username")
+23
View File
@@ -979,6 +979,29 @@
"required": ["tracks"]
}
},
{
"name": "listMyTrackPlaylists",
"description": "这首歌在我的哪些歌单里",
"method": "POST",
"path": "/api/me/playlist-memberships",
"auth": "member",
"request": {
"type": "object",
"additionalProperties": false,
"properties": {
"track": {"$ref": "#/$defs/Track"}
},
"required": ["track"]
},
"response": {
"type": "object",
"additionalProperties": false,
"properties": {
"playlistIds": {"type": "array", "items": {"type": "string"}}
},
"required": ["playlistIds"]
}
},
{
"name": "listRooms",
"description": "房间列表",
+71 -1
View File
@@ -743,6 +743,33 @@
],
"type": "object"
},
"ListMyTrackPlaylistsRequest": {
"additionalProperties": false,
"properties": {
"track": {
"$ref": "#/components/schemas/Track"
}
},
"required": [
"track"
],
"type": "object"
},
"ListMyTrackPlaylistsResponse": {
"additionalProperties": false,
"properties": {
"playlistIds": {
"items": {
"type": "string"
},
"type": "array"
}
},
"required": [
"playlistIds"
],
"type": "object"
},
"ListRoomsResponse": {
"additionalProperties": false,
"properties": {
@@ -1714,7 +1741,7 @@
},
"info": {
"title": "Alisten",
"version": "000976bd80c1113a"
"version": "5b9cd2cb39780e46"
},
"openapi": "3.1.0",
"paths": {
@@ -2851,6 +2878,49 @@
"summary": "修改昵称和头像;email 用来计算头像哈希,已注册的账号同时保存它,去掉首尾空白后应形如 name@example.com,空字符串表示清除"
}
},
"/api/me/playlist-memberships": {
"post": {
"operationId": "listMyTrackPlaylists",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListMyTrackPlaylistsRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListMyTrackPlaylistsResponse"
}
}
},
"description": "成功"
},
"default": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
},
"description": "失败"
}
},
"security": [
{
"memberToken": []
}
],
"summary": "这首歌在我的哪些歌单里"
}
},
"/api/me/playlists": {
"get": {
"operationId": "listMyPlaylists",
+18 -1
View File
@@ -4,7 +4,7 @@ package protocol
import "encoding/json"
const Version = "000976bd80c1113a"
const Version = "5b9cd2cb39780e46"
type APIKey struct {
Key string `json:"key"`
@@ -298,6 +298,22 @@ func (v ListMyPlaylistsResponse) MarshalJSON() ([]byte, error) {
return json.Marshal(plain(v))
}
type ListMyTrackPlaylistsRequest struct {
Track Track `json:"track"`
}
type ListMyTrackPlaylistsResponse struct {
PlaylistIds []string `json:"playlistIds"`
}
func (v ListMyTrackPlaylistsResponse) MarshalJSON() ([]byte, error) {
type plain ListMyTrackPlaylistsResponse
if v.PlaylistIds == nil {
v.PlaylistIds = []string{}
}
return json.Marshal(plain(v))
}
type ListRoomsResponse struct {
Items []RoomListing `json:"items"`
}
@@ -765,6 +781,7 @@ var (
RouteRemoveMyPlaylistItems = Route{Pattern: "POST /api/me/playlists/{id}/removals", Auth: AuthMember, Status: 204}
RouteCopyMyPlaylistItems = Route{Pattern: "POST /api/me/playlists/{id}/copies", Auth: AuthMember, Status: 200}
RouteMoveMyPlaylistItems = Route{Pattern: "POST /api/me/playlists/{id}/moves", Auth: AuthMember, Status: 204}
RouteListMyTrackPlaylists = Route{Pattern: "POST /api/me/playlist-memberships", Auth: AuthMember, Status: 200}
RouteListRooms = Route{Pattern: "GET /api/rooms", Auth: AuthNone, Status: 200}
RouteGetRoom = Route{Pattern: "GET /api/rooms/{ref}", Auth: AuthNone, Status: 200}
RouteCreateRoom = Route{Pattern: "POST /api/rooms", Auth: AuthNone, Status: 201, Location: true}