%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /www/varak.cloud/jamstash.varak.cloud/app/player/
Upload File :
Create Path :
Current File : /www/varak.cloud/jamstash.varak.cloud/app/player/player-service.js

/**
* jamstash.player.service Module
*
* Manages the player and playing queue. Use it to play a song, go to next track or add songs to the queue.
*/
angular.module('jamstash.player.service', ['ngLodash'])

.factory('player', ['lodash', function (_) {
    'use strict';

    var playerVolume = 1.0;

    var player = {
        // playingIndex and playingSong aren't meant to be used, they only are public for unit-testing purposes
        _playingIndex: -1,
        _playingSong: undefined,
        queue: [],
        pauseSong: false,
        restartSong: false,
        loadSong: false,
        settings: {
            repeat: "none",
            repeatValues: ["queue", "song", "none"]
        },

        play: function (song) {
            // Find the song's index in the queue, if it's in there
            var index = player.indexOfSong(song);
            player._playingIndex = (index !== undefined) ? index : -1;
            if (player._playingSong === song) {
                // We call restart because the _playingSong hasn't changed and the directive won't
                // play the song again
                player.restart();
            } else {
                player._playingSong = song;
            }
        },

        togglePause: function () {
            if (player.pauseSong) {
                player.pauseSong = false;
            } else {
                player.pauseSong = true;
            }
        },

        playFirstSong: function () {
            player._playingIndex = 0;
            player.play(player.queue[0]);
        },

        load: function (song) {
            player.loadSong = true;
            player.play(song);
        },

        restart: function () {
            player.restartSong = true;
        },

        // Called from the player directive at the end of the current song
        songEnded: function () {
            if (player.settings.repeat === "song") {
                // repeat current track
                player.restart();
            } else if (player.isLastSongPlaying() === true) {
                if (player.settings.repeat === "queue") {
                    // Loop to first track in queue
                    player.playFirstSong();
                }
            } else {
                player.nextTrack();
            }
        },

        nextTrack: function () {
            // Find the song's index in the queue, in case it changed (with a drag & drop)
            var index = player.indexOfSong(player._playingSong);
            player._playingIndex = (index !== undefined) ? index : -1;

            if ((player._playingIndex + 1) < player.queue.length) {
                var nextTrack = player.queue[player._playingIndex + 1];
                player._playingIndex++;
                player.play(nextTrack);
            }
        },

        previousTrack: function () {
            // Find the song's index in the queue, in case it changed (with a drag & drop)
            var index = player.indexOfSong(player._playingSong);
            player._playingIndex = (index !== undefined) ? index : -1;

            if ((player._playingIndex - 1) > 0) {
                var previousTrack = player.queue[player._playingIndex - 1];
                player._playingIndex--;
                player.play(previousTrack);
            } else if (player.queue.length > 0) {
                player.playFirstSong();
            }
        },

        emptyQueue: function () {
            player.queue = [];
            return player;
        },

        shuffleQueue: function () {
            var shuffled = _.without(player.queue, player._playingSong);
            shuffled = _.shuffle(shuffled);
            if (player._playingSong !== undefined) {
                shuffled.unshift(player._playingSong);
                player._playingIndex = 0;
            }
            player.queue = shuffled;
            return player;
        },

        addSong: function (song) {
            player.queue.push(song);
            return player;
        },

        addSongs: function (songs) {
            player.queue = player.queue.concat(songs);
            return player;
        },

        removeSong: function (song) {
            var index = player.queue.indexOf(song);
            player.queue.splice(index, 1);
            return player;
        },

        removeSongs: function (songs) {
            player.queue = _.difference(player.queue, songs);
            return player;
        },

        reorderQueue: function (oldIndex, newIndex) {
            if (oldIndex < 0 || oldIndex >= player.queue.length || newIndex < 0 || newIndex >= player.queue.length) {
                return player;
            }
            var song = player.queue[oldIndex];
            player.queue.splice(oldIndex, 1);
            player.queue.splice(newIndex, 0, song);
            return player;
        },

        getPlayingSong: function () {
            return player._playingSong;
        },

        isLastSongPlaying: function () {
            return ((player._playingIndex + 1) === player.queue.length);
        },

        indexOfSong: function (song) {
            for (var i = player.queue.length - 1; i >= 0; i--) {
                if (angular.equals(song, player.queue[i])) {
                    return i;
                }
            }
            return undefined;
        },

        turnVolumeUp: function () {
            var volume = playerVolume;
            if ((volume + 0.1) > 1 || volume < 0) {
                volume = 0.9;
            }
            volume += 0.1;
            playerVolume = Math.round(volume * 100) / 100;
            return volume;
        },

        turnVolumeDown: function () {
            var volume = playerVolume;
            if (volume > 1 || (volume - 0.1) < 0) {
                volume = 0.1;
            }
            volume -= 0.1;
            playerVolume = Math.round(volume * 100) / 100;
            return volume;
        },

        getVolume: function () {
            return playerVolume;
        },

        setVolume: function (volume) {
            if (volume > 1) {
                volume = 1;
            } else if (volume < 0) {
                volume = 0;
            }
            playerVolume = Math.round(volume * 100) / 100;
            return player;
        }
    };

    return player;
}]);

Zerion Mini Shell 1.0