crunchyroll-js-api
Version:
JavaScript API consumer for crunchyroll
3,777 lines • 138 kB
JavaScript
/******/ var __webpack_modules__ = ({
/***/ "./src/config.js":
/*!***********************!*\
!*** ./src/config.js ***!
\***********************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
production: 'cr-production',
vilo: 'https://static.crunchyroll.com/vilos',
clientId: 'xunihvedbt3mbisuhevt',
clientSecret: '1kIS5dyTvjE0_rqaA3YeAh0bUXUmxW11',
clientIdSso: 'ltccxd10yl6cqcn1acx1',
url: 'https://www.crunchyroll.com',
urlBeta: 'https://beta-api.crunchyroll.com',
urlSso: 'https://sso.crunchyroll.com',
urlStatic: 'https://static.crunchyroll.com',
urlDrm: 'https://cr-play-service.prd.crunchyrollsvc.com',
urlPl: 'https://pl.crunchyroll.com',
urlLicense: 'https://cr-license-proxy.prd.crunchyrollsvc.com',
accountingId: 'crunchyroll',
castId: '4D84B31C',
urlEec: 'https://eec.crunchyroll.com',
appConfig: 'app-config-default-production.json',
versionName: '3.70.4',
appId: 'cr-android',
osReleaseVersion: '13',
contentTypes: ['series', 'movie_listing', 'episode'],
sortByValues: ['popularity', 'newly_added', 'alphabetical'],
ratingContentTypes: ['1s', '2s', '3s', '4s', '5s'],
ratingEpisodeTypes: ['up', 'down'],
});
/***/ }),
/***/ "./src/error.js":
/*!**********************!*\
!*** ./src/error.js ***!
\**********************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/**
* Class to handel custom errors
*/
class CrunchyrollError extends Error {
constructor(message, code = null, context = null, status = null, statusText = null) {
super(message)
this.code = code
this.context = context
this.httpStatus = status
this.httpStatusText = statusText
Object.setPrototypeOf(this, CrunchyrollError.prototype)
}
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CrunchyrollError);
/***/ }),
/***/ "./src/localStore.js":
/*!***************************!*\
!*** ./src/localStore.js ***!
\***************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js");
/* harmony import */ var _services_auth_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./services/auth.js */ "./src/services/auth.js");
/* harmony import */ var _services_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./services/index.js */ "./src/services/index.js");
/* harmony import */ var _services_account_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./services/account.js */ "./src/services/account.js");
/* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./error.js */ "./src/error.js");
/** @type {import('./types.js').Storage} */
const storage = {
credential: null,
device: null,
token: null,
cms: null,
account: null
}
/**
* @type {Function}
* @param {Object} data
*/
let externalSaveData = null
/**
* @type {Function}
* @returns {Object}
*/
let externalLoadData = null
/**
* @param {Object} jsonData
* @returns {Object}
*/
function fromJSON(jsonData) {
return swapObjectJson(jsonData, _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toCamel)
}
/**
* @param {Object} jsonData
* @returns {Object}
*/
function toJSON(jsonData) {
return swapObjectJson(jsonData, _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toSnake)
}
/**
* @param {Object} [data]
* @returns {Promise}
*/
async function saveToken(data) {
if (data) {
storage.token = fromJSON(data)
storage.token.token = `${storage.token.tokenType} ${storage.token.accessToken}`
} else {
storage.token = null
}
await saveToLocal()
}
/**
* @returns {Promise<String>}
*/
async function getAuthToken() {
let tokenObj = null
if (storage.token && storage.token.accessToken) {
const now = new Date()
const diff = (now.getTime() - (new Date(storage.token.createdDate)).getTime()) / 1000
if (diff < (storage.token.expiresIn - 5)) {
tokenObj = storage.token
}
}
if (!tokenObj) {
let data = null
if (storage.token && storage.token.refreshToken) {
data = await _services_auth_js__WEBPACK_IMPORTED_MODULE_1__["default"].getRefreshToken({
...storage.token,
device: storage.device
})
} else if (storage.credential) {
data = await _services_auth_js__WEBPACK_IMPORTED_MODULE_1__["default"].getToken({
...storage.credential,
device: storage.device
})
}
await saveToken(data)
tokenObj = storage.token
}
if (!tokenObj) {
throw new _error_js__WEBPACK_IMPORTED_MODULE_4__["default"]('No auth token found.')
}
return tokenObj.token
}
/**
* @param {String} profileId
* @returns {Promise<import('./types').TokenObj>}
*/
async function switchProfile(profileId) {
const data = await _services_auth_js__WEBPACK_IMPORTED_MODULE_1__["default"].switchProfile({
...storage.token,
device: storage.device,
profileId
})
await saveToken(data)
return storage.token
}
/**
* @returns {Promise<import('./types').TokenObj>}
*/
async function getToken() {
await getAuthToken()
return storage.token
}
/**
* @returns {Promise}
*/
async function revokeToken() {
if (storage.token) {
await _services_auth_js__WEBPACK_IMPORTED_MODULE_1__["default"].revokeRefreshToken(storage.token)
}
storage.token = null
await saveToLocal()
}
/**
* @returns {Promise<import('./types').CmsObj>}
*/
async function getCms() {
let cms = null
if (storage.cms && storage.cms.bucket) {
const now = new Date()
if (new Date(storage.cms.expires) > now) {
cms = storage.cms
}
}
if (!cms) {
cms = await _services_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].getIndexConfig({ token: await getAuthToken() })
storage.cms = fromJSON(cms.cms)
cms = storage.cms
await saveToLocal()
}
return cms
}
/**
* @returns {Promise<import('./types').AccountObj>}
*/
async function getAccount() {
if (!storage.account || !storage.account.accountId) {
const account = await _services_account_js__WEBPACK_IMPORTED_MODULE_3__["default"].getAccountId({ token: await getAuthToken() })
storage.account = fromJSON(account)
await saveToLocal()
}
return storage.account
}
/**
* Return basic params to query api
* @param {import('./types').Profile} profile
* @returns {Promise<import('./types').AccountAuth>}
*/
async function getContentParam(profile) {
const tokenObj = await getToken()
return {
...tokenObj,
locale: profile.preferred_communication_language,
audioLanguage: profile.preferred_content_audio_language,
}
}
/**
* @todo maybe add a extra field to save locale, and return profile.preferredContentSubtitleLanguage too
*/
async function getLocale() {
return 'es-419'
}
/**
* Load from persistence data
* @returns {Promise}
*/
async function loadFromLocal() {
let data = null
const authData = await authDataFile()
try {
if (externalLoadData) {
data = await externalLoadData()
} else {
const data64 = window.localStorage.getItem(authData)
if (data64) {
data = atob(data64)
}
}
} catch (_e) {
// #if process.env.NODE_COMPILING !== 'true'
// const fs = (await import('fs')).default
// if (fs.existsSync(authData)) {
// data = fs.readFileSync(authData, 'utf-8')
// }
// #endif
}
if (data) {
const jsonData = JSON.parse(data)
Object.assign(storage, fromJSON(jsonData))
}
}
/**
* Save to persistence data
* @returns {Promise}
*/
async function saveToLocal() {
const authData = await authDataFile()
const data = JSON.stringify(toJSON(storage), null, '\t')
try {
if (externalSaveData) {
await externalSaveData(data)
} else {
window.localStorage.setItem(authData, btoa(data))
}
} catch (_e) {
// #if process.env.NODE_COMPILING !== 'true'
// const fs = (await import('fs')).default
// fs.writeFileSync(authData, data)
// #endif
}
}
/**
* @param {Object} jsonData
* @param {Function} func
* @returns {Object}
*/
function swapObjectJson(jsonData, func) {
let out
if (jsonData) {
if (Array.isArray(jsonData)) {
out = []
for (const item of jsonData) {
out.push(swapObjectJson(item, func))
}
} else if (typeof jsonData === 'object' || Object.prototype.isPrototypeOf.call(jsonData, Object)) {
out = {}
for (const key of Object.keys(jsonData)) {
out[func(key)] = swapObjectJson(jsonData[key], func)
}
} else {
out = jsonData
}
} else {
out = jsonData
}
return out
}
/**
* Disk file with credential data
* @returns {Promise<String>}
*/
async function authDataFile() {
let out = 'crunchyData'
// #if process.env.NODE_COMPILING !== 'true'
// const path = (await import('path')).default
// out = path.resolve('.') + '/authData.json'
// #endif
return out
}
/**
* Set function to save and load data from external storage
* @param {{save: Function, load: Function}} obj
*/
function setExternalStorage({ save, load }) {
if (load !== undefined) {
externalLoadData = load
}
if (save !== undefined) {
externalSaveData = save
}
}
/**
* Set credentials of an account
* @param {Storage} newData
* @returns {Promise}
*/
async function setNewData(newData) {
Object.assign(storage, newData)
await saveToLocal()
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
storage,
getAuthToken,
getToken,
getLocale,
getCms,
getContentParam,
loadFromLocal,
saveToLocal,
authDataFile,
getAccount,
saveToken,
setExternalStorage,
setNewData,
switchProfile,
revokeToken,
});
/***/ }),
/***/ "./src/logger.js":
/*!***********************!*\
!*** ./src/logger.js ***!
\***********************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
let LEVEL = 'info', COLOR_ACTIVE = true
if (process && process.env && process.env.LOG_LEVEL) {
LEVEL = process.env.LOG_LEVEL
}
/**
@type {{
info: Function,
error: Function,
debug: Function,
setLevel: Function,
activeColor: Function,
}}
*/
const logger = {
info: () => { },
error: () => { },
debug: () => { },
setLevel: () => { },
/**
* @param {Boolean} active
*/
activeColor: active => { COLOR_ACTIVE = active },
}
if (!console.debug) { console.debug = console.log }
if (!console.info) { console.info = console.log }
if (!console.error) { console.error = console.log }
/**
* @param {Object} obj
*/
const formatObj = obj => {
let extra = ''
const keys = Object.keys(obj)
if (keys.length) {
if (keys.length === 2 && keys.includes('message') && keys.includes('stack')) {
/** @type {Error} */
const err = obj
extra = `\n message:${err.name}\n stack:${err.stack}`
} else {
extra = '\n' + JSON.stringify(obj, null, ' ')
}
} else if (obj instanceof Error) {
extra = `\n message:${obj.name}\n stack:${obj.stack}`
} else if (obj instanceof Set) {
extra = '[' + Array.from(obj).toString() + ']'
}
return extra
}
const colors = { debug: '\x1b[33m', info: '\x1b[32m', error: '\x1b[31m', reset: '\x1b[0m' }
/**
* @param {any} message
* @param {String} level
*/
const getMessage = (message, level) => {
if (!(typeof (message) === 'string' || message instanceof String)) {
message = formatObj(message)
}
const error = new Error();
/** @type {String} */
const callerFile = error.stack.split('\n')[3]
let color = colors[level], resetColor = colors['reset']
if (!COLOR_ACTIVE) {
color = resetColor = ''
}
const date = new Date().toISOString()
return `${date} ${color}${level.toUpperCase()} ${message} ${(callerFile || '').trim()} ${resetColor}`
}
/**
* @param {String} newLevel
*/
function configBrowserLogger(newLevel) {
if (!newLevel) {
newLevel = LEVEL
}
logger.debug = () => { }
logger.info = () => { }
logger.error = () => { }
/*eslint-disable */
switch (newLevel) {
case 'silent': break;
case 'debug': logger.debug = msg => { console.debug(getMessage(msg, 'debug')) };
case 'info': logger.info = msg => { console.info(getMessage(msg, 'info')) };
case 'error': logger.error = msg => { console.error(getMessage(msg, 'error')) };
break;
}
return logger
}
logger.setLevel = configBrowserLogger
logger.setLevel()
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (logger);
/***/ }),
/***/ "./src/services/account.js":
/*!*********************************!*\
!*** ./src/services/account.js ***!
\*********************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/**
* Return account info
* @param {Object} obj
* @param {String} obj.token
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').Account>}
*/
async function getAccountId({ token, fnConfig }) {
const fnName = 'getAccountId'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/accounts/v1/me`
const reqConfig = {
method: 'get',
headers: { Authorization: token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* Return profile info
* @deprecated
* @param {Object} obj
* @param {String} obj.token
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').Profile>}
*/
async function getProfile({ token, fnConfig }) {
const fnName = 'getProfile'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/accounts/v1/me/profile`
const reqConfig = {
method: 'get',
headers: { Authorization: token },
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* Return user names, idk what it is
* @param {Object} obj
* @param {String} obj.token
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{usernames: Array<String>}>}
*/
async function getUsernames({ token, fnConfig }) {
const fnName = 'getAccountId'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/accounts/v1/usernames`
const reqConfig = {
method: 'get',
headers: { Authorization: token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* Update profile
* @param {Object} obj
* @param {String} obj.token
* @param {import('../types').Profile} obj.data
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function updateProfile({ token, data, fnConfig }) {
const fnName = 'updateProfile'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/accounts/v1/me/profile`
const reqConfig = {
method: 'patch',
headers: {
Authorization: token,
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
}
// @ts-expect-error
await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* Update profile
* @param {Object} obj
* @param {String} obj.token
* @param {import('../types').ProfileCreate} obj.data
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function createMultiProfile({ token, data, fnConfig }) {
const fnName = 'createMultiProfile'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/accounts/v1/me/multiprofile`
const reqConfig = {
method: 'post',
headers: {
Authorization: token,
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
}
// @ts-expect-error
await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* Delete profile
* @param {Object} obj
* @param {String} obj.token
* @param {String} obj.profileId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function deleteMultiProfile({ token, profileId, fnConfig }) {
const fnName = 'deleteMultiProfile'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/accounts/v1/me/multiprofile/${profileId}`
const reqConfig = {
method: 'delete',
headers: {
Authorization: token,
'Content-Type': 'application/json',
},
}
// @ts-expect-error
await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* Return profile info
* @param {Object} obj
* @param {String} obj.token
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').ProfileResponse>}
*/
async function getMultiProfiles({ token, fnConfig }) {
const fnName = 'getMultiProfiles'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/accounts/v1/me/multiprofile`
const reqConfig = {
method: 'get',
headers: { Authorization: token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* Update profile
* @param {Object} obj
* @param {String} obj.token
* @param {import('../types').Profile} obj.data
* @param {String} obj.profileId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function updateMultiProfile({ token, data, profileId, fnConfig }) {
const fnName = 'updateMultiProfile'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/accounts/v1/me/multiprofile/${profileId}`
const reqConfig = {
method: 'patch',
headers: {
Authorization: token,
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
}
// @ts-expect-error
await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* Return profile info
* @param {Object} obj
* @param {String} obj.token
* @param {String} obj.profileId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').Profile>}
*/
async function getMultiProfile({ token, profileId, fnConfig }) {
const fnName = 'getMultiProfiles'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/accounts/v1/me/multiprofile/${profileId}`
const reqConfig = {
method: 'get',
headers: { Authorization: token },
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
createMultiProfile,
deleteMultiProfile,
getAccountId,
getProfile,
getMultiProfile,
getMultiProfiles,
getUsernames,
updateProfile,
updateMultiProfile
});
/***/ }),
/***/ "./src/services/assets.js":
/*!********************************!*\
!*** ./src/services/assets.js ***!
\********************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/**
* Return Avatar list
* @param {Object} obj
* @param {String} obj.token
* @param {String} obj.lang
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<import('../types.js').AssesItem>}>}
*/
async function getAvatar({ token, lang, fnConfig }) {
const fnName = 'getAvatar'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/assets/v2/${lang}/avatar`
const reqConfig = {
method: 'get',
headers: { Authorization: token },
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* Return wallpaper list
* @param {Object} obj
* @param {String} obj.token
* @param {String} obj.lang
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<import('../types.js').AssesItem>}>}
*/
async function getWallpaper({ token, lang, fnConfig }) {
const fnName = 'getWallpaper'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/assets/v2/${lang}/wallpaper`
const reqConfig = {
method: 'get',
headers: { Authorization: token },
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
getAvatar,
getWallpaper,
});
/***/ }),
/***/ "./src/services/auth.js":
/*!******************************!*\
!*** ./src/services/auth.js ***!
\******************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
/**
* Return hardcode credentials to login
* @returns {String}
*/
function getBasicToken() {
const credenciales = `${_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].clientId}:${_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].clientSecret}`
let buff = Buffer.from(credenciales)
let base64data = buff.toString('base64')
return base64data
}
/**
* Get device code for easy login
* @param {Object} obj
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').DeviceCode>}
*/
async function getDeviceCode(obj) {
const fnName = 'getDeviceCode'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const basicToken = getBasicToken()
const body = { grant_type: 'client_id' }
const url = `/auth/v1/device/code`
const reqConfig = {
method: 'post',
body: await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(body),
headers: {
Authorization: `Basic ${basicToken}`,
'Content-Type': 'application/x-www-form-urlencoded',
'etp-anonymous-id': null,
},
}
const { fnConfig } = (obj || {})
// @ts-expect-error
const token = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
if (token) {
token.created_date = new Date().toISOString()
}
return token
}
/**
* Get access token from device code
* @param {Object} obj
* @param {import('../types.js').Device} obj.device Device
* @param {String} obj.deviceCode login type
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').Token>}
*/
async function getDeviceAuth({ device, deviceCode, fnConfig }) {
const fnName = 'getDeviceAuth'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const basicToken = getBasicToken()
const body = {
device_id: device.id,
device_name: device.name,
device_type: device.type,
device_code: deviceCode,
}
const url = `/auth/v1/device/token`
const reqConfig = {
method: 'post',
body: JSON.stringify(body),
headers: {
Authorization: `Basic ${basicToken}`,
'Content-Type': 'application/json',
},
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* Make out system login
* @param {Object} obj
* @param {import('../types.js').Device} obj.device Device
* @param {Object} obj.credentials login type
* @param {String} obj.grantType login type
* @param {String} [obj.scope]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').Token>}
*/
async function _makeLogin({ device, credentials, grantType, scope, fnConfig }) {
const fnName = '_makeLogin'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const basicToken = getBasicToken()
const body = {
grant_type: grantType,
scope: scope || 'offline_access',
device_id: device.id,
device_name: device.name,
device_type: device.type,
...credentials,
}
const url = `/auth/v1/token`
const reqConfig = {
method: 'post',
body: await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(body),
headers: {
Authorization: `Basic ${basicToken}`,
'Content-Type': 'application/x-www-form-urlencoded',
'ETP-Anonymous-ID': null,
},
}
// @ts-expect-error
const token = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
if (token) {
token.created_date = new Date().toISOString()
}
return token
}
/**
* Make out system login
* @param {Object} obj
* @param {import('../types.js').Device} obj.device Device
* @param {String} [obj.scope]
* @param {String} obj.username user's email
* @param {String} obj.password user's password
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').Token>}
*/
async function getToken({ device, scope, username, password, fnConfig }) {
const fnName = 'getToken'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
return _makeLogin({
device,
scope,
grantType: 'password',
credentials: { username, password },
fnConfig,
})
}
/**
* Make out system login
* @param {Object} obj
* @param {import('../types.js').Device} obj.device Device
* @param {String} [obj.scope]
* @param {String} obj.phone user's phone
* @param {String} obj.verification_code
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').Token>}
*/
async function getTokenWithPhone({ device, scope, phone, verification_code, fnConfig }) {
const fnName = 'getTokenWithPhone'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
return _makeLogin({
device,
scope,
grantType: 'phone',
credentials: { phone_number: phone, verification_code },
fnConfig,
})
}
/**
* Make out system login
* @param {Object} obj
* @param {import('../types.js').Device} obj.device Device
* @param {String} [obj.scope]
* @param {String} obj.code
* @param {String} obj.code_verifier
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').Token>}
*/
async function getTokenWithCode({ device, scope, code, code_verifier, fnConfig }) {
const fnName = 'getTokenWithCode'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
return _makeLogin({
device,
scope,
grantType: 'authorization_code',
credentials: { code, code_verifier: code_verifier },
fnConfig,
})
}
/**
* Refresh access token.
* @param {Object} obj
* @param {import('../types.js').Device} obj.device Device
* @param {String} [obj.scope]
* @param {String} obj.refreshToken refresh token from login
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').Token>}
*/
async function getRefreshToken({ device, scope, refreshToken, fnConfig }) {
const fnName = 'getRefreshToken'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
return _makeLogin({
device,
scope,
grantType: 'refresh_token',
credentials: { refresh_token: refreshToken },
fnConfig,
})
}
/**
* Switch profile
* @param {Object} obj
* @param {import('../types.js').Device} obj.device Device
* @param {String} [obj.scope]
* @param {String} obj.refreshToken refresh token from login
* @param {String} obj.profileId profile id for switch
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').Token>}
*/
async function switchProfile({ device, scope, refreshToken, profileId, fnConfig }) {
const fnName = 'switchProfile'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
return _makeLogin({
device,
scope,
grantType: 'refresh_token_profile_id',
credentials: { refresh_token: refreshToken, profile_id: profileId },
fnConfig,
})
}
/**
* revoke access token.
* @param {Object} obj
* @param {String} obj.refreshToken
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{status: String}>}
*/
async function revokeRefreshToken({ refreshToken, fnConfig }) {
const fnName = 'revokeRefreshToken'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const basicToken = getBasicToken()
const body = { token: refreshToken }
const url = `/auth/v1/revoke`
const reqConfig = {
method: 'post',
body: await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(body),
headers: {
Authorization: `Basic ${basicToken}`,
'Content-Type': 'application/x-www-form-urlencoded',
'ETP-Anonymous-ID': null,
},
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
getDeviceCode,
getDeviceAuth,
getToken,
getTokenWithPhone,
getTokenWithCode,
getRefreshToken,
revokeRefreshToken,
switchProfile,
});
/***/ }),
/***/ "./src/services/cms.js":
/*!*****************************!*\
!*** ./src/services/cms.js ***!
\*****************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.episodeId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getEpisode({ account, episodeId, fnConfig }) {
const fnName = 'getEpisode'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/episodes/${episodeId}?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.seasonId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getEpisodes({ account, seasonId, fnConfig }) {
const fnName = 'getEpisodes'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/seasons/${seasonId}/episodes?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.movieId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getMovie({ account, movieId, fnConfig }) {
const fnName = 'getMovie'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/movies/${movieId}?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.movieListingId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getMovieListing({ account, movieListingId, fnConfig }) {
const fnName = 'getMovieListing'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/movie_listings/${movieListingId}?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.movieListingId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getMovieListingExtras({ account, movieListingId, fnConfig }) {
const fnName = 'getMovieListingExtras'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/movie_listings/${movieListingId}/extra_videos?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.movieListingId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getMovies({ account, movieListingId, fnConfig }) {
const fnName = 'getMovies'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/movie_listings/${movieListingId}/movies?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Array<String>} obj.objectIds
* @param {Boolean} obj.ratings
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function getObjects({ account, objectIds, ratings, fnConfig }) {
const fnName = 'getObjects'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'ratings', ratings)
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/objects/${objectIds.join(',')}?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.seasonId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getSeason({ account, seasonId, fnConfig }) {
const fnName = 'getSeason'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/seasons/${seasonId}?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.seasonId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getSeasonExtras({ account, seasonId, fnConfig }) {
const fnName = 'getSeasonExtras'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/seasons/${seasonId}/extra_videos?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.serieId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getSeasons({ account, serieId, fnConfig }) {
const fnName = 'getSeasons'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/series/${serieId}/seasons?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.serieId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getSeries({ account, serieId, fnConfig }) {
const fnName = 'getSeries'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/series/${serieId}?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @deprecated
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.streamUrl
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getStreamsWithURL({ account, streamUrl, fnConfig }) {
const fnName = 'getStreamsWithURL'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `${streamUrl}?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @deprecated
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getStreams({ account, contentId, fnConfig }) {
const fnName = 'getStreams'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/cms/videos/${contentId}/streams?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getSkiptEvents({ account, contentId, fnConfig }) {
const fnName = 'getSkiptEvents'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `${_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].urlStatic}/skip-events/production/${contentId}.json`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token },
baseUrlIncluded: true,
}
let out = null
try {
// @ts-expect-error
out = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
} catch (_e) {
// ignore any error
}
return out
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
getEpisode,
getEpisodes,
getMovie,
getMovieListing,
getMovieListingExtras,
getMovies,
getObjects,
getSeason,
getSeasonExtras,
getSeasons,
getSeries,
getStreamsWithURL,
getStreams,
getSkiptEvents,
});
/***/ }),
/***/ "./src/services/content.js":
/*!*********************************!*\
!*** ./src/services/content.js ***!
\*********************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../error.js */ "./src/error.js");
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.listId
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function addItemToCustomList({ account, listId, contentId, fnConfig }) {
const fnName = 'addItemToCustomList'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/custom-lists/${listId}?${queryStr}`
const reqConfig = {
method: 'post',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
body: JSON.stringify({ content_id: contentId })
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.listId
* @param {String} obj.contentId
* @param {String} obj.location
* @param {String} obj.refContentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function changeCustomListItemPosition({ account, listId, contentId, location, refContentId, fnConfig }) {
const fnName = 'changeCustomListItemPosition'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/custom-lists/${listId}/${contentId}/position?${queryStr}`
if (!['after', 'before'].includes(location)) { throw new _error_js__WEBPACK_IMPORTED_MODULE_2__["default"](`Wrong location`) }
const reqConfig = {
method: 'put',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
body: JSON.stringify({
location: location,
ref_content_id: refContentId
})
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.listId
* @param {String} [obj.page]
* @param {String} [obj.pageSize]
* @param {String} [obj.sort] manual, date_added
* @param {String} [obj.order] asc, desc
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getCustomListItems({ account, listId, page, pageSize, sort, order, fnConfig }) {
const fnName = 'getCustomListItems'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'page', page)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'page_size', pageSize)
if (sort && !['manual', 'date_added'].includes(sort)) { throw new _error_js__WEBPACK_IMPORTED_MODULE_2__["default"]('Wrong sort value') }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'sort_by', sort)
if (order && !['asc', 'desc'].includes(order)) { throw new _error_js__WEBPACK_IMPORTED_MODULE_2__["default"]('Wrong order value') }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'order', order)
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/custom-lists/${listId}?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.listId
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function deleteCustomListItem({ account, listId, contentId, fnConfig }) {
const fnName = 'deleteCustomListItem'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/custom-lists/${listId}/${contentId}?${queryStr}`
const reqConfig = {
method: 'delete',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.title
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{data: Array<import('../types').CustomListResponse>}>}
*/
async function createPrivateCustomList({ account, title, fnConfig }) {
const fnName = 'createPrivateCustomList'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/custom-lists?${queryStr}`
const reqConfig = {
method: 'post',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
body: JSON.stringify({ title })
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Object, meta: Object}>}
*/
async function getCustomLists({ account, fnConfig }) {
const fnName = 'getCustomLists'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/custom-lists?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.listId
* @param {String} obj.title
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function updateCustomList({ account, listId, title, fnConfig }) {
const fnName = 'updateCustomList'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/custom-lists/${listId}?${queryStr}`
const reqConfig = {
method: 'patch',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
body: JSON.stringify({ title })
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.listId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function deletePrivateCustomList({ account, listId, fnConfig }) {
const fnName = 'deletePrivateCustomList'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/custom-lists/${listId}?${queryStr}`
const reqConfig = {
method: 'delete',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function addWatchlistItem({ account, contentId, fnConfig }) {
const fnName = 'addWatchlistItem'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/watchlist?${queryStr}`
const reqConfig = {
method: 'post',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
body: JSON.stringify({ content_id: contentId })
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Array<String>} [obj.contentIds]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getWatchlistItems({ account, contentIds, fnConfig }) {
const fnName = 'getWatchlistItems'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
if (contentIds && contentIds.length) {
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'content_ids', contentIds.join(','))
}
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
let url = `/content/v2/${account.accountId}/watchlist?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {Boolean} obj.isFavorite
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function updateWatchlistItemFavoriteStatus({ account, contentId, isFavorite, fnConfig }) {
const fnName = 'updateWatchlistItemFavoriteStatus'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/watchlist/${contentId}?${queryStr}`
const reqConfig = {
method: 'patch',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
body: JSON.stringify({ is_favorite: isFavorite })
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function deleteWatchlistItem({ account, contentId, fnConfig }) {
const fnName = 'deleteWatchlistItem'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/watchlist/${contentId}?${queryStr}`
const reqConfig = {
method: 'delete',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} obj.page it has to be > 1
* @param {Number} obj.pageSize
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getWatchHistory({ account, page, pageSize, fnConfig }) {
const fnName = 'getWatchHistory'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'page', page, val => val > 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'page_size', pageSize, val => val > 0)
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/watch-history?${query}`
const reqConfig = {
method: 'get',
headers: {
Authorization: account.token,
upload_offline_playheads: true,
}
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Array<String>} obj.contentIds
* @param {Boolean} obj.uploadOfflinePlayheads
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function _getPlayheads({ account, contentIds, uploadOfflinePlayheads, fnConfig }) {
const fnName = '_getPlayheads'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'content_ids', contentIds.join(','))
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/playheads?${query}`
const reqConfig = {
method: 'get',
headers: {
Authorization: account.token,
upload_offline_playheads: uploadOfflinePlayheads
}
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Array<String>} obj.contentIds
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getPlayheads({ account, contentIds, fnConfig }) {
return _getPlayheads({ account, contentIds, uploadOfflinePlayheads: true, fnConfig })
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {Number} obj.playhead
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function savePlayhead({ account, contentId, playhead, fnConfig }) {
const fnName = 'savePlayhead'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/${account.accountId}/playheads?${queryStr}`
const reqConfig = {
method: 'post',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
body: JSON.stringify({
content_id: contentId,
playhead: playhead
})
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.method http method
* @param {Boolean} [obj.baseUrlIncluded]
* @param {String} obj.url if url incluse a domain pass baseUrlIncluded=true
* @param {Object} [obj.body]
* @param {Object} [obj.headers]
* @param {Object} [obj.queryParams]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getData({
account,
method = 'get',
baseUrlIncluded = false,
url,
body = null,
headers = {},
queryParams = {},
fnConfig,
}) {
const fnName = 'getData'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = {
locale: account.locale,
preferred_audio_language: account.audioLanguage,
...queryParams,
}
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const urlStr = `${url}?${queryStr}`
const reqConfig = {
method,
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
...headers,
},
baseUrlIncluded,
body: body && JSON.stringify(body),
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, urlStr, reqConfig, fnConfig)
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
addItemToCustomList,
addWatchlistItem,
changeCustomListItemPosition,
createPrivateCustomList,
deleteCustomListItem,
deletePrivateCustomList,
deleteWatchlistItem,
getCustomListItems,
getCustomLists,
getData,
getPlayheads,
getWatchHistory,
getWatchlistItems,
savePlayhead,
updateCustomList,
updateWatchlistItemFavoriteStatus,
});
/***/ }),
/***/ "./src/services/discover.js":
/*!**********************************!*\
!*** ./src/services/discover.js ***!
\**********************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
/* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../error.js */ "./src/error.js");
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} [obj.quantity] Number of records in a result
* @param {Number} [obj.start] Offset to request
* @param {Boolean} [obj.ratings]
* @param {String} [obj.order] Order
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>}>}
*/
async function getWatchlist({ account, quantity, start, ratings, order, fnConfig }) {
const fnName = 'getWatchlist'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'n', quantity, val => val > 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'start', start, val => val >= 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'ratings', ratings)
if (order && !['desc', 'asc'].includes(order)) { throw new _error_js__WEBPACK_IMPORTED_MODULE_3__["default"]('Wrong order value') }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'order', order)
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/${account.accountId}/watchlist?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} [obj.quantity] Number of records in a result
* @param {Number} [obj.start] Offset to request
* @param {Array<String>} [obj.category] Category
* @param {String} [obj.query] Search pattern
* @param {String} [obj.seasonTag] season tag
* @param {String} [obj.sort] sort results
* @param {String} [obj.type] type for search, example episode
* @param {Boolean} [obj.ratings]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function getBrowseAll({ account, quantity, start, category, query, seasonTag, sort, type, ratings, fnConfig }) {
const fnName = 'getBrowseAll'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'n', quantity, val => val > 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'start', start, val => val >= 0)
if (category && category.length) {
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'categories', category.join(','))
}
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'q', query)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'seasonal_tag', seasonTag)
if (sort && !_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].sortByValues.includes(sort)) { throw new _error_js__WEBPACK_IMPORTED_MODULE_3__["default"]('Wrong sort value') }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'sort_by', sort)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'type', type)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'ratings', ratings)
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/browse?${queryStr}`
const reqConfig = {
method: 'get',
headers: {
Authorization: account.token,
'add_watchlist_status': true,
}
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Array<String>} [obj.category] Category
* @param {String} [obj.sort] sort results
* @param {Boolean} [obj.ratings]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function getBrowseIndex({ account, category, sort, ratings, fnConfig }) {
const fnName = 'getBrowseIndex'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
if (category && category.length) {
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'categories', category.join(','))
}
if (sort && !_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].sortByValues.includes(sort)) { throw new _error_js__WEBPACK_IMPORTED_MODULE_3__["default"]('Wrong sort value') }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'sort_by', sort)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'ratings', ratings)
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/browse/index?${queryStr}`
const reqConfig = {
method: 'get',
headers: {
Authorization: account.token,
'add_watchlist_status': true,
}
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function getCategories({ account, contentId, fnConfig }) {
const fnName = 'getCategories'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'guid', contentId)
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/categories?${query}`
const reqConfig = {
method: 'get',
headers: {
Authorization: account.token,
'add_watchlist_status': true,
}
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} obj.parentCategory Offset to request
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function getSubcategories({ account, parentCategory, fnConfig }) {
const fnName = 'getSubcategories'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'parent_category', parentCategory)
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/categories/${parentCategory}/sub_categories?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} [obj.quantity] Number of records in a result
* @param {Number} [obj.start] Offset to request
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<Object>}>}
*/
async function getHomeFeed({ account, quantity, start, fnConfig }) {
const fnName = 'getHomeFeed'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'n', quantity, val => val > 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'start', start, val => val >= 0)
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/${account.accountId}/home_feed?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').HomeItem>}
*/
async function getHome({ account, fnConfig }) {
const fnName = 'getHome'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `${_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].url}/f/v1/home?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token },
baseUrlIncluded: true,
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.collectionId
* @param {Boolean} obj.ratings
* @param {String} [obj.vendor]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').HomeItem>}
*/
async function getPersonalRecomendation({ account, collectionId, ratings, vendor, fnConfig }) {
const fnName = 'getPersonalRecomendation'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = {
collectionId,
ratings,
vendor,
locale: account.locale,
profileId: account.profileId,
}
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `${_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].url}/personalization/v2/personalization?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token },
baseUrlIncluded: true,
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} obj.quantity
* @param {Boolean} obj.ratings
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function getHistory({ account, quantity, ratings, fnConfig }) {
const fnName = 'getHistory'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'n', quantity, val => val > 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'ratings', ratings)
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/${account.accountId}/history?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} [obj.quantity] Number of records in a result
* @param {Number} [obj.start] Offset to request
* @param {Boolean} [obj.ratings]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function getRecommendations({ account, quantity, start, ratings, fnConfig }) {
const fnName = 'getRecommendations'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'n', quantity, val => val > 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'start', start, val => val >= 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'ratings', ratings)
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/${account.accountId}/recommendations?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<{id: String, localization: Object}>}>}
*/
async function getSeasonList({ account, fnConfig }) {
const fnName = 'getSeasonList'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/seasonal_tags?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} obj.contentId Offset to request
* @param {Number} [obj.quantity] Number of records in a result
* @param {Number} [obj.start] Offset to request
* @param {Boolean} [obj.ratings]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function getSimilar({ account, contentId, quantity, start, ratings, fnConfig }) {
const fnName = 'getSimilar'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'n', quantity, val => val > 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'start', start, val => val >= 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'ratings', ratings)
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/${account.accountId}/similar_to/${contentId}?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function getNext({ account, contentId, fnConfig }) {
const fnName = 'getNext'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/up_next/${contentId}?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function getPrev({ account, contentId, fnConfig }) {
const fnName = 'getPrev'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/previous_episode/${contentId}?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.query search partner
* @param {Number} [obj.quantity] Number of records in a result
* @param {Number} [obj.start] Offset to request
* @param {Array<String>} [obj.type] Can be top_results, series, movie_listing, episode
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{total: Number, data: Array<Object>, meta: Object}>}
*/
async function search({ account, query, quantity, start, type, fnConfig }) {
const fnName = 'search'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const types = _config_js__WEBPACK_IMPORTED_MODULE_2__["default"].contentTypes.concat(['top_results', 'music'])
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'q', query)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'n', quantity, val => val > 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'start', start, val => val >= 0)
if (type && type.length) {
for (const t of type) {
if (!types.includes(t)) {
throw new _error_js__WEBPACK_IMPORTED_MODULE_3__["default"]('Wrong type value.')
}
}
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'type', type.join(','))
}
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/search?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} obj.contentId Offset to request
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function markAsWatched({ account, contentId, fnConfig }) {
const fnName = 'markAsWatched'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/discover/${account.accountId}/mark_as_watched/${contentId}?${query}`
const reqConfig = {
method: 'post',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
getWatchlist,
getBrowseAll,
getBrowseIndex,
getCategories,
getSubcategories,
getHome,
getHomeFeed,
getPersonalRecomendation,
getHistory,
getRecommendations,
getSeasonList,
getSimilar,
getNext,
getPrev,
search,
markAsWatched,
});
/***/ }),
/***/ "./src/services/drm.js":
/*!*****************************!*\
!*** ./src/services/drm.js ***!
\*****************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.episodeId
* @param {String} [obj.type] only null or music
* @param {String} [obj.browser] browser name
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getStream({ account, episodeId, type, browser, fnConfig }) {
const fnName = 'getStream'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
type = type ? `/${type}` : ''
browser = browser || 'chrome'
if (!['chrome', 'firefox', 'safari', 'explorer'].includes(browser)) {
throw new Error('Wrong browser, ' + browser)
}
const url = `${_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].urlDrm}/v1${type}/${episodeId}/web/${browser}/play`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token },
baseUrlIncluded: true,
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.episodeId
* @param {String} obj.token
* @param {Number} obj.playhead
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function keepAlive({ account, token, episodeId, playhead, fnConfig }) {
const fnName = 'keepAlive'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { playhead }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `${_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].urlDrm}/v1/token/${episodeId}/${token}/keepAlive?${queryStr}`
let body = null, FormDataFn = null
try {
FormDataFn = window.FormData
} catch (_e) {
// #if process.env.NODE_COMPILING !== 'true'
// FormDataFn = await import('form-data')
// FormDataFn = FormDataFn.default
// #endif
}
body = new FormDataFn()
body.append('position', playhead.toString())
const reqConfig = {
method: 'PATCH',
headers: { Authorization: account.token },
baseUrlIncluded: true,
body,
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.episodeId
* @param {String} obj.token
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function revokeToken({ account, episodeId, token, fnConfig }) {
const fnName = 'revokeToken'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `${_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].urlDrm}/v1/token/${episodeId}/${token}/delete`
const reqConfig = {
method: 'post',
headers: { Authorization: account.token },
baseUrlIncluded: true,
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.episodeId
* @param {String} obj.token
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function deleteToken({ account, episodeId, token, fnConfig }) {
const fnName = 'deleteToken'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `${_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].urlDrm}/v1/token/${episodeId}/${token}`
const reqConfig = {
method: 'delete',
headers: { Authorization: account.token },
baseUrlIncluded: true,
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.assetId
* @param {String} obj.sessionId `${new Date().getTime()}-${account.accountId}`
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{custom_data: String, token: String}>}
*/
async function getAuth({ account, assetId, sessionId, fnConfig }) {
const fnName = 'getAuth'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `${_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].urlPl}/drm/v1/auth`
const reqConfig = {
method: 'post',
headers: { Authorization: account.token },
baseUrlIncluded: true,
body: JSON.stringify({
accounting_id: _config_js__WEBPACK_IMPORTED_MODULE_2__["default"].accountingId,
asset_id: assetId,
session_id: sessionId,
user_id: account.accountId,
})
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
getStream,
getAuth,
keepAlive,
revokeToken,
deleteToken,
});
/***/ }),
/***/ "./src/services/index.js":
/*!*******************************!*\
!*** ./src/services/index.js ***!
\*******************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/**
* Return index data. Cms is set there
* @param {Object} obj
* @param {String} obj.token
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').CmsContainer>}
*/
async function getIndexConfig({ token, fnConfig }) {
const fnName = 'getIndexConfig'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const url = `/index/v2`
const reqConfig = {
method: 'get',
headers: { Authorization: token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
getIndexConfig,
});
/***/ }),
/***/ "./src/services/music.js":
/*!*******************************!*\
!*** ./src/services/music.js ***!
\*******************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} [obj.quantity] Number of records in a result
* @param {Number} [obj.start] Offset to request
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<Object>}>}
*/
async function getFeed({ account, quantity, start, fnConfig }) {
const fnName = 'getFeed'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'n', quantity, val => val > 0)
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'start', start, val => val >= 0)
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/music/${account.accountId}/landing_feed?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Array<String>} [obj.artistIds]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<Object>}>}
*/
async function getArtist({ account, artistIds, fnConfig }) {
const fnName = 'getArtist'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/music/artists/${artistIds.join(',')}?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Array<String>} [obj.artistId]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<Object>}>}
*/
async function getArtistConcerts({ account, artistId, fnConfig }) {
const fnName = 'getArtistConcerts'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/music/artists/${artistId}/concerts?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.artistId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<Object>}>}
*/
async function getArtistVideos({ account, artistId, fnConfig }) {
const fnName = 'getArtistVideos'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/music/artists/${artistId}/music_videos?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Array<String>} [obj.concertIds]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<Object>}>}
*/
async function getConcerts({ account, concertIds, fnConfig }) {
const fnName = 'getConcerts'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/music/concerts/${concertIds.join(',')}?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Array<String>} [obj.musicIds]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<Object>}>}
*/
async function getVideo({ account, musicIds, fnConfig }) {
const fnName = 'getVideo'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const query = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/music/music_videos/${musicIds.join(',')}?${query}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @deprecated
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.streamUrl
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getStreamsWithURL({ account, streamUrl, fnConfig }) {
const fnName = 'getStreamsWithURL'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `${streamUrl}?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @deprecated
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getStreams({ account, contentId, fnConfig }) {
const fnName = 'getStreams'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/music/${contentId}/streams?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {Number} obj.contentId Number of records in a result
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<{items: Array<Object>}>}
*/
async function getFeatured({ account, contentId, fnConfig }) {
const fnName = 'getFeatured'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale, preferred_audio_language: account.audioLanguage }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/content/v2/music/featured/${contentId}?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
getArtist,
getArtistConcerts,
getArtistVideos,
getConcerts,
getFeed,
getStreams,
getStreamsWithURL,
getVideo,
getFeatured,
});
/***/ }),
/***/ "./src/services/review.js":
/*!********************************!*\
!*** ./src/services/review.js ***!
\********************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config.js */ "./src/config.js");
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {String} obj.rating
* @param {String} [obj.contentType]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').RatingEpisode>}
*/
async function addEpisodeRating({ account, contentId, rating, contentType, fnConfig }) {
const fnName = 'addEpisodeRating'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
contentType = contentType ? contentType : 'episode'
if (!_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].contentTypes.includes(contentType)) {
throw new Error(`ContentType ${contentType} is not valid.`)
}
if (!_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].ratingEpisodeTypes.includes(rating)) {
throw new Error(`Rating ${rating} is not valid.`)
}
const url = `/content-reviews/v2/user/${account.accountId}/rating/${contentType}/${contentId}?${queryStr}`
const reqConfig = {
method: 'put',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
body: JSON.stringify({ rating: rating })
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {String} obj.rating
* @param {String} obj.contentType
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').RatingStars>}
*/
async function addRating({ account, contentId, rating, contentType, fnConfig }) {
const fnName = 'addRating'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
if (!_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].contentTypes.includes(contentType)) {
throw new Error(`ContentType ${contentType} is not valid.`)
}
if (!_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].ratingContentTypes.includes(rating)) {
throw new Error(`Rating ${rating} is not valid.`)
}
const url = `/content-reviews/v2/user/${account.accountId}/rating/${contentType}/${contentId}?${queryStr}`
const reqConfig = {
method: 'put',
headers: {
Authorization: account.token,
'Content-Type': 'application/json',
},
body: JSON.stringify({ rating: rating })
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {String} obj.contentType
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function _getRatings({ account, contentId, contentType, fnConfig }) {
const fnName = '_getRatings'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
if (!_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].contentTypes.includes(contentType)) {
throw new Error(`ContentType ${contentType} is not valid.`)
}
const url = `/content-reviews/v2/user/${account.accountId}/rating/${contentType}/${contentId}?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').RatingEpisode>}
*/
async function getEpisodeRatings({ account, contentId, fnConfig }) {
return _getRatings({ account, contentId, contentType: 'episode', fnConfig })
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {String} obj.contentType
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<import('../types').RatingStars>}
*/
async function getRatings({ account, contentId, contentType, fnConfig }) {
return _getRatings({ account, contentId, contentType, fnConfig })
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.account
* @param {String} obj.contentId
* @param {String} obj.contentType
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise}
*/
async function removeRating({ account, contentId, contentType, fnConfig }) {
const fnName = 'removeRating'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: account.locale }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
if (!_config_js__WEBPACK_IMPORTED_MODULE_2__["default"].contentTypes.includes(contentType)) {
throw new Error(`ContentType ${contentType} is not valid.`)
}
const url = `/content-reviews/v2/user/${account.accountId}/rating/${contentType}/${contentId}?${queryStr}`
const reqConfig = {
method: 'delete',
headers: { Authorization: account.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
addEpisodeRating,
addRating,
getEpisodeRatings,
getRatings,
removeRating,
});
/***/ }),
/***/ "./src/services/subscription.js":
/*!**************************************!*\
!*** ./src/services/subscription.js ***!
\**************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ "./src/utils.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../logger.js */ "./src/logger.js");
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.auth
* @param {String} [obj.source]
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getProducts({ auth, source, fnConfig }) {
const fnName = 'getProducts'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: auth.locale }
_utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].addParam(queryData, 'source', source ? source : 'google-play')
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/subs/v2/products?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: auth.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.auth
* @param {String} obj.externalId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getUserBenefits({ auth, externalId, fnConfig }) {
const fnName = 'getUserBenefits'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: auth.locale }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/subs/v1/subscriptions/${externalId}/benefits?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: auth.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/**
* @param {Object} obj
* @param {import('../types').AccountAuth} obj.auth
* @param {String} obj.externalId
* @param {import('../types').FetchConfig} [obj.fnConfig] util config param
* @returns {Promise<Object>}
*/
async function getUserSubscription({ auth, externalId, fnConfig }) {
const fnName = 'getUserSubscription'
_logger_js__WEBPACK_IMPORTED_MODULE_1__["default"].debug(fnName)
const queryData = { locale: auth.locale }
const queryStr = await _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].toURLSearchParams(queryData)
const url = `/subs/v1/subscriptions/${externalId}/products?${queryStr}`
const reqConfig = {
method: 'get',
headers: { Authorization: auth.token }
}
// @ts-expect-error
return _utils_js__WEBPACK_IMPORTED_MODULE_0__["default"].makeRequest(fnName, url, reqConfig, fnConfig)
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
getProducts,
getUserBenefits,
getUserSubscription
});
/***/ }),
/***/ "./src/types.js":
/*!**********************!*\
!*** ./src/types.js ***!
\**********************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
// JSON Types returned from requests
/**
* @typedef Token
* @type {Object}
* @property {String} access_token
* @property {String} refresh_token
* @property {Number} expires_in
* @property {String} token_type
* @property {String} scope
* @property {String} country
* @property {String} account_id
* @property {String} profile_id
* @property {String} created_date
*/
/**
* @typedef TokenObj
* @type {Object}
* @property {String} accessToken
* @property {String} refreshToken
* @property {Number} expiresIn
* @property {String} tokenType
* @property {String} token
* @property {String} scope
* @property {String} country
* @property {String} accountId
* @property {String} profileId
* @property {String} createdDate
*/
/**
* @typedef DeviceCode
* @type {Object}
* @property {String} user_code
* @property {String} device_code
* @property {Number} interval
* @property {Number} expires_in
* @property {Date} created_date
*/
/**
* @typedef Device
* @type {Object}
* @property {String} id
* @property {String} name
* @property {String} type
*/
/**
* @typedef Credential
* @type {Object}
* @property {String} username
* @property {String} password
*/
/**
* @typedef Account
* @type {Object}
* @property {String} account_id
* @property {String} external_id
* @property {Boolean} email_verified
* @property {String} created
*/
/**
* @typedef AccountObj
* @type {Object}
* @property {String} accountId
* @property {String} externalId
* @property {Boolean} emailVerified
* @property {String} created
*/
/**
* @typedef Profile
* @type {Object}
* @property {String} profile_id
* @property {String} avatar
* @property {String} profile_name
* @property {String} [wallpaper]
* @property {Boolean} cr_beta_opt_in
* @property {Boolean} crleg_email_verified
* @property {String} email
* @property {String} maturity_rating
* @property {{BR: String, UN: String}} extended_maturity_rating
* @property {String} preferred_communication_language
* @property {String} preferred_content_subtitle_language
* @property {String} preferred_content_audio_language
* @property {Boolean} qa_user
* @property {String} username
* @property {Boolean} [can_switch]
* @property {Boolean} [is_primary]
* @property {Boolean} [is_selected]
* @property {Boolean} [do_not_sell]
* @property {Boolean} [age_consent]
*/
/**
* @typedef Cms
* @type {Object}
* @property {String} bucket
* @property {String} policy
* @property {String} signature
* @property {String} key_pair_id
* @property {String} expires
*/
/**
* @typedef CmsObj
* @type {Object}
* @property {String} bucket
* @property {String} policy
* @property {String} signature
* @property {String} keyPairId
* @property {String} expires
*/
/**
* @typedef Storage
* @type {Object}
* @property {Credential} credential
* @property {Device} device
* @property {TokenObj} token
* @property {CmsObj} cms
* @property {AccountObj} account
*/
/**
* @typedef CmsContainer
* @type {Object}
* @property {Cms} cms
* @property {Cms} cms_beta
* @property {Cms} cms_web
* @property {Boolean} service_available
* @property {Boolean} default_marketing_opt_in
*/
/**
* @typedef RatingEpisode
* @type {Object}
* @property {Object} up
* @property {String} up.displayed
* @property {String} up.unit
* @property {Object} down
* @property {String} down.displayed
* @property {String} down.unit
* @property {Number} total
* @property {String} rating
*/
/**
* @typedef RatingBasic
* @type {Object}
* @property {String} displayed
* @property {String} unit
* @property {Number} percentage
*/
/**
* @typedef RatingStars
* @type {Object}
* @ts-ignore
* @property {RatingBasic} [1s]
* @property {RatingBasic} [2s]
* @property {RatingBasic} [3s]
* @property {RatingBasic} [4s]
* @property {RatingBasic} [5s]
* @property {String} average
* @property {Number} total
* @property {String} rating
*/
/**
* @typedef AuthBase
* @type {Object}
* @property {String} token
* @property {String} locale
*/
/**
* @typedef {AuthBase & CmsObj} CmsAuth
*/
/**
* @typedef AccountParamSub
* @type {Object}
* @property {String} locale
* @property {String} audioLanguage
* @typedef {TokenObj & AccountParamSub} AccountAuth
*/
/**
* @typedef CustomListResponse
* @type {Object}
* @property {String} list_id
* @property {Number} total
* @property {String} modified_at
*/
/**
* @typedef CrunchyRequestTmp
* @type {Object}
* @property {Boolean} [baseUrlIncluded]
*
* @typedef {CrunchyRequestTmp & import('node-fetch').Request} CrunchyRequest
*/
/**
* @typedef ProfileCreate
* @type {Object}
* @property {String} username
* @property {String} avatar
* @property {String} avatar
* @property {String} wallpaper
* @property {String} profile_name
*/
/**
* @typedef AssesItem
* @type {Object}
* @property {String} title
* @property {Array<{id: String, title: String}>} assets
*/
/**
* @typedef ProfileResponse
* @type {Object}
* @property {Array<Profile>} profiles
* @property {Number} tier_max_profiles
* @property {Number} max_profiles
*/
/**
* @typedef HomeProps
* @type {Object}
* @property {String} [description]
* @property {String} [title]
* @property {String} [analyticsId]
* @property {String} [contentId]
* @property {String} [tallImage]
* @property {String} [wideImage]
* @property {String} [logoImage]
* @property {String} [link]
* @property {String} [musicVideoId]
*/
/**
* @typedef HomeItem
* @type {Object}
* @property {String} type
* @property {String} id
* @property {String} parentId
* @property {HomeProps} props
* @property {Array<HomeItem>} children
*/
/**
* @typedef FetchConfig
* @type {Object}
* @property {Boolean} [direct] turn on return response as raw content
* @property {Boolean} [cache] use cache
* @property {Boolean} [sync] turn on sync mode
*/
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({});
/***/ }),
/***/ "./src/utils.js":
/*!**********************!*\
!*** ./src/utils.js ***!
\**********************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
/* harmony export */ });
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./logger.js */ "./src/logger.js");
/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./config.js */ "./src/config.js");
/* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./error.js */ "./src/error.js");
/**
* In browsers cors make imposible make some request because of that
* provide a custom function to make request
* @type {Function}
*/
let fetchFunction = null
/**
* Returning user-agent
* @return {String}
*/
function getUserAgent() {
return `Crunchyroll/${_config_js__WEBPACK_IMPORTED_MODULE_1__["default"].versionName} Android/${_config_js__WEBPACK_IMPORTED_MODULE_1__["default"].osReleaseVersion}`
}
/**
* log api response
* @param {String} fnName
* @param {import('node-fetch').Response} res
* @returns {Promise}
*/
async function logRes(fnName, res) {
if (!(200 <= res.status && res.status < 300)) {
_logger_js__WEBPACK_IMPORTED_MODULE_0__["default"].error(`Status Code: ${res.status} - ${fnName}`)
/** @type {Object} */
let result = null
try {
result = await res.json()
_logger_js__WEBPACK_IMPORTED_MODULE_0__["default"].error(result)
} catch (_e) {
// ignore
}
if (result) {
throw new _error_js__WEBPACK_IMPORTED_MODULE_2__["default"](result.error, result.code,
result.context, res.status, res.statusText)
} else {
_logger_js__WEBPACK_IMPORTED_MODULE_0__["default"].error(res.statusText)
throw new Error(res.statusText)
}
} else {
_logger_js__WEBPACK_IMPORTED_MODULE_0__["default"].debug(`Status Code: ${res.status} - ${fnName}`)
}
}
/**
* Make http request and return raw response
* @param {String} url
* @param {import('node-fetch').Request} reqConfig
* @param {import('./types').FetchConfig} [fnConfig]
* @returns {Promise<import('node-fetch').Response>}
*/
async function makeRawRequest(url, reqConfig, fnConfig) {
let fetchFn = null
// @ts-expect-error
if (reqConfig.baseUrlIncluded) {
url = decodeURIComponent(`${url}`)
// @ts-expect-error
delete reqConfig.baseUrlIncluded
} else {
url = decodeURIComponent(`${_config_js__WEBPACK_IMPORTED_MODULE_1__["default"].urlBeta}${url}`)
}
_logger_js__WEBPACK_IMPORTED_MODULE_0__["default"].debug(`${reqConfig.method} - ${url}`)
if (!reqConfig.headers) {
// @ts-expect-error
reqConfig.headers = {}
}
reqConfig.headers['User-Agent'] = getUserAgent()
if (fetchFunction) {
fetchFn = fetchFunction
} else {
try {
fetchFn = window.fetch
} catch (_e) {
// #if process.env.NODE_COMPILING !== 'true'
// fetchFn = await import('node-fetch')
// fetchFn = fetchFn.default
// #endif
}
}
return fetchFn(url, reqConfig, fnConfig || {})
}
/**
* Make http request
* @param {String} fnName for loggin
* @param {String} url
* @param {import('node-fetch').Request} reqConfig
* @param {import('./types').FetchConfig} [fnConfig]
* @returns {Promise<Object>}
*/
async function makeRequest(fnName, url, reqConfig, fnConfig) {
const res = await makeRawRequest(url, reqConfig, fnConfig)
await logRes(fnName, res)
let out = null
try {
out = await res.json()
} catch (_e) {
// nothing
}
return out
}
/**
* Add key to object if not undefined
* @param {Object} data
* @param {String} key
* @param {Object} value
* @param {Function} [validator]
*/
function addParam(data, key, value, validator) {
if (value !== undefined) {
if (validator && !(validator(value))) {
throw new Error(`Value ${value} for key ${key} is not valid.`)
}
data[key] = encodeURIComponent(value)
}
}
/**
* Convert snake case to camel case
* @param {String} str
* @returns {String}
*/
function toCamel(str) {
return str.replace(/([-_][a-z])/ig, $1 => $1.toUpperCase().replace('_', ''))
}
/**
* Convert camel case to snake case
* @param {String} str
* @returns {String}
*/
function toSnake(str) {
return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`)
}
/**
* Return a toURLSearchParams object
* @param {Object} data
* @returns {Promise<import('url').URLSearchParams>}
*/
async function toURLSearchParams(data) {
let URLSearchParamsClass = null
try {
URLSearchParamsClass = window.URLSearchParams
} catch (_e) {
// #if process.env.NODE_COMPILING !== 'true'
// const url = await import('url')
// if (url.URLSearchParams) {
// URLSearchParamsClass = url.URLSearchParams
// } else {
// throw new Error()
// }
// #endif
}
return new URLSearchParamsClass(data)
}
/**
* Set custom function to make request
* @param {Function} fetchFn
*/
function setFetchFunction(fetchFn) {
fetchFunction = fetchFn
}
/**
* @param {String} str
*/
function camelCase(str) {
return str.replace(/_([a-z])/g, (_m, w) => w.toUpperCase())
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
camelCase,
logRes,
makeRawRequest,
makeRequest,
addParam,
toCamel,
toSnake,
toURLSearchParams,
setFetchFunction,
getUserAgent,
});
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
(() => {
/*!**********************!*\
!*** ./src/index.js ***!
\**********************/
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ CrunchyrollError: () => (/* reexport safe */ _error_js__WEBPACK_IMPORTED_MODULE_0__["default"]),
/* harmony export */ Types: () => (/* reexport module object */ _types_js__WEBPACK_IMPORTED_MODULE_16__),
/* harmony export */ api: () => (/* binding */ api),
/* harmony export */ config: () => (/* reexport safe */ _config_js__WEBPACK_IMPORTED_MODULE_3__["default"]),
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
/* harmony export */ localStore: () => (/* reexport safe */ _localStore_js__WEBPACK_IMPORTED_MODULE_2__["default"]),
/* harmony export */ logger: () => (/* reexport safe */ _logger_js__WEBPACK_IMPORTED_MODULE_1__["default"]),
/* harmony export */ utils: () => (/* reexport safe */ _utils_js__WEBPACK_IMPORTED_MODULE_15__["default"])
/* harmony export */ });
/* harmony import */ var _error_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./error.js */ "./src/error.js");
/* harmony import */ var _logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./logger.js */ "./src/logger.js");
/* harmony import */ var _localStore_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./localStore.js */ "./src/localStore.js");
/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./config.js */ "./src/config.js");
/* harmony import */ var _services_account_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./services/account.js */ "./src/services/account.js");
/* harmony import */ var _services_assets_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./services/assets.js */ "./src/services/assets.js");
/* harmony import */ var _services_auth_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./services/auth.js */ "./src/services/auth.js");
/* harmony import */ var _services_content_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./services/content.js */ "./src/services/content.js");
/* harmony import */ var _services_discover_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./services/discover.js */ "./src/services/discover.js");
/* harmony import */ var _services_music_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./services/music.js */ "./src/services/music.js");
/* harmony import */ var _services_cms_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./services/cms.js */ "./src/services/cms.js");
/* harmony import */ var _services_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./services/index.js */ "./src/services/index.js");
/* harmony import */ var _services_review_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./services/review.js */ "./src/services/review.js");
/* harmony import */ var _services_subscription_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./services/subscription.js */ "./src/services/subscription.js");
/* harmony import */ var _services_drm_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./services/drm.js */ "./src/services/drm.js");
/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./utils.js */ "./src/utils.js");
/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./types.js */ "./src/types.js");
const api = {
account: _services_account_js__WEBPACK_IMPORTED_MODULE_4__["default"],
assets: _services_assets_js__WEBPACK_IMPORTED_MODULE_5__["default"],
auth: _services_auth_js__WEBPACK_IMPORTED_MODULE_6__["default"],
cms: _services_cms_js__WEBPACK_IMPORTED_MODULE_10__["default"],
content: _services_content_js__WEBPACK_IMPORTED_MODULE_7__["default"],
discover: _services_discover_js__WEBPACK_IMPORTED_MODULE_8__["default"],
drm: _services_drm_js__WEBPACK_IMPORTED_MODULE_14__["default"],
index: _services_index_js__WEBPACK_IMPORTED_MODULE_11__["default"],
music: _services_music_js__WEBPACK_IMPORTED_MODULE_9__["default"],
review: _services_review_js__WEBPACK_IMPORTED_MODULE_12__["default"],
subscription: _services_subscription_js__WEBPACK_IMPORTED_MODULE_13__["default"],
}
const CrunchyrollAPI = {
logger: _logger_js__WEBPACK_IMPORTED_MODULE_1__["default"],
localStore: _localStore_js__WEBPACK_IMPORTED_MODULE_2__["default"],
CrunchyrollError: _error_js__WEBPACK_IMPORTED_MODULE_0__["default"],
config: _config_js__WEBPACK_IMPORTED_MODULE_3__["default"],
api,
utils: _utils_js__WEBPACK_IMPORTED_MODULE_15__["default"],
}
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (CrunchyrollAPI);
})();
const __webpack_exports__CrunchyrollError = __webpack_exports__.CrunchyrollError;
const __webpack_exports__Types = __webpack_exports__.Types;
const __webpack_exports__api = __webpack_exports__.api;
const __webpack_exports__config = __webpack_exports__.config;
const __webpack_exports__default = __webpack_exports__["default"];
const __webpack_exports__localStore = __webpack_exports__.localStore;
const __webpack_exports__logger = __webpack_exports__.logger;
const __webpack_exports__utils = __webpack_exports__.utils;
export { __webpack_exports__CrunchyrollError as CrunchyrollError, __webpack_exports__Types as Types, __webpack_exports__api as api, __webpack_exports__config as config, __webpack_exports__default as default, __webpack_exports__localStore as localStore, __webpack_exports__logger as logger, __webpack_exports__utils as utils };
//# sourceMappingURL=crunchyroll-js-api.debug.js.map