@@ -128,6 +128,15 @@ func run(overrides config.Overrides, positional []string) error {
128128 if err != nil {
129129 return err
130130 }
131+ resumeState := resume.State {}
132+ if cfg .ResumeSession {
133+ resumeState = resume .Load ()
134+ }
135+ restoredSession := false
136+ if cfg .ResumeSession && len (positional ) == 0 && len (resolved .Tracks ) == 0 && len (resolved .Pending ) == 0 && len (resumeState .Tracks ) > 0 {
137+ resolved .Tracks = append (resolved .Tracks , resumeState .Tracks ... )
138+ restoredSession = true
139+ }
131140
132141 // Determine default provider key.
133142 defaultProvider := cfg .Provider
@@ -136,7 +145,7 @@ func run(overrides config.Overrides, positional []string) error {
136145 }
137146
138147 // No args + radio provider: stream the built-in radio directly.
139- if len (positional ) == 0 && defaultProvider == "radio" {
148+ if len (positional ) == 0 && defaultProvider == "radio" && ! restoredSession {
140149 resolved .Pending = append (resolved .Pending , "https://radio.cliamp.stream/streams.m3u" )
141150 }
142151
@@ -174,6 +183,11 @@ func run(overrides config.Overrides, positional []string) error {
174183
175184 cfg .ApplyPlayer (p )
176185 cfg .ApplyPlaylist (pl )
186+ if restoredSession {
187+ pl .SetShuffle (resumeState .Shuffle )
188+ pl .SetRepeat (repeatModeFromSaved (resumeState .Repeat ))
189+ pl .SetIndex (resumeState .CurrentIndex )
190+ }
177191
178192 themes := theme .LoadAll ()
179193
@@ -200,8 +214,8 @@ func run(overrides config.Overrides, positional []string) error {
200214 }
201215
202216 // PositionSec == 0 is indistinguishable from "never played"; skip resume.
203- if rs := resume . Load (); rs . Path != "" && rs .PositionSec > 0 {
204- m .SetResume (rs .Path , rs .PositionSec )
217+ if cfg . ResumeSession && resumeState . Path != "" && resumeState .PositionSec > 0 {
218+ m .SetResume (resumeState .Path , resumeState .PositionSec )
205219 }
206220
207221 prog := tea .NewProgram (m , tea .WithAltScreen ())
@@ -224,14 +238,37 @@ func run(overrides config.Overrides, positional []string) error {
224238 }
225239 _ = config .Save ("theme" , fmt .Sprintf ("%q" , themeName ))
226240
227- if path , secs := fm .ResumeState (); path != "" && secs > 0 {
228- resume .Save (path , secs )
241+ if cfg .ResumeSession {
242+ path , secs := fm .ResumeState ()
243+ tracks , idx , shuffle , repeat := fm .SessionState ()
244+ if len (tracks ) == 0 {
245+ tracks , idx , shuffle , repeat = fm .CurrentSessionState ()
246+ }
247+ resume .SaveState (resume.State {
248+ Path : path ,
249+ PositionSec : secs ,
250+ Tracks : tracks ,
251+ CurrentIndex : idx ,
252+ Shuffle : shuffle ,
253+ Repeat : repeat .String (),
254+ })
229255 }
230256 }
231257
232258 return nil
233259}
234260
261+ func repeatModeFromSaved (v string ) playlist.RepeatMode {
262+ switch strings .ToLower (v ) {
263+ case "all" :
264+ return playlist .RepeatAll
265+ case "one" :
266+ return playlist .RepeatOne
267+ default :
268+ return playlist .RepeatOff
269+ }
270+ }
271+
235272const helpText = `cliamp — retro terminal music player
236273
237274Usage: cliamp [flags] <file|folder|url> [...]
0 commit comments