@pixel_nomad/kazagumo-jiosaavn
Version:
A JioSaavn plugin for Kazagumo
197 lines (196 loc) • 7.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.JioSaavnAPI = void 0;
const http_exception_1 = require("hono/http-exception");
class JioSaavnAPI {
constructor() {
this.extract = {
track: (url) => {
const match = url.match(/jiosaavn\.com\/song\/[^/]+\/([^/]+)$/i);
return match?.[1];
},
album: (url) => {
const match = url.match(/jiosaavn\.com\/album\/[^/]+\/([^/]+)$/i);
return match?.[1];
},
artist: (url) => {
const match = url.match(/jiosaavn\.com\/artist\/[^/]+\/([^/]+)$/i);
return match?.[1];
},
playlist: (url) => {
const match = url.match(/(?:jiosaavn\.com|saavn\.com)\/(?:featured|s\/playlist)\/[^/]+\/[^/]+\/([^/]+)$|(?:\/([^/]+)$)/i);
return match?.[1] || match?.[2];
},
};
}
async request(url) {
const response = await fetch(url, {
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
},
});
if (!response.ok) {
const status = response.status;
throw new http_exception_1.HTTPException(status, {
message: `JioSaavn API request failed with status ${status}`
});
}
try {
return await response.json();
}
catch (error) {
throw new http_exception_1.HTTPException(500, {
message: "Failed to parse JioSaavn API response"
});
}
}
async search(query) {
const data = await this.request(`https://www.jiosaavn.com/api.php?__call=search.getResults&api_version=4&_format=json&_marker=0&cc=in&ctx=web6dot0&includeMetaTags=1&q=${encodeURIComponent(query)}`);
if (!data?.results?.length) {
throw new http_exception_1.HTTPException(404, { message: `No results found for "${query}"` });
}
return {
results: data.results.map((track) => this.formatTrack(track))
};
}
async getTrack(id) {
const data = await this.request(`https://www.jiosaavn.com/api.php?__call=webapi.get&api_version=4&_format=json&_marker=0&ctx=web6dot0&token=${id}&type=song`);
if (!data?.songs?.length) {
throw new http_exception_1.HTTPException(404, { message: "Track not found" });
}
return {
track: this.formatTrack(data.songs[0])
};
}
async getTrackById(id) {
const data = await this.request(`https://www.jiosaavn.com/api.php?__call=song.getDetails&api_version=4&_format=json&_marker=0&ctx=web6dot0&pids=${id}`);
if (!data?.songs?.length) {
throw new http_exception_1.HTTPException(404, { message: "Track not found" });
}
return {
track: this.formatTrack(data.songs[0])
};
}
async getAlbum(id) {
const data = await this.request(`https://www.jiosaavn.com/api.php?__call=webapi.get&api_version=4&_format=json&_marker=0&ctx=web6dot0&token=${id}&type=album`);
if (!data) {
throw new http_exception_1.HTTPException(404, { message: "Album not found" });
}
return {
album: this.formatAlbum(data)
};
}
async getArtist(id) {
const data = await this.request(`https://www.jiosaavn.com/api.php?__call=webapi.get&api_version=4&_format=json&_marker=0&ctx=web6dot0&token=${id}&type=artist&n_song=50`);
if (!data) {
throw new http_exception_1.HTTPException(404, { message: "Artist not found" });
}
return {
artist: this.formatArtist(data)
};
}
async getPlaylist(id, limit = 50) {
const data = await this.request(`https://www.jiosaavn.com/api.php?__call=webapi.get&api_version=4&_format=json&_marker=0&ctx=web6dot0&token=${id}&type=playlist&n=${limit}`);
if (!data) {
throw new http_exception_1.HTTPException(404, { message: "Playlist not found" });
}
return {
playlist: this.formatPlaylist(data)
};
}
async getEncryptedMediaUrl(encryptedMediaUrl) {
const params = new URLSearchParams({
"__call": "song.generateAuthToken",
"url": encryptedMediaUrl,
"bitrate": "320",
"api_version": "4",
"_format": "json",
"ctx": "web6dot0",
"_marker": "0",
});
return this.request(`https://www.jiosaavn.com/api.php?${params.toString()}`);
}
formatTrack(track) {
const data = {
identifier: track.id,
title: track.title || 'Unknown Track',
length: Number(track.more_info?.duration || 0) * 1000,
uri: track.perma_url || null,
artworkUrl: track.image?.replace("150x150", "500x500") || '',
author: track.more_info?.artistMap?.primary_artists?.[0]?.name || null,
encryptedMediaUrl: track.more_info?.encrypted_media_url || null,
albumUrl: track.more_info?.album_url || null,
artistUrl: track.more_info?.artistMap?.primary_artists?.[0]?.perma_url || null,
albumName: track.more_info?.album || null,
artistArtworkUrl: track.more_info?.artistMap?.primary_artists?.[0]?.image?.replace("150x150", "500x500") || null,
previewUrl: track.more_info?.media_preview_url || track.more_info?.vlink || null,
};
return data;
}
formatAlbum(album) {
return {
id: album.id,
name: album.title || 'Unknown Album',
uri: album.perma_url || '',
artworkUrl: album.image?.replace("150x150", "500x500") || '',
author: album.subtitle || 'Unknown Artist',
tracks: album.list?.map((song) => this.formatTrack(song)) || [],
totalSongs: album.list_count || 0,
};
}
formatArtist(artist) {
return {
name: artist.name || 'Unknown Artist',
uri: artist.urls?.overview || '',
artworkUrl: artist.image?.replace("150x150", "500x500") || '',
tracks: artist.topSongs?.map((song) => this.formatTrack(song)) || [],
};
}
formatPlaylist(playlist) {
return {
title: playlist.title || 'Unknown Playlist',
uri: playlist.perma_url || '',
artworkUrl: playlist.image?.replace("150x150", "500x500") || '',
tracks: playlist.list?.map((song) => this.formatTrack(song)) || [],
totalSongs: playlist.list_count || 0,
};
}
}
exports.JioSaavnAPI = JioSaavnAPI;
// export interface JioSaavnTrack {
// identifier: string;
// title: string;
// length: number;
// uri: string | null;
// artworkUrl: string;
// author: string | null;
// encryptedMediaUrl: string | null;
// albumUrl: string | null;
// artistUrl: string | null;
// albumName: string | null;
// artistArtworkUrl: string | null;
// previewUrl: string | null;
// }
// export interface JioSaavnAlbum {
// id: string;
// name: string;
// uri: string;
// artworkUrl: string;
// author: string;
// tracks: JioSaavnTrack[];
// totalSongs: number;
// }
// export interface JioSaavnArtist {
// name: string;
// uri: string;
// artworkUrl: string;
// tracks: JioSaavnTrack[];
// }
// export interface JioSaavnPlaylist {
// title: string;
// uri: string;
// artworkUrl: string;
// tracks: JioSaavnTrack[];
// totalSongs: number;
// }