mikeplayer 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b38d5b7fef4b5141b1f884d386ca6d8cbc17b4890aacaac2a649b06aefd84674
4
- data.tar.gz: 1f38509a5e275b35d9adbb83c4cf09b23c739f999afe71c7d8ffc16ffbd865d6
3
+ metadata.gz: b1834e8d8cb1fad633b10c27790ba3bf4fb39c55f78cd3eabd772f6bfda7e1f1
4
+ data.tar.gz: 33684c8449ff729057767d320bbb562fac4f1e849f6c201374267ae4c5c817a5
5
5
  SHA512:
6
- metadata.gz: 0216f0b2f19389ce060bd48fb1ce7bbfbd13a8e9ff3ae461c16830b745c5eaa463e9f4f1c6706e2085338cc44848d11b855e32e0454a98e5f8cdd96ec916939c
7
- data.tar.gz: a72f9a0446bcc94e87229812029b7de95bfb1d881450d665fce45e8161c0aa9ee83c762bf42d392e08491e68f10c03244819efa8e94499725d767c7be6f02338
6
+ metadata.gz: 9d3d763eb65a94c25d05cc23ffa711a3dc25c178f0fb91d5f8eba471797296281fe71ab9f58ea80d2b68f41c0b82209d8e218cb82e71589c4f0c05d44af6e55b
7
+ data.tar.gz: 4b985da8d1283c6803d26a311510a811dfb707f39ae4ccf60a54ca73edf2b29f0b36f4da4f2f1e18dd84c142c125fdd7affac49a1befb175264d9b84fd232280
@@ -2,6 +2,13 @@ module MikePlayer
2
2
  class Display
3
3
  PAUSE_INDICATOR = '||'.freeze
4
4
  INDICATOR_SIZE = 4
5
+ PROGRESS_WIDTH = 40
6
+
7
+ TITLE_ROW = 4
8
+ BAR_ROW = 5
9
+ HINT_ROW = 7
10
+
11
+ HINT_TEXT = 'c: pause/play v: next z: previous t: set timer q: quit'.freeze
5
12
 
6
13
  RESET = "\e[0m".freeze
7
14
  TITLE_COLOR = "\e[1;36m".freeze # bold cyan
@@ -12,8 +19,14 @@ module MikePlayer
12
19
  PLAY_COLOR = "\e[32m".freeze # green
13
20
  PAUSE_COLOR = "\e[1;31m".freeze # bold red
14
21
 
15
- ENTER_ALT_SCREEN = "\e[?1049h\e[2J\e[H".freeze
16
- EXIT_ALT_SCREEN = "\e[?1049l".freeze
22
+ ENTER_ALT_SCREEN = "\e[?1049h\e[2J\e[H\e[?25l".freeze
23
+ EXIT_ALT_SCREEN = "\e[?25h\e[?1049l".freeze
24
+
25
+ PUSH_TITLE = "\e[22;0t".freeze
26
+ POP_TITLE = "\e[23;0t".freeze
27
+
28
+ PLAY_GLYPH = '▶'.freeze
29
+ PAUSE_GLYPH = '⏸'.freeze
17
30
 
18
31
  def self.colorize(text, color)
19
32
  return text unless $stdout.tty?
@@ -31,23 +44,54 @@ module MikePlayer
31
44
  $stdout.flush
32
45
  end
33
46
 
34
- def initialize
35
- @width = 0
36
- @indicator = ''
37
- @paused = false
38
- @changed = false
39
- @color = $stdout.tty?
47
+ def self.set_title(text)
48
+ return unless $stdout.tty?
49
+
50
+ print("\e]0;#{text}\a")
51
+ $stdout.flush
52
+ end
53
+
54
+ def self.push_title
55
+ return unless $stdout.tty?
56
+
57
+ print(PUSH_TITLE)
58
+ $stdout.flush
59
+ end
60
+
61
+ def self.pop_title
62
+ return unless $stdout.tty?
63
+
64
+ print(POP_TITLE)
65
+ $stdout.flush
66
+ end
67
+
68
+ def initialize(fullscreen: false)
69
+ @width = 0
70
+ @indicator = ''
71
+ @paused = false
72
+ @changed = false
73
+ @color = $stdout.tty?
74
+ @fullscreen = fullscreen
75
+ @elapsed_seconds = 0
76
+ @length = 0
77
+ @last_title = nil
40
78
  end
41
79
 
42
80
  def song_info=(v)
43
81
  @position = v[:position].freeze
44
82
  @title = v[:title].freeze
83
+ @length = v[:length].to_f
84
+
85
+ update_terminal_title
45
86
  end
46
87
 
47
88
  def elapsed=(v)
89
+ @elapsed_seconds = v
48
90
  @indicator = "#{'>' * (v % INDICATOR_SIZE)}".ljust(INDICATOR_SIZE)
49
91
  @paused = false
50
92
  @changed = true
93
+
94
+ update_terminal_title
51
95
  end
52
96
 
53
97
  def paused
@@ -55,12 +99,28 @@ module MikePlayer
55
99
  @indicator = PAUSE_INDICATOR.ljust(INDICATOR_SIZE)
56
100
  @paused = true
57
101
  @changed = true
102
+
103
+ update_terminal_title
58
104
  end
59
105
  end
60
106
 
61
107
  def display!(elapsed_info, countdown = nil)
62
108
  return unless changed?
63
109
 
110
+ if @fullscreen
111
+ display_panel!(elapsed_info, countdown)
112
+ else
113
+ display_line!(elapsed_info, countdown)
114
+ end
115
+ end
116
+
117
+ def changed?
118
+ true == @changed
119
+ end
120
+
121
+ private
122
+
123
+ def display_line!(elapsed_info, countdown)
64
124
  mindicator = "(#{countdown}↓) " if countdown
65
125
 
66
126
  position = colorize(@position, DIM_COLOR)
@@ -82,11 +142,49 @@ module MikePlayer
82
142
  $stdout.flush
83
143
  end
84
144
 
85
- def changed?
86
- true == @changed
145
+ def display_panel!(elapsed_info, countdown)
146
+ mindicator = "(#{countdown}↓) " if countdown
147
+ count = countdown ? colorize(mindicator, COUNTDOWN_COLOR) : ''
148
+ state = colorize(@paused ? 'PAUSED' : 'PLAYING', @paused ? PAUSE_COLOR : PLAY_COLOR)
149
+
150
+ move_to(TITLE_ROW)
151
+ print("Playing #{colorize(@position, DIM_COLOR)}: #{colorize(@title, TITLE_COLOR)}")
152
+
153
+ move_to(BAR_ROW)
154
+ print("#{progress_bar} #{colorize(elapsed_info, ELAPSED_COLOR)} #{count}#{state}")
155
+
156
+ move_to(HINT_ROW)
157
+ print(colorize(HINT_TEXT, DIM_COLOR))
158
+
159
+ @changed = false
160
+
161
+ $stdout.flush
87
162
  end
88
163
 
89
- private
164
+ def update_terminal_title
165
+ return if @title.nil?
166
+
167
+ glyph = @paused ? PAUSE_GLYPH : PLAY_GLYPH
168
+ title = "#{glyph} #{@title} #{@position}"
169
+
170
+ return if title == @last_title
171
+
172
+ @last_title = title
173
+
174
+ Display.set_title(title)
175
+ end
176
+
177
+ def move_to(row)
178
+ print("\e[#{row};1H\e[2K")
179
+ end
180
+
181
+ def progress_bar
182
+ pct = @length.positive? ? (@elapsed_seconds.to_f / @length).clamp(0, 1) : 0
183
+ filled = (pct * PROGRESS_WIDTH).round
184
+ bar = "[#{'#' * filled}#{'-' * (PROGRESS_WIDTH - filled)}]"
185
+
186
+ colorize(bar, @paused ? PAUSE_COLOR : PLAY_COLOR)
187
+ end
90
188
 
91
189
  def colorize(text, color)
92
190
  return text unless @color
@@ -16,6 +16,7 @@ module MikePlayer
16
16
 
17
17
  if paused?
18
18
  start_position = @elapsed
19
+ @paused = false
19
20
  else
20
21
  @elapsed = 0
21
22
  end
@@ -69,8 +69,9 @@ module MikePlayer
69
69
 
70
70
  def song_info(i)
71
71
  song_i_str = "#{i + 1}".rjust(self.size.to_s.size)
72
+ song = get(i)
72
73
 
73
- return { position: "(#{song_i_str}/#{self.size})", title: get(i).info }
74
+ return { position: "(#{song_i_str}/#{self.size})", title: song.info, length: song.length }
74
75
  end
75
76
 
76
77
  def size
@@ -1,3 +1,3 @@
1
1
  module MikePlayer
2
- VERSION = '1.2.0'.freeze
2
+ VERSION = '1.4.0'.freeze
3
3
  end
data/lib/mikeplayer.rb CHANGED
@@ -49,6 +49,9 @@ module MikePlayer
49
49
  def play
50
50
  @playlist.shuffle! if @settings.shuffle?
51
51
 
52
+ Display.push_title
53
+ at_exit { Display.pop_title }
54
+
52
55
  if @settings.fullscreen?
53
56
  Display.enter_fullscreen
54
57
  at_exit { Display.exit_fullscreen }
@@ -64,7 +67,7 @@ module MikePlayer
64
67
  end
65
68
 
66
69
  @thread = Thread.new do
67
- @display = Display.new
70
+ @display = Display.new(fullscreen: @settings.fullscreen?)
68
71
  @song_i = 0
69
72
 
70
73
  while (@song_i < @playlist.size)
@@ -84,14 +87,14 @@ module MikePlayer
84
87
  sleep(sleep_time)
85
88
  end
86
89
 
87
- if playing? && @player.stopped?
88
- next_song
89
- elsif paused?
90
+ if @player.paused?
90
91
  @display.display!(song.length_str(@player.elapsed), minutes_remaining)
91
92
 
92
93
  while paused?
93
94
  sleep(sleep_time)
94
95
  end
96
+ elsif playing?
97
+ next_song
95
98
  end
96
99
  end
97
100
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mikeplayer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Crockett