mirror of
https://github.com/ragestudio/comty.js.git
synced 2025-06-09 10:34:19 +00:00
Revamp Music API, add E2E, update Spectrum and User
Music model: new method structure, updated API endpoints (tracks, releases, lyrics, library). E2E (wip): new model for encryption key pair management. Spectrum: updated API to support new spectrum api. User: added public key management. Session, Auth, Radio: minor API enhancements.
This commit is contained in:
parent
511a81e313
commit
e035e6bde4
@ -42,7 +42,6 @@ export function createClient({
|
|||||||
mainOrigin: origin,
|
mainOrigin: origin,
|
||||||
baseRequest: null,
|
baseRequest: null,
|
||||||
ws: null,
|
ws: null,
|
||||||
rest: null,
|
|
||||||
version: pkg.version,
|
version: pkg.version,
|
||||||
addons: new AddonsManager(),
|
addons: new AddonsManager(),
|
||||||
})
|
})
|
||||||
|
@ -35,7 +35,7 @@ export default class AuthModel {
|
|||||||
SessionModel.refreshToken = response.data.refreshToken
|
SessionModel.refreshToken = response.data.refreshToken
|
||||||
|
|
||||||
if (typeof callback === "function") {
|
if (typeof callback === "function") {
|
||||||
await callback()
|
await callback(response.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
__comty_shared_state.eventBus.emit("auth:login_success")
|
__comty_shared_state.eventBus.emit("auth:login_success")
|
||||||
|
30
src/models/e2e/index.js
Normal file
30
src/models/e2e/index.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import SessionModel from "../session"
|
||||||
|
import request from "../../request"
|
||||||
|
|
||||||
|
export default class E2EModel {
|
||||||
|
static async getKeyPair() {
|
||||||
|
const response = await request({
|
||||||
|
method: "GET",
|
||||||
|
url: "/users/self/keypair",
|
||||||
|
})
|
||||||
|
|
||||||
|
return response.data
|
||||||
|
}
|
||||||
|
|
||||||
|
// WARNING: updating keypair makes all decryption fail
|
||||||
|
static async updateKeyPair(str, { imSure = false } = {}) {
|
||||||
|
if (imSure !== true) {
|
||||||
|
throw new Error(
|
||||||
|
"Missing confirmation to update the keypair. Use `imSure = true` to proceed.",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await request({
|
||||||
|
method: "POST",
|
||||||
|
url: "/users/self/keypair",
|
||||||
|
data: { str: str },
|
||||||
|
})
|
||||||
|
|
||||||
|
return response.data
|
||||||
|
}
|
||||||
|
}
|
@ -1,11 +0,0 @@
|
|||||||
import request from "../../../request"
|
|
||||||
|
|
||||||
export default async () => {
|
|
||||||
const response = await request({
|
|
||||||
method: "GET",
|
|
||||||
url: "/music/playlists/featured",
|
|
||||||
})
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
return response.data
|
|
||||||
}
|
|
25
src/models/music/getters/isItemFavorited.js
Normal file
25
src/models/music/getters/isItemFavorited.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import request from "../../../request"
|
||||||
|
|
||||||
|
export default async (type, item_id) => {
|
||||||
|
if (!type) {
|
||||||
|
throw new Error("type is required")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!item_id) {
|
||||||
|
throw new Error("item_id is required")
|
||||||
|
}
|
||||||
|
|
||||||
|
type = type.toLowerCase()
|
||||||
|
|
||||||
|
const response = await request({
|
||||||
|
method: "GET",
|
||||||
|
url: `/music/my/library/favorite`,
|
||||||
|
params: {
|
||||||
|
kind: type,
|
||||||
|
item_id: item_id,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
return response.data
|
||||||
|
}
|
@ -1,33 +0,0 @@
|
|||||||
import request from "../../../request"
|
|
||||||
|
|
||||||
const typeToNamespace = {
|
|
||||||
track: "tracks",
|
|
||||||
//playlist: "playlists",
|
|
||||||
//release: "releases",
|
|
||||||
}
|
|
||||||
|
|
||||||
export default async (type, track_id) => {
|
|
||||||
if (!type) {
|
|
||||||
throw new Error("type is required")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!track_id) {
|
|
||||||
throw new Error("track_id is required")
|
|
||||||
}
|
|
||||||
|
|
||||||
type = type.toLowerCase()
|
|
||||||
|
|
||||||
type = typeToNamespace[type]
|
|
||||||
|
|
||||||
if (!type) {
|
|
||||||
throw new Error(`Unsupported type: ${type}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const response = await request({
|
|
||||||
method: "GET",
|
|
||||||
url: `/music/${type}/${track_id}/is_favourite`,
|
|
||||||
})
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
return response.data
|
|
||||||
}
|
|
@ -2,24 +2,24 @@ import request from "../../../request"
|
|||||||
import processAddons from "../../../helpers/processWithAddons"
|
import processAddons from "../../../helpers/processWithAddons"
|
||||||
import standartListMerge from "../../../utils/standartListMerge"
|
import standartListMerge from "../../../utils/standartListMerge"
|
||||||
|
|
||||||
export default async ({ limit = 100, offset = 0, order = "desc" }) => {
|
export default async ({ limit = 100, offset = 0, order = "desc", kind }) => {
|
||||||
const addons =
|
const addons = __comty_shared_state.addons.getByOperation("getMyLibrary")
|
||||||
__comty_shared_state.addons.getByOperation("getFavoriteFolder")
|
|
||||||
|
|
||||||
const dividedLimit = limit / (addons.length + 1)
|
const dividedLimit = limit / (addons.length + 1)
|
||||||
|
|
||||||
const { data } = await request({
|
const { data } = await request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: "/music/my/folder",
|
url: "/music/my/library",
|
||||||
params: {
|
params: {
|
||||||
limit: dividedLimit,
|
limit: dividedLimit,
|
||||||
offset: offset,
|
offset: offset,
|
||||||
order: order,
|
order: order,
|
||||||
|
kind: kind,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
let results = await processAddons({
|
let results = await processAddons({
|
||||||
operation: "getFavoriteFolder",
|
operation: "getMyLibrary",
|
||||||
initialData: data,
|
initialData: data,
|
||||||
fnArguments: [{ limit: dividedLimit, offset: offset, order: order }],
|
fnArguments: [{ limit: dividedLimit, offset: offset, order: order }],
|
||||||
normalizeAddonResult: ({ currentData, addonResult }) => {
|
normalizeAddonResult: ({ currentData, addonResult }) => {
|
||||||
@ -27,7 +27,8 @@ export default async ({ limit = 100, offset = 0, order = "desc" }) => {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
// sort by liked_at
|
// sort tracks by liked_at
|
||||||
|
if (results.tracks) {
|
||||||
results.tracks.items.sort((a, b) => {
|
results.tracks.items.sort((a, b) => {
|
||||||
if (a.liked_at > b.liked_at) {
|
if (a.liked_at > b.liked_at) {
|
||||||
return -1
|
return -1
|
||||||
@ -37,6 +38,7 @@ export default async ({ limit = 100, offset = 0, order = "desc" }) => {
|
|||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
return results
|
return results
|
||||||
}
|
}
|
@ -6,19 +6,15 @@ type Arguments = {
|
|||||||
keywords: String
|
keywords: String
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async ({
|
export default async ({ limit, offset, keywords }: Arguments) => {
|
||||||
limit,
|
|
||||||
offset,
|
|
||||||
keywords,
|
|
||||||
}: Arguments) => {
|
|
||||||
const response = await request({
|
const response = await request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: "/music/releases/self",
|
url: "/music/my/releases",
|
||||||
params: {
|
params: {
|
||||||
limit: limit,
|
limit: limit,
|
||||||
offset: offset,
|
offset: offset,
|
||||||
keywords: keywords,
|
keywords: keywords,
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
@ -1,11 +0,0 @@
|
|||||||
import request from "../../../request"
|
|
||||||
|
|
||||||
export default async (id: String) => {
|
|
||||||
const response = await request({
|
|
||||||
method: "GET",
|
|
||||||
url: `/music/playlists/${id}/data`,
|
|
||||||
})
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
return response.data
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
import request from "../../../request"
|
|
||||||
|
|
||||||
export default async (id: String) => {
|
|
||||||
const response = await request({
|
|
||||||
method: "GET",
|
|
||||||
url: `/music/playlists/${id}/items`,
|
|
||||||
})
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
return response.data
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
import request from "../../../request"
|
|
||||||
|
|
||||||
type Arguments = {
|
|
||||||
keywords: String
|
|
||||||
user_id: String
|
|
||||||
limit: Number
|
|
||||||
offset: Number
|
|
||||||
}
|
|
||||||
|
|
||||||
export default async ({
|
|
||||||
keywords,
|
|
||||||
user_id,
|
|
||||||
limit,
|
|
||||||
offset,
|
|
||||||
}: Arguments) => {
|
|
||||||
const response = await request({
|
|
||||||
method: "GET",
|
|
||||||
url: "/music/playlists",
|
|
||||||
params: {
|
|
||||||
keywords: keywords,
|
|
||||||
user_id: user_id,
|
|
||||||
limit: limit,
|
|
||||||
offset: offset,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
return response.data
|
|
||||||
}
|
|
@ -1,27 +1,20 @@
|
|||||||
import request from "../../../request"
|
import request from "../../../request"
|
||||||
|
|
||||||
type Arguments = {
|
type Arguments = {
|
||||||
keywords: String
|
|
||||||
user_id: String
|
user_id: String
|
||||||
limit: Number
|
limit: Number
|
||||||
offset: Number
|
page: Number
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async ({
|
export default async ({ user_id, limit, page }: Arguments) => {
|
||||||
keywords,
|
|
||||||
user_id,
|
|
||||||
limit,
|
|
||||||
offset,
|
|
||||||
}: Arguments) => {
|
|
||||||
const response = await request({
|
const response = await request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: "/music/releases",
|
url: "/music/releases",
|
||||||
params: {
|
params: {
|
||||||
keywords: keywords,
|
|
||||||
user_id: user_id,
|
user_id: user_id,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
offset: offset,
|
page: page,
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
@ -12,7 +12,7 @@ export default async (
|
|||||||
id: String,
|
id: String,
|
||||||
options: RequestOptions = {
|
options: RequestOptions = {
|
||||||
preferTranslation: false,
|
preferTranslation: false,
|
||||||
}
|
},
|
||||||
) => {
|
) => {
|
||||||
const requestParams: RequestParams = Object()
|
const requestParams: RequestParams = Object()
|
||||||
|
|
||||||
@ -22,8 +22,8 @@ export default async (
|
|||||||
|
|
||||||
const response = await request({
|
const response = await request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: `/music/lyrics/${id}`,
|
url: `/music/tracks/${id}/lyrics`,
|
||||||
params: requestParams
|
params: requestParams,
|
||||||
})
|
})
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
@ -1,27 +1,20 @@
|
|||||||
import request from "../../../request"
|
import request from "../../../request"
|
||||||
|
|
||||||
type Arguments = {
|
type Arguments = {
|
||||||
keywords: String
|
|
||||||
user_id: String
|
user_id: String
|
||||||
limit: Number
|
limit: Number
|
||||||
offset: Number
|
page: Number
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async ({
|
export default async ({ user_id, limit, page }: Arguments) => {
|
||||||
keywords,
|
|
||||||
user_id,
|
|
||||||
limit,
|
|
||||||
offset,
|
|
||||||
}: Arguments) => {
|
|
||||||
const response = await request({
|
const response = await request({
|
||||||
method: "GET",
|
method: "GET",
|
||||||
url: "/music/tracks",
|
url: "/music/tracks",
|
||||||
params: {
|
params: {
|
||||||
keywords: keywords,
|
|
||||||
user_id: user_id,
|
user_id: user_id,
|
||||||
limit: limit,
|
limit: limit,
|
||||||
offset: offset,
|
page: page,
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
@ -5,147 +5,34 @@ export default class MusicModel {
|
|||||||
static Getters = Getters
|
static Getters = Getters
|
||||||
static Setters = Setters
|
static Setters = Setters
|
||||||
|
|
||||||
/**
|
// track related methods
|
||||||
* Performs a search based on the provided keywords, with optional parameters for limiting the number of results and pagination.
|
static getMyTracks = null
|
||||||
*
|
static getAllTracks = Getters.tracks
|
||||||
* @param {string} keywords - The keywords to search for.
|
|
||||||
* @param {object} options - An optional object containing additional parameters.
|
|
||||||
* @param {number} options.limit - The maximum number of results to return. Defaults to 5.
|
|
||||||
* @param {number} options.offset - The offset to start returning results from. Defaults to 0.
|
|
||||||
* @param {boolean} options.useTidal - Whether to use Tidal for the search. Defaults to false.
|
|
||||||
* @return {Promise<Object>} The search results.
|
|
||||||
*/
|
|
||||||
static search = Getters.search
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves playlist items based on the provided parameters.
|
|
||||||
*
|
|
||||||
* @param {Object} options - The options object.
|
|
||||||
* @param {string} options.playlist_id - The ID of the playlist.
|
|
||||||
* @param {string} options.service - The service from which to retrieve the playlist items.
|
|
||||||
* @param {number} options.limit - The maximum number of items to retrieve.
|
|
||||||
* @param {number} options.offset - The number of items to skip before retrieving.
|
|
||||||
* @return {Promise<Object>} Playlist items data.
|
|
||||||
*/
|
|
||||||
static getPlaylistItems = Getters.PlaylistItems
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves playlist data based on the provided parameters.
|
|
||||||
*
|
|
||||||
* @param {Object} options - The options object.
|
|
||||||
* @param {string} options.playlist_id - The ID of the playlist.
|
|
||||||
* @param {string} options.service - The service to use.
|
|
||||||
* @param {number} options.limit - The maximum number of items to retrieve.
|
|
||||||
* @param {number} options.offset - The offset for pagination.
|
|
||||||
* @return {Promise<Object>} Playlist data.
|
|
||||||
*/
|
|
||||||
static getPlaylistData = Getters.PlaylistData
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves releases based on the provided parameters.
|
|
||||||
* If user_id is not provided, it will retrieve self authenticated user releases.
|
|
||||||
*
|
|
||||||
* @param {object} options - The options for retrieving releases.
|
|
||||||
* @param {string} options.user_id - The ID of the user.
|
|
||||||
* @param {string[]} options.keywords - The keywords to filter releases by.
|
|
||||||
* @param {number} options.limit - The maximum number of releases to retrieve.
|
|
||||||
* @param {number} options.offset - The offset for paginated results.
|
|
||||||
* @return {Promise<Object>} - A promise that resolves to the retrieved releases.
|
|
||||||
*/
|
|
||||||
static getReleases = Getters.releases
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves self releases.
|
|
||||||
*
|
|
||||||
* @param {object} options - The options for retrieving my releases.
|
|
||||||
* @param {number} options.limit - The maximum number of releases to retrieve.
|
|
||||||
* @param {number} options.offset - The offset for paginated results.
|
|
||||||
* @return {Promise<Object>} - A promise that resolves to the retrieved releases.
|
|
||||||
*/
|
|
||||||
static getMyReleases = Getters.myReleases
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves release data by ID.
|
|
||||||
*
|
|
||||||
* @param {number} id - The ID of the release.
|
|
||||||
* @return {Promise<Object>} The release data.
|
|
||||||
*/
|
|
||||||
static getReleaseData = Getters.releaseData
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves track data for a given ID.
|
|
||||||
*
|
|
||||||
* @param {string} id - The ID of the track or multiple IDs separated by commas.
|
|
||||||
* @return {Promise<Object>} The track data.
|
|
||||||
*/
|
|
||||||
static getTrackData = Getters.trackData
|
static getTrackData = Getters.trackData
|
||||||
|
static putTrack = Setters.putTrack
|
||||||
|
static deleteTrack = null
|
||||||
|
|
||||||
/**
|
// lyrics related methods
|
||||||
* Retrieves the official featured playlists.
|
|
||||||
*
|
|
||||||
* @return {Promise<Object>} The data containing the featured playlists.
|
|
||||||
*/
|
|
||||||
static getFeaturedPlaylists = Getters.featuredPlaylists
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves track lyrics for a given ID.
|
|
||||||
*
|
|
||||||
* @param {string} id - The ID of the track.
|
|
||||||
* @return {Promise<Object>} The track lyrics.
|
|
||||||
*/
|
|
||||||
static getTrackLyrics = Getters.trackLyrics
|
static getTrackLyrics = Getters.trackLyrics
|
||||||
|
|
||||||
|
|
||||||
static putTrackLyrics = Setters.putTrackLyrics
|
static putTrackLyrics = Setters.putTrackLyrics
|
||||||
|
|
||||||
/**
|
// release related methods
|
||||||
* Create or modify a track.
|
static getMyReleases = Getters.myReleases
|
||||||
*
|
static getAllReleases = Getters.releases
|
||||||
* @param {object} TrackManifest - The track manifest.
|
static getReleaseData = Getters.releaseData
|
||||||
* @return {Promise<Object>} The result track data.
|
|
||||||
*/
|
|
||||||
static putTrack = Setters.putTrack
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create or modify a release.
|
|
||||||
*
|
|
||||||
* @param {object} ReleaseManifest - The release manifest.
|
|
||||||
* @return {Promise<Object>} The result release data.
|
|
||||||
*/
|
|
||||||
static putRelease = Setters.putRelease
|
static putRelease = Setters.putRelease
|
||||||
|
|
||||||
/**
|
|
||||||
* Deletes a release by its ID.
|
|
||||||
*
|
|
||||||
* @param {string} id - The ID of the release to delete.
|
|
||||||
* @return {Promise<Object>} - A Promise that resolves to the data returned by the API.
|
|
||||||
*/
|
|
||||||
static deleteRelease = Setters.deleteRelease
|
static deleteRelease = Setters.deleteRelease
|
||||||
|
|
||||||
/**
|
// library related methods
|
||||||
* Retrieves the favourite tracks of the current user.
|
static getMyLibrary = Getters.library
|
||||||
*
|
static toggleItemFavorite = Setters.toggleItemFavorite
|
||||||
* @return {Promise<Object>} The favorite tracks data.
|
static isItemFavorited = Getters.isItemFavorited
|
||||||
*/
|
|
||||||
static getFavouriteTracks = null
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieves the favourite tracks/playlists/releases of the current user.
|
|
||||||
*
|
|
||||||
* @return {Promise<Object>} The favorite playlists data.
|
|
||||||
*/
|
|
||||||
static getFavouriteFolder = Getters.favouriteFolder
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Toggles the favourite status of a track, playlist or folder.
|
|
||||||
*
|
|
||||||
* @param {string} track_id - The ID of the track to toggle the favorite status.
|
|
||||||
* @throws {Error} If the track_id is not provided.
|
|
||||||
* @return {Promise<Object>} The response data after toggling the favorite status.
|
|
||||||
*/
|
|
||||||
static toggleItemFavourite = Setters.toggleItemFavourite
|
|
||||||
|
|
||||||
static isItemFavourited = Getters.isItemFavourited
|
|
||||||
|
|
||||||
|
// other methods
|
||||||
static getRecentyPlayed = Getters.recentlyPlayed
|
static getRecentyPlayed = Getters.recentlyPlayed
|
||||||
|
static search = Getters.search
|
||||||
|
|
||||||
|
// aliases
|
||||||
|
static toggleItemFavourite = MusicModel.toggleItemFavorite
|
||||||
|
static isItemFavourited = MusicModel.isItemFavorited
|
||||||
}
|
}
|
@ -3,7 +3,7 @@ import request from "../../../request"
|
|||||||
export default async (track_id, data) => {
|
export default async (track_id, data) => {
|
||||||
const response = await request({
|
const response = await request({
|
||||||
method: "put",
|
method: "put",
|
||||||
url: `/music/lyrics/${track_id}`,
|
url: `/music/tracks/${track_id}/lyrics`,
|
||||||
data: data,
|
data: data,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
26
src/models/music/setters/toggleItemFavorite.js
Normal file
26
src/models/music/setters/toggleItemFavorite.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import request from "../../../request"
|
||||||
|
|
||||||
|
export default async (type, item_id, to) => {
|
||||||
|
if (!type) {
|
||||||
|
throw new Error("type is required")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!item_id) {
|
||||||
|
throw new Error("item_id is required")
|
||||||
|
}
|
||||||
|
|
||||||
|
type = type.toLowerCase()
|
||||||
|
|
||||||
|
const response = await request({
|
||||||
|
method: "PUT",
|
||||||
|
url: `/music/my/library/favorite`,
|
||||||
|
data: {
|
||||||
|
item_id: item_id,
|
||||||
|
kind: type,
|
||||||
|
to: to,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
return response.data
|
||||||
|
}
|
@ -1,36 +0,0 @@
|
|||||||
import request from "../../../request"
|
|
||||||
|
|
||||||
const typeToNamespace = {
|
|
||||||
track: "tracks",
|
|
||||||
//playlist: "playlists",
|
|
||||||
//release: "releases",
|
|
||||||
}
|
|
||||||
|
|
||||||
export default async (type, track_id, to) => {
|
|
||||||
if (!type) {
|
|
||||||
throw new Error("type is required")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!track_id) {
|
|
||||||
throw new Error("track_id is required")
|
|
||||||
}
|
|
||||||
|
|
||||||
type = type.toLowerCase()
|
|
||||||
|
|
||||||
type = typeToNamespace[type]
|
|
||||||
|
|
||||||
if (!type) {
|
|
||||||
throw new Error(`Unsupported type: ${type}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
const response = await request({
|
|
||||||
method: "post",
|
|
||||||
url: `/music/${type}/${track_id}/favourite`,
|
|
||||||
data: {
|
|
||||||
to: to,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
return response.data
|
|
||||||
}
|
|
10
src/models/radio/getters/trendings.js
Normal file
10
src/models/radio/getters/trendings.js
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import request from "../../../request"
|
||||||
|
|
||||||
|
export default async () => {
|
||||||
|
const { data } = await request({
|
||||||
|
method: "GET",
|
||||||
|
url: "/music/radio/trendings",
|
||||||
|
})
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
import getRadioList from "./getters/list"
|
import getRadioList from "./getters/list"
|
||||||
|
import getTrendings from "./getters/trendings"
|
||||||
|
|
||||||
export default class Radio {
|
export default class Radio {
|
||||||
static getRadioList = getRadioList
|
static getRadioList = getRadioList
|
||||||
|
static getTrendings = getTrendings
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,7 @@ export default class Session {
|
|||||||
static async getAllSessions() {
|
static async getAllSessions() {
|
||||||
const response = await request({
|
const response = await request({
|
||||||
method: "get",
|
method: "get",
|
||||||
url: "/sessions/all"
|
url: "/sessions/all",
|
||||||
})
|
})
|
||||||
|
|
||||||
return response.data
|
return response.data
|
||||||
@ -113,7 +113,7 @@ export default class Session {
|
|||||||
static async getCurrentSession() {
|
static async getCurrentSession() {
|
||||||
const response = await request({
|
const response = await request({
|
||||||
method: "get",
|
method: "get",
|
||||||
url: "/sessions/current"
|
url: "/sessions/current",
|
||||||
})
|
})
|
||||||
|
|
||||||
return response.data
|
return response.data
|
||||||
@ -134,7 +134,7 @@ export default class Session {
|
|||||||
|
|
||||||
const response = await request({
|
const response = await request({
|
||||||
method: "delete",
|
method: "delete",
|
||||||
url: "/sessions/current"
|
url: "/sessions/current",
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
|
|
||||||
@ -148,8 +148,13 @@ export default class Session {
|
|||||||
return response.data
|
return response.data
|
||||||
}
|
}
|
||||||
|
|
||||||
static async destroyAllSessions() {
|
static async destroyAll() {
|
||||||
throw new Error("Not implemented")
|
const response = await request({
|
||||||
|
method: "delete",
|
||||||
|
url: "/sessions/all",
|
||||||
|
})
|
||||||
|
|
||||||
|
return response.data
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
import axios from "axios"
|
import axios from "axios"
|
||||||
|
import { RTEngineClient } from "linebridge-client/src"
|
||||||
|
|
||||||
import SessionModel from "../session"
|
import SessionModel from "../session"
|
||||||
import UserModel from "../user"
|
import UserModel from "../user"
|
||||||
import { RTEngineClient } from "linebridge-client/src"
|
|
||||||
//import { RTEngineClient } from "../../../../linebridge/client/src"
|
|
||||||
|
|
||||||
async function injectUserDataOnList(list) {
|
async function injectUserDataOnList(list) {
|
||||||
if (!Array.isArray(list)) {
|
if (!Array.isArray(list)) {
|
||||||
@ -73,7 +73,7 @@ export default class Streaming {
|
|||||||
|
|
||||||
const { data } = await Streaming.base({
|
const { data } = await Streaming.base({
|
||||||
method: "get",
|
method: "get",
|
||||||
url: `/streaming/${stream_id}`,
|
url: `/stream/${stream_id}/data`,
|
||||||
})
|
})
|
||||||
|
|
||||||
return data
|
return data
|
||||||
@ -81,37 +81,51 @@ export default class Streaming {
|
|||||||
|
|
||||||
static async getOwnProfiles() {
|
static async getOwnProfiles() {
|
||||||
const { data } = await Streaming.base({
|
const { data } = await Streaming.base({
|
||||||
method: "get",
|
method: "GET",
|
||||||
url: "/streaming/profiles/self",
|
url: "/streaming/profiles/self",
|
||||||
})
|
})
|
||||||
|
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
static async getProfile({ profile_id }) {
|
static async getProfile(profile_id) {
|
||||||
if (!profile_id) {
|
if (!profile_id) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
const { data } = await Streaming.base({
|
const { data } = await Streaming.base({
|
||||||
method: "get",
|
method: "GET",
|
||||||
url: `/streaming/profiles/${profile_id}`,
|
url: `/streaming/profiles/${profile_id}`,
|
||||||
})
|
})
|
||||||
|
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
static async createOrUpdateProfile(update) {
|
static async createProfile(payload) {
|
||||||
const { data } = await Streaming.base({
|
const { data } = await Streaming.base({
|
||||||
method: "put",
|
method: "POST",
|
||||||
url: `/streaming/profiles/self`,
|
url: "/streaming/profiles/new",
|
||||||
|
data: payload,
|
||||||
|
})
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
static async updateProfile(profile_id, update) {
|
||||||
|
if (!profile_id) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data } = await Streaming.base({
|
||||||
|
method: "PUT",
|
||||||
|
url: `/streaming/profiles/${profile_id}`,
|
||||||
data: update,
|
data: update,
|
||||||
})
|
})
|
||||||
|
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
static async deleteProfile({ profile_id }) {
|
static async deleteProfile(profile_id) {
|
||||||
if (!profile_id) {
|
if (!profile_id) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
@ -124,6 +138,36 @@ export default class Streaming {
|
|||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async addRestreamToProfile(profileId, restreamData) {
|
||||||
|
if (!profileId) {
|
||||||
|
console.error("profileId is required to add a restream")
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data } = await Streaming.base({
|
||||||
|
method: "put",
|
||||||
|
url: `/streaming/profiles/${profileId}/restreams`,
|
||||||
|
data: restreamData,
|
||||||
|
})
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
static async deleteRestreamFromProfile(profileId, restreamIndexData) {
|
||||||
|
if (!profileId) {
|
||||||
|
console.error("profileId is required to delete a restream")
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data } = await Streaming.base({
|
||||||
|
method: "delete",
|
||||||
|
url: `/streaming/profiles/${profileId}/restreams`,
|
||||||
|
data: restreamIndexData,
|
||||||
|
})
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
static async list({ limit, offset } = {}) {
|
static async list({ limit, offset } = {}) {
|
||||||
let { data } = await Streaming.base({
|
let { data } = await Streaming.base({
|
||||||
method: "get",
|
method: "get",
|
||||||
@ -145,11 +189,7 @@ export default class Streaming {
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
const client = new RTEngineClient({
|
const client = Streaming.createWebsocket(params)
|
||||||
...params,
|
|
||||||
url: Streaming.apiHostname,
|
|
||||||
token: SessionModel.token,
|
|
||||||
})
|
|
||||||
|
|
||||||
client._destroy = client.destroy
|
client._destroy = client.destroy
|
||||||
|
|
||||||
@ -171,4 +211,14 @@ export default class Streaming {
|
|||||||
|
|
||||||
return client
|
return client
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static createWebsocket(params = {}) {
|
||||||
|
const client = new RTEngineClient({
|
||||||
|
...params,
|
||||||
|
url: Streaming.apiHostname,
|
||||||
|
token: SessionModel.token,
|
||||||
|
})
|
||||||
|
|
||||||
|
return client
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,15 @@ export default class User {
|
|||||||
let { username, user_id, basic = false } = payload
|
let { username, user_id, basic = false } = payload
|
||||||
|
|
||||||
if (!username && !user_id) {
|
if (!username && !user_id) {
|
||||||
user_id = SessionModel.user_id
|
const response = await request({
|
||||||
|
method: "GET",
|
||||||
|
url: `/users/self`,
|
||||||
|
params: {
|
||||||
|
basic,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
return response.data
|
||||||
}
|
}
|
||||||
|
|
||||||
if (username && !user_id) {
|
if (username && !user_id) {
|
||||||
@ -132,4 +140,29 @@ export default class User {
|
|||||||
|
|
||||||
return data
|
return data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async getPublicKey(user_id) {
|
||||||
|
if (!user_id) {
|
||||||
|
user_id = SessionModel.user_id
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data } = await request({
|
||||||
|
method: "GET",
|
||||||
|
url: `/users/${user_id}/public-key`,
|
||||||
|
})
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
static async updatePublicKey(public_key) {
|
||||||
|
const { data } = await request({
|
||||||
|
method: "PUT",
|
||||||
|
url: `/users/self/public-key`,
|
||||||
|
data: {
|
||||||
|
public_key: public_key,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
return data
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user