« get me outta code hell

mtui - Music Text User Interface - user-friendly command line music player
about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--backend.js14
-rw-r--r--players.js4
-rw-r--r--ui.js7
3 files changed, 24 insertions, 1 deletions
diff --git a/backend.js b/backend.js
index 35362b3..23a9309 100644
--- a/backend.js
+++ b/backend.js
@@ -37,6 +37,8 @@ class Backend extends EventEmitter {
     this.throttleMetadata = throttlePromise(10)
     this.metadataDictionary = {}
     this.queueGrouplike = {name: 'Queue', isTheQueue: true, items: []}
+    this.pauseNextTrack = false
+    this.playedTrackToEnd = false
 
     this.rootDirectory = process.env.HOME + '/.mtui'
     this.metadataPath = this.rootDirectory + '/track-metadata.json'
@@ -378,6 +380,10 @@ class Backend extends EventEmitter {
     this.player.setVolume(value)
   }
 
+  setPauseNextTrack(value) {
+    this.pauseNextTrack = !!value
+  }
+
   async stopPlaying() {
     // We emit this so playTrack doesn't immediately start a new track.
     // We aren't *actually* about to play a new track.
@@ -431,6 +437,13 @@ class Backend extends EventEmitter {
       this.emit('playing', this.playingTrack, oldTrack)
 
       await this.player.kill()
+      if (this.playedTrackToEnd) {
+        this.player.setPause(this.pauseNextTrack)
+        this.pauseNextTrack = false
+        this.playedTrackToEnd = false
+      } else {
+        this.player.setPause(false)
+      }
       await this.player.playFile(downloadFile)
     }
 
@@ -438,6 +451,7 @@ class Backend extends EventEmitter {
     // (true), or was stopped by a different track being started (false).
 
     if (playingThisTrack) {
+      this.playedTrackToEnd = true
       if (!this.playNext(item)) {
         this.clearPlayingTrack()
       }
diff --git a/players.js b/players.js
index 0c296b3..a61e545 100644
--- a/players.js
+++ b/players.js
@@ -63,6 +63,9 @@ module.exports.MPVPlayer = class extends Player {
     if (this.isLooping) {
       opts.unshift('--loop')
     }
+    if (this.isPaused) {
+      opts.unshift('--pause')
+    }
     opts.unshift('--volume', this.volume)
     return opts
   }
@@ -71,7 +74,6 @@ module.exports.MPVPlayer = class extends Player {
     // The more powerful MPV player. MPV is virtually impossible for a human
     // being to install; if you're having trouble with it, try the SoX player.
 
-    this.isPaused = false
     this.process = spawn('mpv', this.getMPVOptions(file))
 
     let lastPercent = 0
diff --git a/ui.js b/ui.js
index e73d8f5..25cc0e1 100644
--- a/ui.js
+++ b/ui.js
@@ -280,6 +280,7 @@ class AppElement extends FocusElement {
           {divider: true},
           playingTrack && {element: this.playingControl},
           {element: this.loopingControl},
+          {element: this.pauseNextControl},
           {element: this.volumeSlider},
           {divider: true},
           previous && {label: `Previous (${previous.name})`, action: () => this.backend.playPrevious(playingTrack)},
@@ -312,6 +313,12 @@ class AppElement extends FocusElement {
       getEnabled: () => this.config.canControlPlayback
     })
 
+    this.pauseNextControl = new ToggleControl('Pause when this track ends?', {
+      setValue: val => this.backend.setPauseNextTrack(val),
+      getValue: () => this.backend.pauseNextTrack,
+      getEnabled: () => this.config.canControlPlayback
+    })
+
     this.volumeSlider = new SliderElement('Volume', {
       setValue: val => this.backend.setVolume(val),
       getValue: () => this.backend.player.volume,