import MyFile from './myFile'; import skinParser from './skinParser'; import {BANDS} from './constants'; import {clamp} from './utils'; import { CLOSE_WINAMP, LOAD_AUDIO_FILE, LOAD_AUDIO_URL, OPEN_FILE_DIALOG, SET_BALANCE, SET_BAND_VALUE, SET_SKIN_DATA, SET_VOLUME, START_LOADING, STOP, TOGGLE_REPEAT, TOGGLE_SHUFFLE } from './actionTypes'; export function play() { return (dispatch, getState) => { const {status} = getState().media; dispatch({type: (status === 'PLAYING') ? 'STOP' : 'PLAY'}); }; } export function pause() { return (dispatch, getState) => { const {status} = getState().media; dispatch({type: (status === 'PLAYING') ? 'PAUSE' : 'PLAY'}); }; } export function stop() { return {type: STOP}; } export function close() { return (dispatch) => { dispatch({type: STOP}); dispatch({type: CLOSE_WINAMP}); }; } export function setVolume(volume) { return { type: SET_VOLUME, volume: clamp(volume, 0, 100) }; } export function adjustVolume(volumeDiff) { return (dispatch, getState) => { const currentVolume = getState().media.volume; return dispatch(setVolume(currentVolume + volumeDiff)); }; } export function setBalance(balance) { balance = clamp(balance, -100, 100); // The balance clips to the center if (Math.abs(balance) < 25) { balance = 0; } return { type: SET_BALANCE, balance }; } export function toggleRepeat() { return {type: TOGGLE_REPEAT}; } export function toggleShuffle() { return {type: TOGGLE_SHUFFLE}; } const SKIN_FILENAME_MATCHER = new RegExp('(wsz|zip)$', 'i'); export function loadFileFromReference(fileReference) { return (dispatch) => { const file = new MyFile(); file.setFileReference(fileReference); if (SKIN_FILENAME_MATCHER.test(fileReference.name)) { dispatch(setSkinFromFile(file)); } else { dispatch({type: LOAD_AUDIO_FILE, file}); } }; } export function loadMediaFromUrl(url, name) { return (dispatch) => { dispatch({type: LOAD_AUDIO_URL, url, name}); }; } export function setSkinFromFile(skinFile) { return (dispatch) => { dispatch({type: START_LOADING}); skinParser(skinFile).then((skinData) => dispatch({ type: SET_SKIN_DATA, skinImages: skinData.images, skinColors: skinData.colors, skinPlaylistStyle: skinData.playlistStyle })); }; } export function setSkinFromUrl(url) { const skinFile = new MyFile(); skinFile.setUrl(url); return setSkinFromFile(skinFile); } export function setSkinFromFilename(filename) { const url = `https://cdn.rawgit.com/captbaritone/winamp-skins/master/v2/${filename}`; return setSkinFromUrl(url); } export function openFileDialog(fileInput) { fileInput.click(); // No reducers currently respond to this. return {type: OPEN_FILE_DIALOG}; } export function setEqBand(band, value) { return { type: SET_BAND_VALUE, band, value }; } function _setEqTo(value) { return (dispatch) => { Object.keys(BANDS).forEach((key) => { const band = BANDS[key]; dispatch({ type: SET_BAND_VALUE, value, band }); }); }; } export function setEqToMax() { return _setEqTo(100); } export function setEqToMid() { return _setEqTo(50); } export function setEqToMin() { return _setEqTo(0); } export function setPreamp(value) { return { type: SET_BAND_VALUE, band: 'preamp', value }; }