@manhgdev/soundcloud-web
Version:
JavaScript wrapper for SoundCloud API
88 lines (70 loc) • 2.13 kB
JavaScript
import { httpsGet } from './https.js'
class MediaModule {
constructor(api) {
this.api = api;
}
getStreamURL(mediaUrl, trackAuthorization, clientId) {
return `${mediaUrl}?client_id=${clientId}&track_authorization=${trackAuthorization}`;
}
async getPlaybackUrl(trackId) {
try {
return await this.getMediaUrl(null, trackId, "hls");
} catch (error) {
throw new Error(`Failed to get playback URL: ${error.message}`);
}
}
async getDownloadUrl(trackId) {
try {
return await this.getMediaUrl(null, trackId, "progressive");
} catch (error) {
throw new Error(`Failed to get download URL: ${error.message}`);
}
}
async getMediaUrl(url, trackId, protocol = "hls") {
try {
let trackData;
if (url) {
const track = await this.api.tracks.getResolveUrl(url);
if (!track) {
throw new Error("Track not found");
}
trackData = track;
}
else{
const track = await this.api.tracks.getMultiple([trackId]);
if (!track || !track.length || !track[0]) {
throw new Error("Track not found");
}
trackData = track[0];
}
if (
!trackData.media ||
!trackData.media.transcodings ||
!trackData.media.transcodings.length
) {
throw new Error("No media transcodings available for this track");
}
const transcoding = trackData.media.transcodings.find(
(t) =>
t.format.protocol === protocol && t.format.mime_type === "audio/mpeg",
);
if (!transcoding) {
throw new Error(`No suitable ${protocol} media transcoding found`);
}
const mediaUrl = transcoding.url;
const urlRequest = this.getStreamURL(
mediaUrl,
trackData.track_authorization,
this.api.clientId,
);
const response = await httpsGet(urlRequest);
return {
streamUrl: response.url,
...trackData
}
} catch (error) {
throw new Error(`Failed to get media URL: ${error.message}`);
}
}
}
export default MediaModule;