vlcraptor 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 18dde28c420aa7dc5fb8c6860d6e8d27d1ccc33bcb58373bc75183fee76f95f8
4
- data.tar.gz: e16ae43b48b13443efc10d48a3abaa78cfc7f787161f4b6865d99f257e4372ce
3
+ metadata.gz: 62d27be7a5541a19d3e2f69cf98ee1506b8b65560deffa547c9e621f860977b9
4
+ data.tar.gz: af56137e7d23b949a5ba94453f9d3bb4e0c45020722b3d0456393b7c7bfed4b5
5
5
  SHA512:
6
- metadata.gz: 1058cbc603c80fbc5b19d105fc590e0a4b0b05baab659cbdb07fe3a03d5c4e409f02a9bebc367e2c76d46bbae88cdf0f8fe534357069d7dcbfd9e69fe554ef42
7
- data.tar.gz: e4a699a72240b67fbf66c92893e8b62641425c0faa39625bb4e7ce7ebfd9460308571d3a36994188adeab450723ca2d2ebf925fe7cc4294b801864a751b7e704
6
+ metadata.gz: 03d0920671d6dfa40dd866c70a915fe7ac6c13a5d84dd0507cdaa6104d0fc2352b2d4b4ab6af10957b7b3ad078f673a2ceda91552134c0b32172186fcafcb75d
7
+ data.tar.gz: 8519f300d25106c8138cf4921c03f2394191f28f853220203b09079d39d9f972cf40331f6e30a2a9f8549028014a9d1542f6c1b841fef9a1f772fffa1d86c910
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vlcraptor (0.3.0)
4
+ vlcraptor (0.4.0)
5
5
  curses
6
6
  rainbow
7
7
  vlc-client
data/README.md CHANGED
@@ -37,11 +37,19 @@ You can quit with 'q', pause with ' ', stop with 's', play (resume) with 'p' and
37
37
  `vlcraptor queue folder_containing_audio_files audio_file.mp3` will place any number of audio files in the
38
38
  queue and the player should immediately start playing the first track.
39
39
 
40
- ### Listing queue contents
40
+ ### Viewing queue contents
41
41
 
42
42
  `vlcraptor list` will list currently queued tracks with an estimated start time if the player is currently
43
43
  running and playing a track.
44
44
 
45
+ ### Managing queue
46
+
47
+ `vlcraptor clear` will clear all queued tracks.
48
+
49
+ `vlcraptor remove 2` will remove queued track at index position 2.
50
+
51
+ `vlcraptor swap 2 4` will swap the tracks at index positions 2 and 4.
52
+
45
53
  ### Media controls
46
54
 
47
55
  `vlcraptor pause` will pause, `vlcraptor stop` will stop and `vlcraptor play` will resume.
data/exe/vlcraptor CHANGED
@@ -11,6 +11,8 @@ command = ARGV.shift
11
11
  case command
12
12
  when "autoplay"
13
13
  Vlcraptor.autoplay(ARGV.shift)
14
+ when "clear"
15
+ Vlcraptor.clear
14
16
  when "crossfade"
15
17
  Vlcraptor.crossfade(ARGV.shift)
16
18
  when "history"
@@ -23,6 +25,8 @@ when "play"
23
25
  Vlcraptor.play
24
26
  when "player"
25
27
  Vlcraptor.player
28
+ when "remove"
29
+ Vlcraptor.remove(ARGV.shift)
26
30
  when "queue"
27
31
  Vlcraptor.queue(ARGV)
28
32
  when "scrobble"
@@ -31,9 +35,12 @@ when "skip"
31
35
  Vlcraptor.skip
32
36
  when "stop"
33
37
  Vlcraptor.stop
38
+ when "swap"
39
+ Vlcraptor.swap(ARGV)
34
40
  else
35
41
  puts "Unknown command \"#{command}\":"
36
42
  puts " autoplay on/off: continue playing tracks or stop at the end of current track"
43
+ puts " clear: clear queue"
37
44
  puts " crossfade on/off: 5 second crossfade when changing tracks"
38
45
  puts " history: display play history"
39
46
  puts " list: list current queue"
@@ -41,7 +48,9 @@ else
41
48
  puts " play: resume after pause/stop"
42
49
  puts " player: start the player"
43
50
  puts " queue paths: queue folders or files containing music tracks"
51
+ puts " remove a: remove track from queue at index position a"
44
52
  puts " scrobble on/off: send track information to last.fm (requires an api key)"
45
53
  puts " skip: skip the current track"
46
54
  puts " stop: stop the player (resume with play)"
55
+ puts " swap a b: swap tracks in queue at index positions a and b"
47
56
  end
@@ -53,6 +53,8 @@ module Vlcraptor
53
53
  end
54
54
 
55
55
  def track_finished(track)
56
+ @preferences[:started] = nil
57
+
56
58
  return unless track
57
59
 
58
60
  scrobbler&.scrobble(track[:artist], track[:title], timestamp: track[:start_time].to_i)
@@ -20,7 +20,7 @@ module Vlcraptor
20
20
  return on_pause if @preferences.pause?
21
21
  return on_stop if @preferences.stop?
22
22
  return on_play if @preferences.play?
23
- return when_suspended if @suspended
23
+ return on_suspended if @suspended
24
24
  return when_playing if @player.playing?
25
25
  return when_auto if @preferences.continue?
26
26
 
@@ -28,41 +28,45 @@ module Vlcraptor
28
28
  end
29
29
 
30
30
  def cleanup
31
+ @notifiers.track_suspended
32
+ @player.fadeout
31
33
  @player.cleanup
32
34
  end
33
35
 
34
36
  private
35
37
 
36
38
  def on_pause
37
- @player.fadeout
38
- @player.pause
39
- @suspended = true
40
- @status = "Now Paused"
41
- @notifiers.track_suspended
42
- when_suspended
39
+ when_suspended("Now Paused", :pause)
43
40
  end
44
41
 
45
42
  def on_stop
46
- @player.fadeout
47
- @player.stop
43
+ when_suspended("Now Stopped", :stop)
44
+ end
45
+
46
+ def when_suspended(status, method)
47
+ if @player.playing?
48
+ @player.fadeout
49
+ @player.send(method)
50
+ end
51
+ @status = status
48
52
  @suspended = true
49
- @status = "Now Stopped"
50
53
  @notifiers.track_suspended
51
- when_suspended
54
+ on_suspended
55
+ end
56
+
57
+ def on_suspended
58
+ build
52
59
  end
53
60
 
54
61
  def on_play
55
- @player.fadein
62
+ unless @player.playing?
63
+ @player.fadein
64
+ end
56
65
  @suspended = false
57
- @status = ""
58
66
  @notifiers.track_resumed(@track, @player.time)
59
67
  when_playing_track(@player.remaining)
60
68
  end
61
69
 
62
- def when_suspended
63
- build
64
- end
65
-
66
70
  def when_playing
67
71
  return on_skip if @preferences.skip?
68
72
  return on_crossfade if @preferences.crossfade? && @player.remaining < 5
@@ -72,6 +76,7 @@ module Vlcraptor
72
76
 
73
77
  def on_skip
74
78
  @track = @queue.next
79
+ @notifiers.track_suspended
75
80
  if @track
76
81
  @notifiers.track_started(@track)
77
82
  @player.crossfade(@track[:path])
@@ -18,6 +18,10 @@ module Vlcraptor
18
18
  File.exist?(result[:path]) ? result : self.next
19
19
  end
20
20
 
21
+ def self.clear
22
+ `rm -rf /tmp/queue`
23
+ end
24
+
21
25
  def self.length
22
26
  Dir["/tmp/queue/*.yml"].length
23
27
  end
@@ -28,6 +32,31 @@ module Vlcraptor
28
32
  end
29
33
  end
30
34
 
35
+ def self.remove(index)
36
+ path = Dir["/tmp/queue/*.yml"].sort[index.to_i]
37
+ if path
38
+ `rm #{path}`
39
+ yield
40
+ else
41
+ puts "Could not find track at position #{index}"
42
+ end
43
+ end
44
+
45
+ def self.swap(a, b)
46
+ all = Dir["/tmp/queue/*.yml"].sort
47
+ path_a = all[a.to_i]
48
+ path_b = all[b.to_i]
49
+
50
+ if path_a && path_b
51
+ `mv #{path_a} #{path_a}.tmp`
52
+ `mv #{path_b} #{path_a}`
53
+ `mv #{path_a}.tmp #{path_b}`
54
+ yield
55
+ else
56
+ puts "Could not find tracks at positions #{a} and #{b}"
57
+ end
58
+ end
59
+
31
60
  def self.add(path)
32
61
  unless %w[.mp3 .m4a].include?(File.extname(path))
33
62
  puts "skipping #{path}"
@@ -16,24 +16,26 @@ module Vlcraptor
16
16
 
17
17
  def self.ask(prompt)
18
18
  puts prompt
19
- gets.chomp
19
+ gets.chomp.strip
20
+ end
21
+
22
+ def self.blank(attribute)
23
+ (attribute || "").length.zero?
20
24
  end
21
25
 
22
26
  def self.load
23
- conf = Vlcraptor::Settings.new("~/lastfm.yaml")
27
+ conf = Vlcraptor::Settings.new("~/.lastfm.yml")
24
28
 
25
- unless conf["api_key"] && conf["secret"]
26
- puts "You will need an api key and secret for last fm integration"
27
- conf["api_key"] = ask("What is the api key? ")
28
- conf["secret"] = ask("What is the secret ")
29
- end
29
+ conf[:api_key] = ask("What is the api key? ") if blank(conf[:api_key])
30
+ conf[:secret] = ask("What is the secret? ") if blank(conf[:secret])
31
+ conf[:user] = ask("What is your lastfm username? ") if blank(conf[:user])
30
32
 
31
- conf["user"] = ask("What is your lastfm username? ") unless conf["user"]
33
+ return nil if blank(conf[:api_key]) || blank(conf[:secret]) || blank(conf[:user])
32
34
 
33
- scrobbler = Vlcraptor::Scrobbler.new(conf["api_key"], conf["secret"], conf["user"], conf["session"])
35
+ scrobbler = Vlcraptor::Scrobbler.new(conf[:api_key], conf[:secret], conf[:user], conf[:session])
34
36
 
35
- unless conf["session"]
36
- conf["session"] = scrobbler.fetch_session_key do |url|
37
+ unless conf[:session]
38
+ conf[:session] = scrobbler.fetch_session_key do |url|
37
39
  puts "A browser will now launch to allow to authorise this application to access your lastfm account"
38
40
  `open '#{url}'`
39
41
  puts "Press enter when you have authorised the application"
@@ -41,6 +43,8 @@ module Vlcraptor
41
43
  end
42
44
  end
43
45
 
46
+ return nil if blank(conf[:session])
47
+
44
48
  scrobbler
45
49
  end
46
50
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vlcraptor
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/vlcraptor.rb CHANGED
@@ -7,12 +7,17 @@ require_relative "vlcraptor/player_controller"
7
7
  require_relative "vlcraptor/preferences"
8
8
  require_relative "vlcraptor/queue"
9
9
  require_relative "vlcraptor/notifiers"
10
+ require_relative "vlcraptor/scrobbler"
10
11
 
11
12
  module Vlcraptor
12
13
  def self.autoplay(value)
13
14
  Vlcraptor::Preferences.new[:autoplay] = value == "on"
14
15
  end
15
16
 
17
+ def self.clear
18
+ Vlcraptor::Queue.clear
19
+ end
20
+
16
21
  def self.crossfade(value)
17
22
  Vlcraptor::Preferences.new[:crossfade] = value == "on"
18
23
  end
@@ -24,8 +29,9 @@ module Vlcraptor
24
29
  def self.list
25
30
  started = Vlcraptor::Preferences.new[:started]
26
31
  offset = 0
32
+ index = 0
27
33
  Vlcraptor::Queue.each do |track|
28
- array = []
34
+ array = [Rainbow(index.to_s).magenta]
29
35
  array << Time.at(started + offset).strftime("%I:%M:%S") if started
30
36
  array += [Rainbow(track[:title]).green, "by", Rainbow(track[:artist]).yellow]
31
37
  array += ["from", Rainbow(track[:album]).cyan] if (track[:album] || "").length.positive?
@@ -36,6 +42,7 @@ module Vlcraptor
36
42
  end
37
43
  puts array.join(" ")
38
44
  offset += track[:length]
45
+ index += 1
39
46
  end
40
47
  end
41
48
 
@@ -96,6 +103,10 @@ module Vlcraptor
96
103
  Curses.close_screen
97
104
  end
98
105
 
106
+ def self.remove(index)
107
+ Vlcraptor::Queue.remove(index) { list }
108
+ end
109
+
99
110
  def self.queue(paths)
100
111
  paths.each do |path|
101
112
  if File.file?(path)
@@ -109,7 +120,10 @@ module Vlcraptor
109
120
  end
110
121
 
111
122
  def self.scrobble(value)
112
- Vlcraptor::Preferences.new[:scrobble] = value == "on"
123
+ preferences = Vlcraptor::Preferences.new
124
+ preferences[:scrobble] = value == "on"
125
+ scrobbler = Vlcraptor::Scrobbler.load if preferences.scrobble?
126
+ preferences[:scrobble] = false unless scrobbler
113
127
  end
114
128
 
115
129
  def self.skip
@@ -119,4 +133,9 @@ module Vlcraptor
119
133
  def self.stop
120
134
  Vlcraptor::Preferences.new[:stop] = true
121
135
  end
136
+
137
+ def self.swap(args)
138
+ a, b = *args
139
+ Vlcraptor::Queue.swap(a, b) { list }
140
+ end
122
141
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vlcraptor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Ryall