dxmms2 1.0.0 → 1.2.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.
Files changed (5) hide show
  1. checksums.yaml +5 -5
  2. data/Makefile +1 -1
  3. data/bin/dxmms2 +108 -50
  4. data/dxmms2.gemspec +5 -5
  5. metadata +26 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c0558d7e7c3d2afdfce8c3cda5a5d462b19fb1e2
4
- data.tar.gz: 717ae54b84456c746f9486f3c5703776250c7ae1
2
+ SHA256:
3
+ metadata.gz: 9e61c4e0f10fc0beb482c379d0f1372dbc67b64c9228ffb71644c2d86fd22cb9
4
+ data.tar.gz: 1cc2a18957934ac95e0d1d07abaa27b589c2aa8c3de450176f0c5b3dec8fb7e9
5
5
  SHA512:
6
- metadata.gz: abe3d53027584aa876d6114c529e1820fa91d92e8499afed04cb143167f030ce8c94f1ea60a5cf550375a517d6a8419e0b45fe4bf0fc1896dce0c2e00797bef4
7
- data.tar.gz: 54e52c04408e46a6da49a815ee1d819d53f4091759d418154dea49efb61725d3e75e0b2b7fb288a2a6fe30ce20782c81db33771b4da3f4c49ab7154289172638
6
+ metadata.gz: 4fdfc9ff13a2d073f1a3069d0a19e43bd92d4f31c0b5823f1af5daa0140407901003f79095a8c03b7f182845fdace37cf7204ec12d71aa8d8801c13cefc0310c
7
+ data.tar.gz: 8dc76fbe4a8e853f082f7f6ab17229bd678e2fedf35d21015a40bce009bba0bf171fb93dc4c2cebc47d02e7ab84b69698d9bd430dd59a8848dda160ee5345127
data/Makefile CHANGED
@@ -3,4 +3,4 @@ gem:: dxmms2.gemspec
3
3
  gem build $<
4
4
 
5
5
  install::
6
- gem install --user dxmms2-*.gem
6
+ gem install --install-dir $(HOME)/.gem/ruby/3.1.0 dxmms2-*.gem
data/bin/dxmms2 CHANGED
@@ -18,14 +18,17 @@ end
18
18
  # for dmenu #
19
19
  ##########################
20
20
 
21
+ # XXX: I ruby doesn't designate keyword arguments with =, it just helps me
22
+ # remember what some arguments are
23
+
21
24
  $xc = Xmms::client("dxmms2")
22
25
 
23
- $COMMAND_SIG = "@"
26
+ $COMMAND_SIG = ","
24
27
  # default configs {{{
25
28
  $SCREEN_WIDTH=Integer(ENV.fetch('DXMMS2_MENU_WIDTH', 600))
26
29
  $FONT_WIDTH=Integer(ENV.fetch('DXMMS2_FONT_WIDTH', 13)) #in pixels)
27
30
  $BG_COLOR=ENV.fetch('DMENU_BG_COLOR', '#000000')
28
- $FG_COLOR=ENV.fetch('DMENU_FG_COLOR', '#dc322f')
31
+ $FG_COLOR=ENV.fetch('DMENU_FG_COLOR', '#268bd2')
29
32
  $SEL_BG_COLOR=ENV.fetch('DMENU_SEL_BG_COLOR', $FG_COLOR)
30
33
  $SEL_FG_COLOR=ENV.fetch('DMENU_SEL_FG_COLOR', $BG_COLOR)
31
34
  if $GLIB
@@ -37,7 +40,7 @@ if $GLIB
37
40
  $MUSIC_DIRECTORY = ENV.fetch('DXMMS2_MUSIC_DIRECTORY', fallback)
38
41
  end
39
42
 
40
- $FONT = ENV.fetch('DMENU_FONT', 'Noto Sans Mono CJK JP Regular')
43
+ $FONT = ENV.fetch('DMENU_FONT', 'Noto Sans Mono CJK JP Bold')
41
44
  $FONT = $FONT + ':pixelsize=' + $FONT_WIDTH.to_s
42
45
  $LIST_ENTRIES_PER_PAGE = 15
43
46
  $LINE_HEIGHT=10
@@ -48,9 +51,10 @@ $LINE_HEIGHT=10
48
51
  #fi
49
52
  class Integer
50
53
  def ms_to_time_string
51
- minutes=(self / 60000)
52
- seconds=(self % 60000) / 1000
53
- "%d:%02d" % [minutes, seconds]
54
+ sgn = self >= 0 ? '' : '-'
55
+ minutes=(self.abs / 60000)
56
+ seconds=(self.abs % 60000) / 1000
57
+ "%s%d:%02d" % [sgn, minutes, seconds]
54
58
  end
55
59
  end
56
60
 
@@ -58,14 +62,16 @@ def time_string_to_ms(str)
58
62
  res = 0
59
63
  s = 1
60
64
  for n in str.split(":").reverse do
61
- s = 60 * s
62
65
  res = res + s * (n.to_i)
66
+ s = 60 * s
63
67
  end
64
- return res.to_i
68
+ return res.to_i * 1000
65
69
  end
66
70
 
67
- def my_dmenu (entries, prompt='dxmms2', height=entries.count, width=$SCREEN_WIDTH)
68
- height = [height, 20].min
71
+ def my_dmenu(entries, prompt='dxmms2', height=nil, width=$SCREEN_WIDTH)
72
+ if height.nil?
73
+ height = [entries.length, 20].min
74
+ end
69
75
  Dmenu::dmenu(entries, prompt, height, width,
70
76
  $FG_COLOR,
71
77
  $BG_COLOR,
@@ -100,8 +106,8 @@ def list_ids(entries, prompt, start=0, nentries=nil, commands=nil)
100
106
  # XXX: Create a list object to pass to user-supplied commands
101
107
  # list object allows for setting list start, page size, list content,
102
108
  # whether to redisplay the list, and maybe other things
103
- morestring,endstring,startstring,backstring =
104
- %w[more end start back].map{|w| $COMMAND_SIG + w}
109
+ morestring,endstring,startstring,backstring,allstring,pagedstring =
110
+ %w[more end start back all paged].map{|w| $COMMAND_SIG + w}
105
111
  if commands.nil?
106
112
  commands = Hash.new
107
113
  end
@@ -111,9 +117,10 @@ def list_ids(entries, prompt, start=0, nentries=nil, commands=nil)
111
117
  c1[$COMMAND_SIG + k] = v
112
118
  end
113
119
  listing=1
114
- nentries = (nentries.nil? ? $LIST_ENTRIES_PER_PAGE : nentries)
120
+ nentries = nentries_orig = (nentries.nil? ? $LIST_ENTRIES_PER_PAGE : nentries)
115
121
  pos = nil
116
122
  list_start = start
123
+ paged = true
117
124
  while ( listing == 1 ) do
118
125
  start_clamped = false
119
126
  end_clamped = false
@@ -125,7 +132,7 @@ def list_ids(entries, prompt, start=0, nentries=nil, commands=nil)
125
132
  list_end = list_start + nentries
126
133
 
127
134
  #clamps end
128
- (list_end > entries.length) and (list_end = entries.length ; end_clamped = true)
135
+ (list_end >= entries.length) and (list_end = entries.length ; end_clamped = true)
129
136
 
130
137
 
131
138
  nw = list_end.to_s.length
@@ -147,11 +154,20 @@ def list_ids(entries, prompt, start=0, nentries=nil, commands=nil)
147
154
  items << morestring
148
155
  end
149
156
 
157
+ if nentries < entries.length or list_start != 0
158
+ items << allstring
159
+ end
160
+
161
+ if nentries == entries.length
162
+ items << pagedstring
163
+ end
164
+
150
165
  c1.keys.each do |d|
151
166
  items << d
152
167
  end
153
168
 
154
- choice = my_dmenu(items, prompt, items.length).gsub(/^\s+|\s+$/, "")
169
+ list_len = paged ? items.length : 20
170
+ choice = my_dmenu(items, prompt, list_len).gsub(/^\s+|\s+$/, "")
155
171
  pos = choice[/^-?\d+|#{$COMMAND_SIG}[a-zA-Z0-9\-_.]+/]
156
172
 
157
173
  case pos
@@ -163,6 +179,14 @@ def list_ids(entries, prompt, start=0, nentries=nil, commands=nil)
163
179
  list_start = entries.length - nentries
164
180
  when startstring
165
181
  list_start = 0
182
+ when allstring
183
+ list_start = 0
184
+ nentries = entries.length
185
+ paged = false
186
+ when pagedstring
187
+ list_start = start
188
+ nentries = nentries_orig
189
+ paged = true
166
190
  when *(c1.keys)
167
191
  f = c1[pos]
168
192
  f.call(entries)
@@ -189,7 +213,11 @@ def xmms2_ids_to_display_list_strings(ids, fields=%w[artist title url duration])
189
213
  ids.map do |id|
190
214
  my_info = $xc.extract_medialib_info(id, *fields)
191
215
  artist_part = my_info[:artist]
192
- some_title = (my_info[:title] or File.basename(my_info[:url]))
216
+ begin
217
+ some_title = (my_info[:title] or File.basename(my_info[:url]))
218
+ rescue Exception
219
+ some_title = "!!NO TITLE!!"
220
+ end
193
221
  duration = my_info[:duration].to_i.ms_to_time_string
194
222
  "#{artist_part}|||#{some_title} [#{duration}]"
195
223
  end
@@ -298,7 +326,9 @@ def match_collection(field, pattern, base_coll=nil)
298
326
  coll.operands << Xmms::Collection.universe
299
327
  end
300
328
  coll.attributes["field"] = field
301
- coll.attributes["value"] = pattern
329
+ if !pattern.nil?
330
+ coll.attributes["value"] = pattern
331
+ end
302
332
  coll
303
333
  end
304
334
 
@@ -356,10 +386,9 @@ while true do
356
386
  when "list"
357
387
  pos = pl_list(nil, nil, "Play Track:")
358
388
  if not pos.nil?
359
- puts "moving to positon #{pos}"
360
389
  play_new_track($xc, pos)
390
+ break
361
391
  end
362
- break
363
392
  when "add"
364
393
  d = Dir.new($MUSIC_DIRECTORY)
365
394
  add_dir = $COMMAND_SIG + 'add-dir'
@@ -371,7 +400,7 @@ while true do
371
400
  x
372
401
  end
373
402
  end
374
- choice = my_dmenu(entries.sort << add_dir, "Add entries", d.entries.length)
403
+ choice = my_dmenu(entries.sort << add_dir, "Add entries")
375
404
  path = File.join(d, choice)
376
405
  if choice.empty?
377
406
  d = nil
@@ -426,7 +455,7 @@ while true do
426
455
  [k,v]
427
456
  }]
428
457
  while true
429
- field = my_dmenu(info.map {|k,v| "#{k} |||#{v[0]}"}, "Info", info.size)
458
+ field = my_dmenu(info.map {|k,v| "#{k} |||#{v[0]}"}, "Info")
430
459
  if field.empty?
431
460
  break
432
461
  else
@@ -477,29 +506,50 @@ while true do
477
506
  edit_metadata(ids.map{ |id| $xc.extract_medialib_info(id, "url")[:url] })
478
507
  end
479
508
 
480
- current_collection = Xmms::Collection.universe # TODO: Support searching multiple fields as in xmmsfs
509
+ def drop_ids(ids)
510
+ ids.each do |id|
511
+ $xc.medialib_entry_remove(id).wait
512
+ end
513
+ end
514
+
481
515
  refine = false
516
+ completed = false
482
517
  cs = {
483
- 'add' => proc { |k| add(k) },
484
- 'edit-metadata' => proc { |k| edit_ids_metadata(k) },
485
- 'new-playlist' => proc { |k| new_playlist_prompt(k) },
486
- 'refine' => proc { |k| refine=true }
518
+ 'add' => proc { |k| add(k) ; completed = true },
519
+ 'edit-metadata' => proc { |k| edit_ids_metadata(k) ; completed = true},
520
+ 'new-playlist' => proc { |k| new_playlist_prompt(k) ; completed = true},
521
+ 'refine' => proc { |k| refine=true },
522
+ 'drop' => proc { |k| drop_ids(k) ; completed=true },
487
523
  }
488
524
 
525
+ collection_stack = []
526
+ search_stack = []
489
527
  while true
490
- field = my_dmenu(fields, prompt="Field")
528
+ search_path = search_stack.map{|x| "#{x[0]}:#{x[1]}"}.join("/")
529
+ if not search_path.empty?
530
+ search_path += " "
531
+ end
532
+ field = my_dmenu(fields, "#{search_path}Field")
491
533
  if field.empty?
492
- break
534
+ if collection_stack.empty?
535
+ break
536
+ else
537
+ collection_stack.pop
538
+ search_stack.pop
539
+ next
540
+ end
541
+ end
542
+ current_collection = collection_stack[-1]
543
+ if current_collection.nil?
544
+ current_collection = Xmms::Collection.universe
493
545
  end
494
546
  field_sym = field.to_sym
495
547
  options = Set.new(get_collection_info(current_collection, field).map{|x| x.fetch(field_sym, "UNDEF")}).to_a.sort
496
-
497
548
  lists = [options]
498
549
  search_string = ""
499
- # XXX: Save and display past searches
500
550
  begin
501
551
  lists.each_with_index do |x, i|
502
- search_string = my_dmenu(x, prompt="Search string (#{i}/#{lists.length})", [x.length, 20].min)
552
+ search_string = my_dmenu(x, "Search string (#{i}/#{lists.length})")
503
553
  break
504
554
  end
505
555
  rescue Exception
@@ -510,18 +560,17 @@ while true do
510
560
  if !options.include?(search_string)
511
561
  search_string.gsub!(" ","*")
512
562
  elsif field == 'url'
513
- search_string = Xmms::encode_url(search_string)
563
+ search_string = Xmms::encode_xmms2_url(search_string)
514
564
  end
515
565
 
516
566
  if search_string.empty?
517
- break
567
+ next
518
568
  end
519
- search_string = "*#{search_string}*"
520
- puts search_string
521
- coll = match_collection(field, search_string, current_collection)
569
+ coll = match_collection(field, search_string == "UNDEF" ? nil : "*#{search_string}*", current_collection)
522
570
  d = $xc.coll_query_ids(coll,"artist,album,tracknr").wait.value
523
571
  d = d.reverse
524
- pos = list_ids(d, prompt="Results", 0, $LIST_ENTRIES_PER_PAGE, cs)
572
+ refine = false
573
+ pos = list_ids(d, "Results", 0, $LIST_ENTRIES_PER_PAGE, cs)
525
574
 
526
575
  # Make the playlist collection
527
576
  new_playlist('search-result-list', d)
@@ -531,17 +580,21 @@ while true do
531
580
  pl = $xc.playlist('search-result-list')
532
581
  pl.load.wait
533
582
  play_new_track($xc, pos)
583
+ completed = true
534
584
  break
535
585
  end
536
586
 
537
587
  if refine
538
- current_collection = coll
539
- else
540
- current_collection = Xmms::Collection.universe
588
+ collection_stack.push coll
589
+ search_stack.push [field, search_string]
590
+ elsif completed
591
+ break
541
592
  end
542
593
  end
543
594
 
544
- break
595
+ if completed
596
+ break
597
+ end
545
598
  when "remove"
546
599
  while true
547
600
  pos = pl_list(nil,nil,"Remove entry:")
@@ -596,14 +649,14 @@ while true do
596
649
  while tag_menu(album_ids, [])
597
650
  end
598
651
  rescue => e
599
- puts e
652
+ $stderr.puts e
600
653
  end
601
654
 
602
655
  break
603
656
  when "change-playlist"
604
657
  begin
605
658
  playlists_prompt do |selected|
606
- $xc.playlist(selected).load.wait
659
+ puts $xc.playlist(selected).load.wait.value
607
660
  end
608
661
  end
609
662
  break
@@ -642,7 +695,7 @@ while true do
642
695
  $xc.quit.wait
643
696
  break
644
697
  when "seek"
645
- print $xc.playback_playtime.wait.value
698
+ cur = $xc.playback_playtime.wait.value
646
699
  id = $xc.playback_current_id.wait.value
647
700
  info = $xc.extract_medialib_info(id, :duration)
648
701
  dur = info[:duration].to_i
@@ -650,15 +703,20 @@ while true do
650
703
  times = []
651
704
  times << ["start", 0]
652
705
  Range.new(0,dur).step(interval_size).each do |x|
653
- times << [x.ms_to_time_string, x]
706
+ sgn = x-cur >= 0?"+":""
707
+ offset = (x - cur).ms_to_time_string
708
+ times << [" #{x.ms_to_time_string} #{sgn}#{offset} ", x]
654
709
  end
655
710
  times << ["end", dur]
656
711
  seek_location = my_dmenu(times.map{|x| x[0]}).to_s
657
- # FIXME: This math is clearly janky. Sadly I have actual work to do.
658
- seek = 20 * time_string_to_ms(seek_location)
659
- puts $xc.playback_seek_ms(seek).wait.value
660
- $stdout.flush
661
- break
712
+ if !seek_location.empty?
713
+ thash = Hash[times]
714
+ seek = thash[seek_location]
715
+ if !seek.nil?
716
+ $xc.playback_seek_ms(seek).wait.value
717
+ end
718
+ break
719
+ end
662
720
  else
663
721
  if not command.empty?
664
722
  `xmms2 #{command}`
data/dxmms2.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = "dxmms2"
5
- spec.version = "1.0.0"
5
+ spec.version = "1.2.0"
6
6
  spec.authors = ["Mark Watts"]
7
7
  spec.email = ["wattsmark2015@gmail.com"]
8
8
  spec.summary = %q{A client for working with xmms2}
@@ -15,9 +15,9 @@ Gem::Specification.new do |spec|
15
15
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
16
  spec.require_paths = ["."]
17
17
 
18
- spec.add_development_dependency "bundler", "~> 1.7"
19
- spec.add_development_dependency "rake", "~> 10.0"
20
- spec.add_runtime_dependency "glib2", "~> 3.1.0"
18
+ spec.add_development_dependency "bundler", "~>2.2", ">= 2.2.10"
19
+ spec.add_development_dependency "rake", "~>12.3", ">= 12.3.2"
20
+ spec.add_runtime_dependency "glib2", "~> 3.4.3"
21
21
  spec.add_runtime_dependency "xmms2_utils", "~> 0.1.2"
22
- spec.add_runtime_dependency "markw-dmenu", "~> 1.0.0"
22
+ spec.add_runtime_dependency "markw-dmenu", "~> 1.2.0"
23
23
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dxmms2
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Watts
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-21 00:00:00.000000000 Z
11
+ date: 2023-02-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,42 +16,54 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '2.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.2.10
20
23
  type: :development
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
- version: '1.7'
29
+ version: '2.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.2.10
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: rake
29
35
  requirement: !ruby/object:Gem::Requirement
30
36
  requirements:
31
37
  - - "~>"
32
38
  - !ruby/object:Gem::Version
33
- version: '10.0'
39
+ version: '12.3'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 12.3.2
34
43
  type: :development
35
44
  prerelease: false
36
45
  version_requirements: !ruby/object:Gem::Requirement
37
46
  requirements:
38
47
  - - "~>"
39
48
  - !ruby/object:Gem::Version
40
- version: '10.0'
49
+ version: '12.3'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 12.3.2
41
53
  - !ruby/object:Gem::Dependency
42
54
  name: glib2
43
55
  requirement: !ruby/object:Gem::Requirement
44
56
  requirements:
45
57
  - - "~>"
46
58
  - !ruby/object:Gem::Version
47
- version: 3.1.0
59
+ version: 3.4.3
48
60
  type: :runtime
49
61
  prerelease: false
50
62
  version_requirements: !ruby/object:Gem::Requirement
51
63
  requirements:
52
64
  - - "~>"
53
65
  - !ruby/object:Gem::Version
54
- version: 3.1.0
66
+ version: 3.4.3
55
67
  - !ruby/object:Gem::Dependency
56
68
  name: xmms2_utils
57
69
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +84,14 @@ dependencies:
72
84
  requirements:
73
85
  - - "~>"
74
86
  - !ruby/object:Gem::Version
75
- version: 1.0.0
87
+ version: 1.2.0
76
88
  type: :runtime
77
89
  prerelease: false
78
90
  version_requirements: !ruby/object:Gem::Requirement
79
91
  requirements:
80
92
  - - "~>"
81
93
  - !ruby/object:Gem::Version
82
- version: 1.0.0
94
+ version: 1.2.0
83
95
  description: "# dxmms2\n*a dmenu shell for xmms2*\n\nSetting the dmenu width in dxmms2
84
96
  requires the patch provided in this repo. The \npatch hasn't been tested--application
85
97
  may require manual effort.\n\n ![dxmms2 screenie](dxmms2.png)\n"
@@ -100,7 +112,7 @@ homepage: http://github.com/mwatts15/xmms2-stuff
100
112
  licenses:
101
113
  - MPL-2.0
102
114
  metadata: {}
103
- post_install_message:
115
+ post_install_message:
104
116
  rdoc_options: []
105
117
  require_paths:
106
118
  - "."
@@ -115,9 +127,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
115
127
  - !ruby/object:Gem::Version
116
128
  version: '0'
117
129
  requirements: []
118
- rubyforge_project:
119
- rubygems_version: 2.2.2
120
- signing_key:
130
+ rubygems_version: 3.3.15
131
+ signing_key:
121
132
  specification_version: 4
122
133
  summary: A client for working with xmms2
123
134
  test_files: []