gerdur 2.6.0 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.8.0 - 2026-08-31
4
+
5
+ ### Added
6
+
7
+ - **`gerdur-core@^2.10.0`** — re-exports `refreshTrackTokens`, `getEpisode`,
8
+ `getShowEpisodes`.
9
+ - **CLI `artist-top:<id>`** — pick from an artist's most popular tracks.
10
+ - **CLI `episode:<id>`** — download a single podcast episode (plain MP3, no
11
+ `--quality` needed, saved to `Podcasts/`).
12
+
13
+ ### Changed
14
+
15
+ - Batch downloads (album / playlist / search selection) now **refresh stale
16
+ `TRACK_TOKEN`s** before resolving URLs — a long playlist no longer starts
17
+ failing partway through with opaque CDN 403s.
18
+
19
+ ## 2.7.0 - 2026-08-31
20
+
21
+ ### Added
22
+
23
+ - **`gerdur-core@^2.9.0`** — re-exports `downloadTrackBuffer` (download + decrypt
24
+ to a `Buffer`) and the low-level session client as `createCoreSession` /
25
+ `CoreSession` / `defaultSession` (for talking to Deezer directly or from
26
+ multiple accounts — gerdur's own `Session` stays the download orchestrator).
27
+ - **CLI `chart` / `chart:<genreId>`** — pick tracks from this week's Deezer chart
28
+ (optionally a genre) and download them. Headless-friendly.
29
+
30
+ ### Changed
31
+
32
+ - Gateway retries are bounded and downloads are session-aware (via
33
+ `gerdur-core@2.4`–`2.9`); `license_token` refreshes proactively.
34
+
3
35
  ## 2.6.0 - 2026-08-31
4
36
 
5
37
  ### Added
package/README.md CHANGED
@@ -162,6 +162,9 @@ When `gerdur` asks for a URL, a search term, or a prefixed query:
162
162
  | `flow` | pick tracks from your Deezer **Flow** |
163
163
  | `flow:2064440442` | pick tracks from another user's Flow |
164
164
  | `radio:38305` | pick tracks from a radio's current playlist |
165
+ | `chart` / `chart:132` | pick tracks from this week's chart (optionally a genre) |
166
+ | `artist-top:27` | pick from an artist's most popular tracks |
167
+ | `episode:294961882` | download a single podcast episode (plain MP3, to `Podcasts/`) |
165
168
 
166
169
  `isrc:` / `upc:` / `flow` / `radio:` also work in `--headless` mode (`-u flow`, …).
167
170
 
@@ -328,11 +331,17 @@ or `createSession`):
328
331
  - **Flow / library** — `getUserFlow`, `getUserFavoriteTracks`,
329
332
  `getUserFavoriteAlbums`, `getUserFavoriteArtists`, `getUserPlaylists`,
330
333
  `getUserRadios`, `getUserChartTracks`, `getRadios`, `getRadioTracks`,
331
- `getRadioGenres`
334
+ `getRadioGenres`, `getEpisode`, `getShowEpisodes`
332
335
  - **Download** — `getTrackDownloadUrl`, `resolveDownloadUrls`,
333
- `streamTrackDownload`, `createDecryptStream`, `getStream`, `getTrackPreview`,
334
- `downloadPreview`, `formatName`, `toFormat`, `DEEZER_FORMATS`
336
+ `refreshTrackTokens`, `streamTrackDownload`, `downloadTrackBuffer`,
337
+ `createDecryptStream`, `getStream`, `getTrackPreview`, `downloadPreview`,
338
+ `formatName`, `toFormat`, `DEEZER_FORMATS`
335
339
  - **Errors** — `DeezerError` (`code` / `keys` / `retryable`), `GeoBlocked`
340
+ - **Low-level sessions** — `createCoreSession(arl)` / `CoreSession` /
341
+ `defaultSession` from `gerdur-core`: an isolated client (its own `arl`, cache,
342
+ `license_token`) with `getTrackInfo` / `searchMusic` / `getTrackBuffer` / … for
343
+ talking to Deezer directly or from multiple accounts. gerdur's own
344
+ `createSession` / `Session` (above) is the higher-level download orchestrator.
336
345
 
337
346
  ### Auth & config helpers
338
347
 
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gerdur",
3
- "version": "2.6.0",
3
+ "version": "2.8.0",
4
4
  "description": "The crucial streaming module for dabox systems.",
5
5
  "author": "Christian",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -48,7 +48,7 @@
48
48
  "adm-zip": "^0.5.16",
49
49
  "chalk": "^4.1.2",
50
50
  "commander": "^9.5.0",
51
- "gerdur-core": "^2.6.0",
51
+ "gerdur-core": "^2.10.0",
52
52
  "dot-prop": "^6.0.1",
53
53
  "got": "^11.8.6",
54
54
  "gradient-string": "^2.0.2",
@@ -9,6 +9,7 @@ const fs_1 = require("fs");
9
9
  const path_1 = require("path");
10
10
  const commander_1 = require("commander");
11
11
  const gradient_string_1 = __importDefault(require("gradient-string"));
12
+ const got_1 = __importDefault(require("got"));
12
13
  const gerdur_core_1 = require("gerdur-core");
13
14
  const prompts_1 = __importDefault(require("prompts"));
14
15
  const log_update_1 = __importDefault(require("log-update"));
@@ -80,7 +81,8 @@ const toFiniteNumber = (value) => {
80
81
  };
81
82
  const advancedFilters = (0, search_1.advancedFiltersFromFlags)(options);
82
83
  let advancedFiltersConsumed = false;
83
- if (options.headless && !options.quality && !options.preview) {
84
+ const isEpisodeUrl = String(options.url ?? '').startsWith('episode:');
85
+ if (options.headless && !options.quality && !options.preview && !isEpisodeUrl) {
84
86
  console.error(signale_1.default.error('Missing parameters --quality'));
85
87
  console.error(signale_1.default.note('Quality must be provided with headless mode'));
86
88
  process.exit(1);
@@ -107,14 +109,9 @@ const stampVersion = (t) => {
107
109
  return t;
108
110
  };
109
111
  /**
110
- * Run an advanced (public-REST) track search, let the user pick, and hydrate the
111
- * picks into download-ready gw tracks via `getTrackInfo`. Returns `null` when
112
- * nothing was matched or selected.
113
- */
114
- /**
115
- * Given a list of public-API track objects (from search / flow / a radio), let
116
- * the user pick (unless headless) and hydrate the picks into download-ready gw
117
- * tracks via `getTrackInfo`.
112
+ * Given a list of public-API track objects (from search / flow / a radio / a
113
+ * chart), let the user pick (unless headless) and hydrate the picks into
114
+ * download-ready gw tracks via `getTrackInfo`.
118
115
  */
119
116
  const pickAndHydrate = async (results, id) => {
120
117
  if (!results.length) {
@@ -202,7 +199,7 @@ const downloadPreviews = async (tracks, info, template, totalTracks, trackNumber
202
199
  const startDownload = async (saveLayout, url, skipPrompt) => {
203
200
  try {
204
201
  url = url ?? '';
205
- if (!options.quality && !options.preview) {
202
+ if (!options.quality && !options.preview && !url.startsWith('episode:')) {
206
203
  const { musicQuality } = await (0, prompts_1.default)([
207
204
  {
208
205
  type: 'select',
@@ -236,7 +233,7 @@ const startDownload = async (saveLayout, url, skipPrompt) => {
236
233
  {
237
234
  type: 'text',
238
235
  name: 'query',
239
- message: 'Enter a URL, a search term, or `search:` / `isrc:` / `upc:` / `flow` / `radio:<id>`:',
236
+ message: 'Enter a URL, a search term, or a prefix (search: isrc: upc: flow radio: chart artist-top: episode:):',
240
237
  validate: (value) => (value ? true : false),
241
238
  },
242
239
  ], { onCancel });
@@ -288,6 +285,44 @@ const startDownload = async (saveLayout, url, skipPrompt) => {
288
285
  throw new Error(`Radio ${rid} returned no tracks.`);
289
286
  }
290
287
  }
288
+ // `chart` / `chart:<genreId>` — download from Deezer's weekly chart.
289
+ if (!searchData && url && (url === 'chart' || url.startsWith('chart:'))) {
290
+ const genreId = url.includes(':') ? url.slice('chart:'.length).trim() : 0;
291
+ console.log(signale_1.default.info(`Fetching chart${genreId ? ` for genre ${genreId}` : ''}…`));
292
+ const { data } = await (0, gerdur_core_1.getChartTracks)(genreId, toFiniteNumber(options.searchLimit) ?? 50);
293
+ searchData = await pickAndHydrate(data, `chart:${genreId}`);
294
+ if (!searchData) {
295
+ throw new Error('Chart returned no tracks.');
296
+ }
297
+ }
298
+ // `artist-top:<id>` — an artist's most popular tracks.
299
+ if (!searchData && url && url.startsWith('artist-top:')) {
300
+ const aid = url.slice('artist-top:'.length).trim();
301
+ console.log(signale_1.default.info(`Fetching top tracks for artist ${aid}…`));
302
+ const { data } = await (0, gerdur_core_1.getArtistTopTracks)(aid, toFiniteNumber(options.searchLimit) ?? 50);
303
+ searchData = await pickAndHydrate(data, `artist-top:${aid}`);
304
+ if (!searchData) {
305
+ throw new Error(`Artist ${aid} returned no top tracks.`);
306
+ }
307
+ }
308
+ // `episode:<id>` — a podcast episode (a plain MP3: no licence, decryption or tagging).
309
+ if (!searchData && url && url.startsWith('episode:')) {
310
+ const eid = url.slice('episode:'.length).trim();
311
+ const episode = await (0, gerdur_core_1.getEpisode)(eid);
312
+ if (!episode.EPISODE_DIRECT_STREAM_URL) {
313
+ throw new Error(`Episode ${eid} has no direct stream.`);
314
+ }
315
+ const dir = options.output ? (0, path_1.dirname)(options.output) : 'Podcasts';
316
+ const dest = (0, path_1.join)(dir, (0, util_1.sanitizeFilename)(`${episode.SHOW_NAME} - ${episode.EPISODE_TITLE}`.slice(0, 180)) + '.mp3');
317
+ console.log(signale_1.default.info(`Downloading episode: ${episode.EPISODE_TITLE}`));
318
+ if (options.overwrite || !(0, fs_1.existsSync)(dest)) {
319
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
320
+ const { body } = await (0, got_1.default)(episode.EPISODE_DIRECT_STREAM_URL, { responseType: 'buffer' });
321
+ (0, fs_1.writeFileSync)(dest, body);
322
+ }
323
+ console.log(signale_1.default.success(`Saved ${dest}`));
324
+ return;
325
+ }
291
326
  if (!searchData && !url.match(urlRegex)) {
292
327
  if (options.headless) {
293
328
  throw new Error('Please provide a valid URL. Unknown URL: ' + url);
@@ -413,6 +448,9 @@ const startDownload = async (saveLayout, url, skipPrompt) => {
413
448
  const prefetchedUrls = new Map();
414
449
  if (data.tracks.length > 1 && !process.env.SIMULATE) {
415
450
  try {
451
+ // TRACK_TOKENs expire ~1h — refresh any stale ones so a long download
452
+ // doesn't start failing partway through with opaque CDN 403s.
453
+ data.tracks = await (0, gerdur_core_1.refreshTrackTokens)(data.tracks);
416
454
  const base = QUALITY_PREF[String(options.quality).toLowerCase()] ?? [3, 1];
417
455
  const pref = fallbackQuality ? base : [base[0]];
418
456
  const resolved = await (0, gerdur_core_1.resolveDownloadUrls)(data.tracks, pref);
@@ -56,10 +56,12 @@ export declare class LoginError extends Error {
56
56
  export declare const getArl: (email: string, password: string) => Promise<string>;
57
57
  export { createSession, Session } from './lib/session';
58
58
  export type { SessionOptions, DownloadTracksOptions, SearchType } from './lib/session';
59
+ export { createSession as createCoreSession, Session as CoreSession, defaultSession } from 'gerdur-core';
60
+ export type { SessionUserData } from 'gerdur-core';
59
61
  export { getTrackBuffer, getTaggedTrack, downloadTrackToFile } from './lib/api-download';
60
62
  export type { Quality, GetTrackBufferOptions, DownloadTrackOptions, DownloadResult } from './lib/api-download';
61
63
  export { default as Config, globalConfigPath, resolveConfigFile } from './lib/config';
62
- export { initDeezerApi, parseInfo, searchMusic, searchPublicApi, searchTracks, searchAlbums, searchArtists, searchPlaylists, buildAdvancedQuery, suggest, getGenres, getChart, getChartTracks, getGenreArtists, getEditorialList, getEditorialReleases, getEditorialSelection, getEditorialCharts, getArtistTopTracks, getRelatedArtists, getArtistAlbums, getArtistPlaylists, getArtistRadioTracks, getUserFlow, getUserFavoriteTracks, getUserFavoriteAlbums, getUserFavoriteArtists, getUserPlaylists, getUserRadios, getUserChartTracks, getRadios, getRadioTracks, getRadioGenres, getTrackByISRC, getAlbumByUPC, getTrackPreview, downloadPreview, formatName, toFormat, DEEZER_FORMATS, getUser, getTrackInfo, getAlbumInfo, getAlbumTracks, getPlaylistInfo, getPlaylistTracks, getArtistInfo, getDiscography, getLyrics, getTrackDownloadUrl, resolveDownloadUrls, streamTrackDownload, createDecryptStream, getStream, addTrackTags, getRichAlbum, normalizeContributors, toLrc, GeoBlocked, DeezerError, } from 'gerdur-core';
64
+ export { initDeezerApi, parseInfo, searchMusic, searchPublicApi, searchTracks, searchAlbums, searchArtists, searchPlaylists, buildAdvancedQuery, suggest, getGenres, getChart, getChartTracks, getGenreArtists, getEditorialList, getEditorialReleases, getEditorialSelection, getEditorialCharts, getArtistTopTracks, getRelatedArtists, getArtistAlbums, getArtistPlaylists, getArtistRadioTracks, getUserFlow, getUserFavoriteTracks, getUserFavoriteAlbums, getUserFavoriteArtists, getUserPlaylists, getUserRadios, getUserChartTracks, getRadios, getRadioTracks, getRadioGenres, getEpisode, getShowEpisodes, refreshTrackTokens, getTrackByISRC, getAlbumByUPC, getTrackPreview, downloadPreview, formatName, toFormat, DEEZER_FORMATS, getUser, getTrackInfo, getAlbumInfo, getAlbumTracks, getPlaylistInfo, getPlaylistTracks, getArtistInfo, getDiscography, getLyrics, getTrackDownloadUrl, resolveDownloadUrls, streamTrackDownload, downloadTrackBuffer, createDecryptStream, getStream, addTrackTags, getRichAlbum, normalizeContributors, toLrc, GeoBlocked, DeezerError, } from 'gerdur-core';
63
65
  export type { AddTrackTagsOptions, TaggedTrack, TrackTagModel, RichAlbum, ResolvedUrl, NormalizedContributors, } from 'gerdur-core';
64
66
  export type { advancedSearchFilters, searchOrder, searchEntity, publicApiSearchOptions, publicApiSearchResponse, searchResultTrack, searchResultAlbum, searchResultArtist, searchResultPlaylist, suggestResult, publicApiList, chartType, chartTrack, chartAlbum, chartArtist, chartPlaylist, chartPodcast, genreType, editorialType, artistAlbumResult, userFavoriteTrack, userFavoriteAlbum, userFavoriteArtist, userPlaylistResult, radioResult, radioGenre, } from 'gerdur-core/types';
65
67
  export type { Quality as MediaFormat, DeezerFormat, TrackPreview, StreamTrackOptions, TrackStream, StreamResponse, DeezerErrorPayload, } from 'gerdur-core';
package/dist/src/index.js CHANGED
@@ -33,8 +33,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
33
33
  return (mod && mod.__esModule) ? mod : { "default": mod };
34
34
  };
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.toFormat = exports.formatName = exports.downloadPreview = exports.getTrackPreview = exports.getAlbumByUPC = exports.getTrackByISRC = exports.getRadioGenres = exports.getRadioTracks = exports.getRadios = exports.getUserChartTracks = exports.getUserRadios = exports.getUserPlaylists = exports.getUserFavoriteArtists = exports.getUserFavoriteAlbums = exports.getUserFavoriteTracks = exports.getUserFlow = exports.getArtistRadioTracks = exports.getArtistPlaylists = exports.getArtistAlbums = exports.getRelatedArtists = exports.getArtistTopTracks = exports.getEditorialCharts = exports.getEditorialSelection = exports.getEditorialReleases = exports.getEditorialList = exports.getGenreArtists = exports.getChartTracks = exports.getChart = exports.getGenres = exports.suggest = exports.buildAdvancedQuery = exports.searchPlaylists = exports.searchArtists = exports.searchAlbums = exports.searchTracks = exports.searchPublicApi = exports.searchMusic = exports.parseInfo = exports.initDeezerApi = exports.resolveConfigFile = exports.globalConfigPath = exports.Config = exports.downloadTrackToFile = exports.getTaggedTrack = exports.getTrackBuffer = exports.Session = exports.createSession = exports.getArl = exports.LoginError = exports.loginWithEmail = void 0;
37
- exports.DeezerError = exports.GeoBlocked = exports.toLrc = exports.normalizeContributors = exports.getRichAlbum = exports.addTrackTags = exports.getStream = exports.createDecryptStream = exports.streamTrackDownload = exports.resolveDownloadUrls = exports.getTrackDownloadUrl = exports.getLyrics = exports.getDiscography = exports.getArtistInfo = exports.getPlaylistTracks = exports.getPlaylistInfo = exports.getAlbumTracks = exports.getAlbumInfo = exports.getTrackInfo = exports.getUser = exports.DEEZER_FORMATS = void 0;
36
+ exports.refreshTrackTokens = exports.getShowEpisodes = exports.getEpisode = exports.getRadioGenres = exports.getRadioTracks = exports.getRadios = exports.getUserChartTracks = exports.getUserRadios = exports.getUserPlaylists = exports.getUserFavoriteArtists = exports.getUserFavoriteAlbums = exports.getUserFavoriteTracks = exports.getUserFlow = exports.getArtistRadioTracks = exports.getArtistPlaylists = exports.getArtistAlbums = exports.getRelatedArtists = exports.getArtistTopTracks = exports.getEditorialCharts = exports.getEditorialSelection = exports.getEditorialReleases = exports.getEditorialList = exports.getGenreArtists = exports.getChartTracks = exports.getChart = exports.getGenres = exports.suggest = exports.buildAdvancedQuery = exports.searchPlaylists = exports.searchArtists = exports.searchAlbums = exports.searchTracks = exports.searchPublicApi = exports.searchMusic = exports.parseInfo = exports.initDeezerApi = exports.resolveConfigFile = exports.globalConfigPath = exports.Config = exports.downloadTrackToFile = exports.getTaggedTrack = exports.getTrackBuffer = exports.defaultSession = exports.CoreSession = exports.createCoreSession = exports.Session = exports.createSession = exports.getArl = exports.LoginError = exports.loginWithEmail = void 0;
37
+ exports.DeezerError = exports.GeoBlocked = exports.toLrc = exports.normalizeContributors = exports.getRichAlbum = exports.addTrackTags = exports.getStream = exports.createDecryptStream = exports.downloadTrackBuffer = exports.streamTrackDownload = exports.resolveDownloadUrls = exports.getTrackDownloadUrl = exports.getLyrics = exports.getDiscography = exports.getArtistInfo = exports.getPlaylistTracks = exports.getPlaylistInfo = exports.getAlbumTracks = exports.getAlbumInfo = exports.getTrackInfo = exports.getUser = exports.DEEZER_FORMATS = exports.toFormat = exports.formatName = exports.downloadPreview = exports.getTrackPreview = exports.getAlbumByUPC = exports.getTrackByISRC = void 0;
38
38
  // ─── Authentication ────────────────────────────────────────────────────────
39
39
  const email_login_1 = require("./lib/email-login");
40
40
  Object.defineProperty(exports, "loginWithEmail", { enumerable: true, get: function () { return email_login_1.loginWithEmail; } });
@@ -72,6 +72,13 @@ exports.getArl = getArl;
72
72
  var session_1 = require("./lib/session");
73
73
  Object.defineProperty(exports, "createSession", { enumerable: true, get: function () { return session_1.createSession; } });
74
74
  Object.defineProperty(exports, "Session", { enumerable: true, get: function () { return session_1.Session; } });
75
+ // `gerdur-core`'s low-level session — an isolated client (its own `arl`, cache,
76
+ // `license_token`) for talking to Deezer directly / from multiple accounts.
77
+ // gerdur's `Session` above is the higher-level download-orchestration one.
78
+ var gerdur_core_1 = require("gerdur-core");
79
+ Object.defineProperty(exports, "createCoreSession", { enumerable: true, get: function () { return gerdur_core_1.createSession; } });
80
+ Object.defineProperty(exports, "CoreSession", { enumerable: true, get: function () { return gerdur_core_1.Session; } });
81
+ Object.defineProperty(exports, "defaultSession", { enumerable: true, get: function () { return gerdur_core_1.defaultSession; } });
75
82
  // ─── Download primitives ─────────────────────────────────────────────────────
76
83
  var api_download_1 = require("./lib/api-download");
77
84
  Object.defineProperty(exports, "getTrackBuffer", { enumerable: true, get: function () { return api_download_1.getTrackBuffer; } });
@@ -86,64 +93,68 @@ Object.defineProperty(exports, "resolveConfigFile", { enumerable: true, get: fun
86
93
  // ─── Re-exported core query functions ────────────────────────────────────────
87
94
  // Convenience re-exports so consumers don't need `gerdur-core` directly.
88
95
  // After `initDeezerApi(arl)` (or `createSession`) these are ready to use.
89
- var gerdur_core_1 = require("gerdur-core");
90
- Object.defineProperty(exports, "initDeezerApi", { enumerable: true, get: function () { return gerdur_core_1.initDeezerApi; } });
91
- Object.defineProperty(exports, "parseInfo", { enumerable: true, get: function () { return gerdur_core_1.parseInfo; } });
92
- Object.defineProperty(exports, "searchMusic", { enumerable: true, get: function () { return gerdur_core_1.searchMusic; } });
93
- Object.defineProperty(exports, "searchPublicApi", { enumerable: true, get: function () { return gerdur_core_1.searchPublicApi; } });
94
- Object.defineProperty(exports, "searchTracks", { enumerable: true, get: function () { return gerdur_core_1.searchTracks; } });
95
- Object.defineProperty(exports, "searchAlbums", { enumerable: true, get: function () { return gerdur_core_1.searchAlbums; } });
96
- Object.defineProperty(exports, "searchArtists", { enumerable: true, get: function () { return gerdur_core_1.searchArtists; } });
97
- Object.defineProperty(exports, "searchPlaylists", { enumerable: true, get: function () { return gerdur_core_1.searchPlaylists; } });
98
- Object.defineProperty(exports, "buildAdvancedQuery", { enumerable: true, get: function () { return gerdur_core_1.buildAdvancedQuery; } });
99
- Object.defineProperty(exports, "suggest", { enumerable: true, get: function () { return gerdur_core_1.suggest; } });
100
- Object.defineProperty(exports, "getGenres", { enumerable: true, get: function () { return gerdur_core_1.getGenres; } });
101
- Object.defineProperty(exports, "getChart", { enumerable: true, get: function () { return gerdur_core_1.getChart; } });
102
- Object.defineProperty(exports, "getChartTracks", { enumerable: true, get: function () { return gerdur_core_1.getChartTracks; } });
103
- Object.defineProperty(exports, "getGenreArtists", { enumerable: true, get: function () { return gerdur_core_1.getGenreArtists; } });
104
- Object.defineProperty(exports, "getEditorialList", { enumerable: true, get: function () { return gerdur_core_1.getEditorialList; } });
105
- Object.defineProperty(exports, "getEditorialReleases", { enumerable: true, get: function () { return gerdur_core_1.getEditorialReleases; } });
106
- Object.defineProperty(exports, "getEditorialSelection", { enumerable: true, get: function () { return gerdur_core_1.getEditorialSelection; } });
107
- Object.defineProperty(exports, "getEditorialCharts", { enumerable: true, get: function () { return gerdur_core_1.getEditorialCharts; } });
108
- Object.defineProperty(exports, "getArtistTopTracks", { enumerable: true, get: function () { return gerdur_core_1.getArtistTopTracks; } });
109
- Object.defineProperty(exports, "getRelatedArtists", { enumerable: true, get: function () { return gerdur_core_1.getRelatedArtists; } });
110
- Object.defineProperty(exports, "getArtistAlbums", { enumerable: true, get: function () { return gerdur_core_1.getArtistAlbums; } });
111
- Object.defineProperty(exports, "getArtistPlaylists", { enumerable: true, get: function () { return gerdur_core_1.getArtistPlaylists; } });
112
- Object.defineProperty(exports, "getArtistRadioTracks", { enumerable: true, get: function () { return gerdur_core_1.getArtistRadioTracks; } });
113
- Object.defineProperty(exports, "getUserFlow", { enumerable: true, get: function () { return gerdur_core_1.getUserFlow; } });
114
- Object.defineProperty(exports, "getUserFavoriteTracks", { enumerable: true, get: function () { return gerdur_core_1.getUserFavoriteTracks; } });
115
- Object.defineProperty(exports, "getUserFavoriteAlbums", { enumerable: true, get: function () { return gerdur_core_1.getUserFavoriteAlbums; } });
116
- Object.defineProperty(exports, "getUserFavoriteArtists", { enumerable: true, get: function () { return gerdur_core_1.getUserFavoriteArtists; } });
117
- Object.defineProperty(exports, "getUserPlaylists", { enumerable: true, get: function () { return gerdur_core_1.getUserPlaylists; } });
118
- Object.defineProperty(exports, "getUserRadios", { enumerable: true, get: function () { return gerdur_core_1.getUserRadios; } });
119
- Object.defineProperty(exports, "getUserChartTracks", { enumerable: true, get: function () { return gerdur_core_1.getUserChartTracks; } });
120
- Object.defineProperty(exports, "getRadios", { enumerable: true, get: function () { return gerdur_core_1.getRadios; } });
121
- Object.defineProperty(exports, "getRadioTracks", { enumerable: true, get: function () { return gerdur_core_1.getRadioTracks; } });
122
- Object.defineProperty(exports, "getRadioGenres", { enumerable: true, get: function () { return gerdur_core_1.getRadioGenres; } });
123
- Object.defineProperty(exports, "getTrackByISRC", { enumerable: true, get: function () { return gerdur_core_1.getTrackByISRC; } });
124
- Object.defineProperty(exports, "getAlbumByUPC", { enumerable: true, get: function () { return gerdur_core_1.getAlbumByUPC; } });
125
- Object.defineProperty(exports, "getTrackPreview", { enumerable: true, get: function () { return gerdur_core_1.getTrackPreview; } });
126
- Object.defineProperty(exports, "downloadPreview", { enumerable: true, get: function () { return gerdur_core_1.downloadPreview; } });
127
- Object.defineProperty(exports, "formatName", { enumerable: true, get: function () { return gerdur_core_1.formatName; } });
128
- Object.defineProperty(exports, "toFormat", { enumerable: true, get: function () { return gerdur_core_1.toFormat; } });
129
- Object.defineProperty(exports, "DEEZER_FORMATS", { enumerable: true, get: function () { return gerdur_core_1.DEEZER_FORMATS; } });
130
- Object.defineProperty(exports, "getUser", { enumerable: true, get: function () { return gerdur_core_1.getUser; } });
131
- Object.defineProperty(exports, "getTrackInfo", { enumerable: true, get: function () { return gerdur_core_1.getTrackInfo; } });
132
- Object.defineProperty(exports, "getAlbumInfo", { enumerable: true, get: function () { return gerdur_core_1.getAlbumInfo; } });
133
- Object.defineProperty(exports, "getAlbumTracks", { enumerable: true, get: function () { return gerdur_core_1.getAlbumTracks; } });
134
- Object.defineProperty(exports, "getPlaylistInfo", { enumerable: true, get: function () { return gerdur_core_1.getPlaylistInfo; } });
135
- Object.defineProperty(exports, "getPlaylistTracks", { enumerable: true, get: function () { return gerdur_core_1.getPlaylistTracks; } });
136
- Object.defineProperty(exports, "getArtistInfo", { enumerable: true, get: function () { return gerdur_core_1.getArtistInfo; } });
137
- Object.defineProperty(exports, "getDiscography", { enumerable: true, get: function () { return gerdur_core_1.getDiscography; } });
138
- Object.defineProperty(exports, "getLyrics", { enumerable: true, get: function () { return gerdur_core_1.getLyrics; } });
139
- Object.defineProperty(exports, "getTrackDownloadUrl", { enumerable: true, get: function () { return gerdur_core_1.getTrackDownloadUrl; } });
140
- Object.defineProperty(exports, "resolveDownloadUrls", { enumerable: true, get: function () { return gerdur_core_1.resolveDownloadUrls; } });
141
- Object.defineProperty(exports, "streamTrackDownload", { enumerable: true, get: function () { return gerdur_core_1.streamTrackDownload; } });
142
- Object.defineProperty(exports, "createDecryptStream", { enumerable: true, get: function () { return gerdur_core_1.createDecryptStream; } });
143
- Object.defineProperty(exports, "getStream", { enumerable: true, get: function () { return gerdur_core_1.getStream; } });
144
- Object.defineProperty(exports, "addTrackTags", { enumerable: true, get: function () { return gerdur_core_1.addTrackTags; } });
145
- Object.defineProperty(exports, "getRichAlbum", { enumerable: true, get: function () { return gerdur_core_1.getRichAlbum; } });
146
- Object.defineProperty(exports, "normalizeContributors", { enumerable: true, get: function () { return gerdur_core_1.normalizeContributors; } });
147
- Object.defineProperty(exports, "toLrc", { enumerable: true, get: function () { return gerdur_core_1.toLrc; } });
148
- Object.defineProperty(exports, "GeoBlocked", { enumerable: true, get: function () { return gerdur_core_1.GeoBlocked; } });
149
- Object.defineProperty(exports, "DeezerError", { enumerable: true, get: function () { return gerdur_core_1.DeezerError; } });
96
+ var gerdur_core_2 = require("gerdur-core");
97
+ Object.defineProperty(exports, "initDeezerApi", { enumerable: true, get: function () { return gerdur_core_2.initDeezerApi; } });
98
+ Object.defineProperty(exports, "parseInfo", { enumerable: true, get: function () { return gerdur_core_2.parseInfo; } });
99
+ Object.defineProperty(exports, "searchMusic", { enumerable: true, get: function () { return gerdur_core_2.searchMusic; } });
100
+ Object.defineProperty(exports, "searchPublicApi", { enumerable: true, get: function () { return gerdur_core_2.searchPublicApi; } });
101
+ Object.defineProperty(exports, "searchTracks", { enumerable: true, get: function () { return gerdur_core_2.searchTracks; } });
102
+ Object.defineProperty(exports, "searchAlbums", { enumerable: true, get: function () { return gerdur_core_2.searchAlbums; } });
103
+ Object.defineProperty(exports, "searchArtists", { enumerable: true, get: function () { return gerdur_core_2.searchArtists; } });
104
+ Object.defineProperty(exports, "searchPlaylists", { enumerable: true, get: function () { return gerdur_core_2.searchPlaylists; } });
105
+ Object.defineProperty(exports, "buildAdvancedQuery", { enumerable: true, get: function () { return gerdur_core_2.buildAdvancedQuery; } });
106
+ Object.defineProperty(exports, "suggest", { enumerable: true, get: function () { return gerdur_core_2.suggest; } });
107
+ Object.defineProperty(exports, "getGenres", { enumerable: true, get: function () { return gerdur_core_2.getGenres; } });
108
+ Object.defineProperty(exports, "getChart", { enumerable: true, get: function () { return gerdur_core_2.getChart; } });
109
+ Object.defineProperty(exports, "getChartTracks", { enumerable: true, get: function () { return gerdur_core_2.getChartTracks; } });
110
+ Object.defineProperty(exports, "getGenreArtists", { enumerable: true, get: function () { return gerdur_core_2.getGenreArtists; } });
111
+ Object.defineProperty(exports, "getEditorialList", { enumerable: true, get: function () { return gerdur_core_2.getEditorialList; } });
112
+ Object.defineProperty(exports, "getEditorialReleases", { enumerable: true, get: function () { return gerdur_core_2.getEditorialReleases; } });
113
+ Object.defineProperty(exports, "getEditorialSelection", { enumerable: true, get: function () { return gerdur_core_2.getEditorialSelection; } });
114
+ Object.defineProperty(exports, "getEditorialCharts", { enumerable: true, get: function () { return gerdur_core_2.getEditorialCharts; } });
115
+ Object.defineProperty(exports, "getArtistTopTracks", { enumerable: true, get: function () { return gerdur_core_2.getArtistTopTracks; } });
116
+ Object.defineProperty(exports, "getRelatedArtists", { enumerable: true, get: function () { return gerdur_core_2.getRelatedArtists; } });
117
+ Object.defineProperty(exports, "getArtistAlbums", { enumerable: true, get: function () { return gerdur_core_2.getArtistAlbums; } });
118
+ Object.defineProperty(exports, "getArtistPlaylists", { enumerable: true, get: function () { return gerdur_core_2.getArtistPlaylists; } });
119
+ Object.defineProperty(exports, "getArtistRadioTracks", { enumerable: true, get: function () { return gerdur_core_2.getArtistRadioTracks; } });
120
+ Object.defineProperty(exports, "getUserFlow", { enumerable: true, get: function () { return gerdur_core_2.getUserFlow; } });
121
+ Object.defineProperty(exports, "getUserFavoriteTracks", { enumerable: true, get: function () { return gerdur_core_2.getUserFavoriteTracks; } });
122
+ Object.defineProperty(exports, "getUserFavoriteAlbums", { enumerable: true, get: function () { return gerdur_core_2.getUserFavoriteAlbums; } });
123
+ Object.defineProperty(exports, "getUserFavoriteArtists", { enumerable: true, get: function () { return gerdur_core_2.getUserFavoriteArtists; } });
124
+ Object.defineProperty(exports, "getUserPlaylists", { enumerable: true, get: function () { return gerdur_core_2.getUserPlaylists; } });
125
+ Object.defineProperty(exports, "getUserRadios", { enumerable: true, get: function () { return gerdur_core_2.getUserRadios; } });
126
+ Object.defineProperty(exports, "getUserChartTracks", { enumerable: true, get: function () { return gerdur_core_2.getUserChartTracks; } });
127
+ Object.defineProperty(exports, "getRadios", { enumerable: true, get: function () { return gerdur_core_2.getRadios; } });
128
+ Object.defineProperty(exports, "getRadioTracks", { enumerable: true, get: function () { return gerdur_core_2.getRadioTracks; } });
129
+ Object.defineProperty(exports, "getRadioGenres", { enumerable: true, get: function () { return gerdur_core_2.getRadioGenres; } });
130
+ Object.defineProperty(exports, "getEpisode", { enumerable: true, get: function () { return gerdur_core_2.getEpisode; } });
131
+ Object.defineProperty(exports, "getShowEpisodes", { enumerable: true, get: function () { return gerdur_core_2.getShowEpisodes; } });
132
+ Object.defineProperty(exports, "refreshTrackTokens", { enumerable: true, get: function () { return gerdur_core_2.refreshTrackTokens; } });
133
+ Object.defineProperty(exports, "getTrackByISRC", { enumerable: true, get: function () { return gerdur_core_2.getTrackByISRC; } });
134
+ Object.defineProperty(exports, "getAlbumByUPC", { enumerable: true, get: function () { return gerdur_core_2.getAlbumByUPC; } });
135
+ Object.defineProperty(exports, "getTrackPreview", { enumerable: true, get: function () { return gerdur_core_2.getTrackPreview; } });
136
+ Object.defineProperty(exports, "downloadPreview", { enumerable: true, get: function () { return gerdur_core_2.downloadPreview; } });
137
+ Object.defineProperty(exports, "formatName", { enumerable: true, get: function () { return gerdur_core_2.formatName; } });
138
+ Object.defineProperty(exports, "toFormat", { enumerable: true, get: function () { return gerdur_core_2.toFormat; } });
139
+ Object.defineProperty(exports, "DEEZER_FORMATS", { enumerable: true, get: function () { return gerdur_core_2.DEEZER_FORMATS; } });
140
+ Object.defineProperty(exports, "getUser", { enumerable: true, get: function () { return gerdur_core_2.getUser; } });
141
+ Object.defineProperty(exports, "getTrackInfo", { enumerable: true, get: function () { return gerdur_core_2.getTrackInfo; } });
142
+ Object.defineProperty(exports, "getAlbumInfo", { enumerable: true, get: function () { return gerdur_core_2.getAlbumInfo; } });
143
+ Object.defineProperty(exports, "getAlbumTracks", { enumerable: true, get: function () { return gerdur_core_2.getAlbumTracks; } });
144
+ Object.defineProperty(exports, "getPlaylistInfo", { enumerable: true, get: function () { return gerdur_core_2.getPlaylistInfo; } });
145
+ Object.defineProperty(exports, "getPlaylistTracks", { enumerable: true, get: function () { return gerdur_core_2.getPlaylistTracks; } });
146
+ Object.defineProperty(exports, "getArtistInfo", { enumerable: true, get: function () { return gerdur_core_2.getArtistInfo; } });
147
+ Object.defineProperty(exports, "getDiscography", { enumerable: true, get: function () { return gerdur_core_2.getDiscography; } });
148
+ Object.defineProperty(exports, "getLyrics", { enumerable: true, get: function () { return gerdur_core_2.getLyrics; } });
149
+ Object.defineProperty(exports, "getTrackDownloadUrl", { enumerable: true, get: function () { return gerdur_core_2.getTrackDownloadUrl; } });
150
+ Object.defineProperty(exports, "resolveDownloadUrls", { enumerable: true, get: function () { return gerdur_core_2.resolveDownloadUrls; } });
151
+ Object.defineProperty(exports, "streamTrackDownload", { enumerable: true, get: function () { return gerdur_core_2.streamTrackDownload; } });
152
+ Object.defineProperty(exports, "downloadTrackBuffer", { enumerable: true, get: function () { return gerdur_core_2.downloadTrackBuffer; } });
153
+ Object.defineProperty(exports, "createDecryptStream", { enumerable: true, get: function () { return gerdur_core_2.createDecryptStream; } });
154
+ Object.defineProperty(exports, "getStream", { enumerable: true, get: function () { return gerdur_core_2.getStream; } });
155
+ Object.defineProperty(exports, "addTrackTags", { enumerable: true, get: function () { return gerdur_core_2.addTrackTags; } });
156
+ Object.defineProperty(exports, "getRichAlbum", { enumerable: true, get: function () { return gerdur_core_2.getRichAlbum; } });
157
+ Object.defineProperty(exports, "normalizeContributors", { enumerable: true, get: function () { return gerdur_core_2.normalizeContributors; } });
158
+ Object.defineProperty(exports, "toLrc", { enumerable: true, get: function () { return gerdur_core_2.toLrc; } });
159
+ Object.defineProperty(exports, "GeoBlocked", { enumerable: true, get: function () { return gerdur_core_2.GeoBlocked; } });
160
+ Object.defineProperty(exports, "DeezerError", { enumerable: true, get: function () { return gerdur_core_2.DeezerError; } });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gerdur",
3
- "version": "2.6.0",
3
+ "version": "2.8.0",
4
4
  "description": "The crucial streaming module for dabox systems.",
5
5
  "author": "Christian",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -48,7 +48,7 @@
48
48
  "adm-zip": "^0.5.16",
49
49
  "chalk": "^4.1.2",
50
50
  "commander": "^9.5.0",
51
- "gerdur-core": "^2.6.0",
51
+ "gerdur-core": "^2.10.0",
52
52
  "dot-prop": "^6.0.1",
53
53
  "got": "^11.8.6",
54
54
  "gradient-string": "^2.0.2",