function setPosition(newPosition){ var durationTemplate = '00:00:00'.split(''); // replace template characters starting from the last position // with the user given duration in reverse order newPosition.toString().split('').reverse().forEach((character, index) => { durationTemplate[durationTemplate.length - (index + 1)] = character; }); var newPositionDuration = moment.duration(durationTemplate.join('')).asSeconds(); return execute('tell application "Spotify" to set player position to newPositionDuration', {newPositionDuration}); }
/** * Check token validity. Token validity window is set to 240 seconds * @param service tokenObject */ let isTokenValid = function (service) { let tokenAge = moment.duration(moment(new Date()).diff(service.lastUpdated)).asSeconds() + TOKEN_INVALIDITY_WINDOW return (tokenAge < service.timeout) }
const expiresIn = expiresAt => Math.round(moment.duration( moment(expiresAt).diff(moment()) ).asSeconds())
function status(){ return Promise.props({ status: execute('tell application "Spotify" to player state as string'), artist: execute('tell application "Spotify" to artist of current track as string'), album: execute('tell application "Spotify" to album of current track as string'), track: execute('tell application "Spotify" to name of current track as string'), durationSecs: execute('tell application "Spotify" to duration of current track').then((durationMs) => { return moment.duration(durationMs, 'milliseconds').asSeconds(); }), duration: execute('tell application "Spotify" to duration of current track').then((durationMs) => { return moment.duration(durationMs, 'milliseconds').format(); }), positionSecs: execute('tell application "Spotify" to player position'), position: getPosition() }); }
_adaptSchedules (schedules, added_or_removed) { let validation_passed = true; const adapted_schedules = schedules.map((schedule) => { const time = moment.utc(schedule.time); if (utils.isEmpty(schedule.time) || utils.isEmpty(schedule.level) || !time.isValid()) { validation_passed = false; return; } return { seconds_into_day: moment.duration(time.diff(time.clone().startOf('day'))).asSeconds(), level: this._adaptPercentageToDevice(schedule.level, LEVEL_SCALE), on: true, should_add: added_or_removed === 'added', should_delete: added_or_removed === 'removed' }; }); return validation_passed && adapted_schedules; }
async function checkExchanges () { await fetchBalances(); while (isRunning) { let timeout = TIMEOUT; try { const duration = await durationWrapper(arbitrage); timeout = TIMEOUT - duration.asMilliseconds(); if (timeout < 0) { logger.warn(`Duration: ${duration.asSeconds()} second(s).`); } } catch (e) { TrailingManager.resetAll(); logger.error(ENV === "development" ? e : e.message); } finally { await sleep(timeout); } } }
_adaptSchedules (schedules, added_or_removed) { let validation_passed = true; const adapted_schedules = schedules.map((schedule) => { const time = moment.utc(schedule.time); if (utils.isEmpty(schedule.time) || utils.isEmpty(schedule.level) || !time.isValid()) { validation_passed = false; return; } return { seconds_into_day: moment.duration(time.diff(time.clone().startOf('day'))).asSeconds(), level: this._adaptPercentageToDevice(schedule.level, LEVEL_SCALE), on: true, should_add: added_or_removed === 'added', should_delete: added_or_removed === 'removed' }; }); return validation_passed && adapted_schedules; }
_adaptSchedules (schedules, added_or_removed) { let validation_passed = true; const adapted_schedules = schedules.map((schedule) => { const time = moment.utc(schedule.time); if (utils.isEmpty(schedule.time) || utils.isEmpty(schedule.level) || !time.isValid()) { validation_passed = false; return; } return { seconds_into_day: moment.duration(time.diff(time.clone().startOf('day'))).asSeconds(), level: this._adaptPercentageToDevice(schedule.level, LEVEL_SCALE), on: true, should_add: added_or_removed === 'added', should_delete: added_or_removed === 'removed' }; }); return validation_passed && adapted_schedules; }