dxmms2 1.0.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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: []