cms/app-client/app/components/player-component.js
author Chloe Laisne <chloe.laisne@gmail.com>
Mon, 27 Jun 2016 11:35:10 +0200
changeset 209 35cb7200bb0a
parent 192 e1435b37301a
child 210 08ad36c693b1
permissions -rw-r--r--
Separate playlist and player component with player service as bridge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
     1
import Ember from 'ember';
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
     2
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
     3
export default Ember.Component.extend({
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
     4
    classNames: ['player-component'],
209
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
     5
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
     6
    player: Ember.inject.service(),
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
     7
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
     8
    currentTime: "00:00",
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
     9
    duration: "00:00",
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
    10
209
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
    11
    documentLoaded: Ember.observer('player.item', function() {
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
    12
        var mediaList = this.get('player').get('item').get('mediaList');
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    13
        if ((typeof(mediaList) !== 'undefined') && (mediaList.length > 0)) {
209
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
    14
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    15
            if (this.audio.src){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    16
                this.pause();
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    17
                this.updateProgress(0);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    18
            }
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    19
            var mp3 = mediaList.findBy('format', 'audio/mpeg');
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    20
            this.audio.src = mp3.url;
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    21
            this.audio.load();
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    22
            this.set("currentTime", "00:00");
209
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
    23
            //console.log(mp3.url);
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    24
        }
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    25
    }),
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
    26
209
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
    27
    init: function() {
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
    28
        this._super(...arguments);
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
    29
        this.get('player');
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
    30
    },
35cb7200bb0a Separate playlist and player component with player service as bridge
Chloe Laisne <chloe.laisne@gmail.com>
parents: 192
diff changeset
    31
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    32
    didInsertElement: function() {
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    33
        var _this = this;
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    34
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    35
        this.audio = new Audio();
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
    36
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    37
        this.button = {
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    38
            play: this.$('#action_play'),
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    39
            progress: this.$('.progress')
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    40
        };
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
    41
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    42
        this.$(document).on('touchmove', function(e){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    43
            e.preventDefault();
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    44
        });
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
    45
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    46
        // seeker
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    47
        this.button.progress.on('mousedown', function(e){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    48
            var r = _this.rotation(e.pageX, e.pageY);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    49
            _this.updateProgress(r);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    50
            _this.changeTime(r/360*100);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    51
        });
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
    52
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    53
        this.audio.addEventListener('loadedmetadata',function (){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    54
            var minutes = Math.floor( _this.audio.duration / 60);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    55
            var seconds =  Math.floor(_this.audio.duration) % 60;
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    56
            _this.set('duration', ('0' + minutes).slice(-2)+':'+('0' + seconds).slice(-2));
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    57
        });
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
    58
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    59
        // update bar onchange
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    60
        this.audio.addEventListener('timeupdate',function (){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    61
            var curtime = _this.audio.currentTime,
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    62
            percent = (curtime/_this.audio.duration)*100,
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    63
            deg = 360/100*percent,
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    64
            minutes = Math.floor( curtime / 60),
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    65
            seconds =  Math.floor(curtime) % 60;
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    66
            _this.set('currentTime', ('0' + minutes).slice(-2)+':'+('0' + seconds).slice(-2));
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    67
            _this.updateProgress(deg);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    68
        });
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
    69
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    70
        // when the audio has finished playing
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    71
        this.audio.addEventListener('ended', function(){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    72
            _this.pause();
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    73
            _this.changeTime(0);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    74
            _this.updateProgress(0);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    75
        });
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    76
    },
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    77
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    78
    // change seeked time
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    79
    changeTime: function(percent){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    80
        var t = (this.audio.duration*percent)/100;
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    81
        this.audio.currentTime = t;
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    82
    },
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
    83
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    84
    updateProgress: function(deg){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    85
        var $slice = this.$('.slice');
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    86
        if (deg > 180 && !$slice.is('.gt50')) {
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    87
            $slice.addClass('gt50');
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    88
            $slice.append('<div class="pie fill"></div>');
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    89
        } else if (deg < 180 && $slice.is('.gt50')) {
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    90
            $slice.removeClass('gt50');
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    91
            $slice.find('.fill').remove();
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    92
        }
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    93
        $slice.find('.pie').css({
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    94
            '-moz-transform':'rotate('+deg+'deg)',
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    95
            '-webkit-transform':'rotate('+deg+'deg)',
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    96
            '-o-transform':'rotate('+deg+'deg)',
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    97
            'transform':'rotate('+deg+'deg)'
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    98
        });
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
    99
    },
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
   100
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   101
    rotation: function(x,y){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   102
        var offset = this.button.progress.offset();
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   103
        var button_centerX = (offset.left) + (this.button.progress.width()/2);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   104
        var button_centerY = (offset.top) + (this.button.progress.height()/2);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   105
        var radians = Math.atan2(x - button_centerX, y - button_centerY);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   106
        var degree = Math.round( (radians * (180 / Math.PI) * -1) + 180 );
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   107
        return degree;
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   108
    },
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   109
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   110
    play: function(){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   111
        this.audio.play();
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   112
        this.button.play.addClass('playing');
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   113
        this.button.play.text('Pause');
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   114
    },
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
   115
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   116
    pause: function(){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   117
        this.audio.pause();
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   118
        this.button.play.removeClass('playing');
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   119
        this.button.play.text('Play');
87
24fef043ea0b add control to go next/previous sound
nowmad@nowmads-macbook-pro.local
parents: 86
diff changeset
   120
    },
191
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   121
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   122
    actions: {
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   123
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   124
        tooglePlay: function(){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   125
            if (this.button.play.is('.playing')) {
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   126
                this.pause();
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   127
            } else {
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   128
                this.play();
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   129
            }
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   130
        },
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   131
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   132
        prevNextDocument(change){
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   133
            this.sendAction("action", change);
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   134
        }
db5711fbbb6c Player component linting
Chloe Laisne <chloe.laisne@gmail.com>
parents: 94
diff changeset
   135
86
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
   136
    }
15ded106ef1a add a player component to handle sound play/pause
nowmad@23.1.168.192.in-addr.arpa
parents:
diff changeset
   137
});