muzak 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/bin/muzak-dmenu +23 -0
- data/lib/muzak/album.rb +9 -1
- data/lib/muzak/cmd/config.rb +2 -1
- data/lib/muzak/cmd/index.rb +6 -4
- data/lib/muzak/cmd/player.rb +7 -11
- data/lib/muzak/cmd/playlist.rb +2 -4
- data/lib/muzak/const.rb +1 -1
- data/lib/muzak/index.rb +27 -14
- data/lib/muzak/song.rb +5 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66effe9b1b141471424f8fb07923b88ecf87da80
|
4
|
+
data.tar.gz: a79283a7dd22bbb754ba3a7ed5b9db7ba32aa99b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80990917d255f3dc96570cf9389ed1238701382b9c096ceac2de8ee6cfce606b90808ebe253ce1764dda18b880eed4b05c11b75d244008ff855f20643c22fca9
|
7
|
+
data.tar.gz: 4f1bf3964aef17d1a060590162bf5ca16cfcef1f733423c20116e7b3b972bb7df363d12f38b0ada0cb31286ba49c0933823d98de704c9f845e8def882bbdfba2
|
data/README.md
CHANGED
@@ -33,8 +33,8 @@ $ ruby -Ilib bin/muzak-cmd "command"
|
|
33
33
|
### TODO
|
34
34
|
|
35
35
|
* GUI "frontend"?
|
36
|
-
* optional "deep" index containing ID3 tags
|
37
36
|
* isolation of art and music output (`Muzak::ArtProvider`?)
|
38
37
|
* current indexing/sorting logic is terrible
|
39
38
|
* all the documentation
|
40
39
|
* readline's tab complete is terrible with spaces (maybe use `bond`?)
|
40
|
+
* replace YAML index with a more space/time efficient format (JSON, msgpack, Marshal?)
|
data/bin/muzak-dmenu
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "muzak"
|
4
|
+
|
5
|
+
def fatal(msg)
|
6
|
+
puts "Fatal: #{msg}"
|
7
|
+
exit 1
|
8
|
+
end
|
9
|
+
|
10
|
+
def dmenu(options)
|
11
|
+
opts = options.join("\n")
|
12
|
+
`printf "#{opts}" | dmenu`
|
13
|
+
end
|
14
|
+
|
15
|
+
fifo_path = File.join(Muzak::CONFIG_DIR, "muzak.fifo")
|
16
|
+
|
17
|
+
fatal "Is muzakd running?" unless File.exist?(fifo_path)
|
18
|
+
|
19
|
+
command = dmenu Muzak::Cmd.commands
|
20
|
+
|
21
|
+
File.open(fifo_path, "w") do |io|
|
22
|
+
io.puts command unless command.empty?
|
23
|
+
end
|
data/lib/muzak/album.rb
CHANGED
@@ -2,10 +2,18 @@ module Muzak
|
|
2
2
|
class Album
|
3
3
|
attr_reader :title, :songs, :cover_art
|
4
4
|
|
5
|
+
# instead of passing an album hash directly from the index,
|
6
|
+
# this should really just take a title and an array of Song
|
7
|
+
# objects.
|
5
8
|
def initialize(title, album_hash)
|
6
9
|
@title = title
|
7
|
-
@songs = album_hash["songs"].map { |s| Song.new(s) }
|
8
10
|
@cover_art = album_hash["cover"]
|
11
|
+
|
12
|
+
if album_hash["deep-songs"]
|
13
|
+
@songs = album_hash["deep-songs"]
|
14
|
+
else
|
15
|
+
@songs = album_hash["songs"].map { |s| Song.new(s) }
|
16
|
+
end
|
9
17
|
end
|
10
18
|
end
|
11
19
|
end
|
data/lib/muzak/cmd/config.rb
CHANGED
data/lib/muzak/cmd/index.rb
CHANGED
@@ -18,7 +18,7 @@ module Muzak
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def index_load
|
21
|
-
|
21
|
+
verbose "loading index from #{INDEX_FILE}"
|
22
22
|
|
23
23
|
@index = Index.load_index(INDEX_FILE)
|
24
24
|
|
@@ -33,7 +33,9 @@ module Muzak
|
|
33
33
|
def index_build(*args)
|
34
34
|
warn_arity(args, 0)
|
35
35
|
|
36
|
-
|
36
|
+
verbose "building a new index, this may take a while"
|
37
|
+
|
38
|
+
@index = Index.new(@config["music"], deep: !!@config["deep-index"])
|
37
39
|
_index_sync
|
38
40
|
end
|
39
41
|
|
@@ -59,7 +61,7 @@ module Muzak
|
|
59
61
|
artist = args.join(" ")
|
60
62
|
return if artist.nil?
|
61
63
|
|
62
|
-
puts @index.albums_by(artist).
|
64
|
+
puts @index.albums_by(artist).map(&:title)
|
63
65
|
end
|
64
66
|
|
65
67
|
def songs_by_artist(*args)
|
@@ -68,7 +70,7 @@ module Muzak
|
|
68
70
|
artist = args.join(" ")
|
69
71
|
return if artist.nil?
|
70
72
|
|
71
|
-
puts @index.songs_by(artist)
|
73
|
+
puts @index.songs_by(artist).map(&:title)
|
72
74
|
end
|
73
75
|
end
|
74
76
|
end
|
data/lib/muzak/cmd/player.rb
CHANGED
@@ -44,12 +44,8 @@ module Muzak
|
|
44
44
|
artist = args.join(" ")
|
45
45
|
return if artist.nil?
|
46
46
|
|
47
|
-
|
48
|
-
return if
|
49
|
-
|
50
|
-
albums = album_hashes.map do |album_name, album_hash|
|
51
|
-
Album.new(album_name, album_hash)
|
52
|
-
end
|
47
|
+
albums = @index.albums_by(artist)
|
48
|
+
return if albums.empty?
|
53
49
|
|
54
50
|
albums.each do |album|
|
55
51
|
@player.enqueue_album album
|
@@ -60,10 +56,10 @@ module Muzak
|
|
60
56
|
album_name = args.join(" ")
|
61
57
|
return if album_name.nil?
|
62
58
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
59
|
+
debug album_name
|
60
|
+
album = @index.albums[album_name]
|
61
|
+
debug album.to_s
|
62
|
+
return if album.nil?
|
67
63
|
|
68
64
|
@player.enqueue_album album
|
69
65
|
end
|
@@ -71,7 +67,7 @@ module Muzak
|
|
71
67
|
def jukebox(*args)
|
72
68
|
count = args.shift || @config["jukebox-size"]
|
73
69
|
|
74
|
-
songs = @index.jukebox(count.to_i)
|
70
|
+
songs = @index.jukebox(count.to_i)
|
75
71
|
|
76
72
|
songs.each { |s| @player.enqueue_song s }
|
77
73
|
end
|
data/lib/muzak/cmd/playlist.rb
CHANGED
@@ -67,10 +67,8 @@ module Muzak
|
|
67
67
|
album_name = args.join(" ")
|
68
68
|
return if album_name.nil?
|
69
69
|
|
70
|
-
|
71
|
-
return if
|
72
|
-
|
73
|
-
album = Album.new(album_name, album_hash)
|
70
|
+
album = @index.albums[album_name]
|
71
|
+
return if album.nil?
|
74
72
|
|
75
73
|
album.songs.each { |song| @playlist.add song }
|
76
74
|
|
data/lib/muzak/const.rb
CHANGED
data/lib/muzak/index.rb
CHANGED
@@ -10,10 +10,11 @@ module Muzak
|
|
10
10
|
instance
|
11
11
|
end
|
12
12
|
|
13
|
-
def initialize(tree)
|
13
|
+
def initialize(tree, deep: false)
|
14
14
|
@hash = {
|
15
15
|
"timestamp" => Time.now.to_i,
|
16
|
-
"artists" => {}
|
16
|
+
"artists" => {},
|
17
|
+
"deep" => deep
|
17
18
|
}
|
18
19
|
|
19
20
|
Dir.entries(tree).each do |artist|
|
@@ -28,17 +29,27 @@ module Muzak
|
|
28
29
|
|
29
30
|
@hash["artists"][artist]["albums"][album] = {}
|
30
31
|
@hash["artists"][artist]["albums"][album]["songs"] = []
|
32
|
+
@hash["artists"][artist]["albums"][album]["deep-songs"] = []
|
31
33
|
|
32
34
|
Dir.glob(File.join(tree, artist, album, "**")) do |file|
|
33
35
|
@hash["artists"][artist]["albums"][album]["cover"] = file if album_art?(file)
|
34
|
-
|
36
|
+
|
37
|
+
if music?(file)
|
38
|
+
@hash["artists"][artist]["albums"][album]["songs"] << file
|
39
|
+
@hash["artists"][artist]["albums"][album]["deep-songs"] << Song.new(file)
|
40
|
+
end
|
35
41
|
end
|
36
42
|
|
37
43
|
@hash["artists"][artist]["albums"][album]["songs"].sort!
|
44
|
+
@hash["artists"][artist]["albums"][album]["deep-songs"].sort_by!(&:track)
|
38
45
|
end
|
39
46
|
end
|
40
47
|
end
|
41
48
|
|
49
|
+
def deep?
|
50
|
+
!!@hash["deep"]
|
51
|
+
end
|
52
|
+
|
42
53
|
def artists
|
43
54
|
@hash["artists"].keys
|
44
55
|
end
|
@@ -47,8 +58,8 @@ module Muzak
|
|
47
58
|
albums_hash = {}
|
48
59
|
|
49
60
|
artists.each do |a|
|
50
|
-
@hash["artists"][a]["albums"].
|
51
|
-
albums_hash[
|
61
|
+
@hash["artists"][a]["albums"].each do |title, album_hash|
|
62
|
+
albums_hash[title] = Album.new(title, album_hash)
|
52
63
|
end
|
53
64
|
end
|
54
65
|
|
@@ -62,25 +73,27 @@ module Muzak
|
|
62
73
|
def albums_by(artist)
|
63
74
|
error "no such artist: '#{artist}'" unless @hash["artists"].key?(artist)
|
64
75
|
|
65
|
-
|
66
|
-
@hash["artists"][artist]["albums"]
|
67
|
-
rescue Exception => e
|
68
|
-
{}
|
69
|
-
end
|
76
|
+
@hash["artists"][artist]["albums"].map { |title, album| Album.new(title, album) }
|
70
77
|
end
|
71
78
|
|
72
79
|
def jukebox(count = 50)
|
73
80
|
@all_albums ||= @hash["artists"].map { |_, a| a["albums"] }.flatten
|
74
|
-
|
75
|
-
|
81
|
+
|
82
|
+
if deep?
|
83
|
+
@all_deep_songs ||= @all_albums.map { |aa| aa.map { |_, a| a["deep-songs"] } }.flatten
|
84
|
+
@all_deep_songs.sample(count)
|
85
|
+
else
|
86
|
+
@all_songs ||= @all_albums.map { |aa| aa.map { |_, a| a["songs"] } }.flatten
|
87
|
+
@all_songs.sample(count).map { |s| Song.new(s) }
|
88
|
+
end
|
76
89
|
end
|
77
90
|
|
78
91
|
def songs_by(artist)
|
79
92
|
error "no such artist: '#{artist}'" unless @hash["artists"].key?(artist)
|
80
93
|
|
81
94
|
begin
|
82
|
-
albums_by(artist).map do |
|
83
|
-
album
|
95
|
+
albums_by(artist).map do |album|
|
96
|
+
album.songs
|
84
97
|
end.flatten
|
85
98
|
rescue Exception => e
|
86
99
|
[]
|
data/lib/muzak/song.rb
CHANGED
@@ -11,7 +11,7 @@ module Muzak
|
|
11
11
|
|
12
12
|
TagLib::FileRef.open(path) do |ref|
|
13
13
|
break if ref.null?
|
14
|
-
@title = ref.tag.title
|
14
|
+
@title = ref.tag.title
|
15
15
|
@artist = ref.tag.artist
|
16
16
|
@album = ref.tag.album
|
17
17
|
@year = ref.tag.year
|
@@ -20,6 +20,10 @@ module Muzak
|
|
20
20
|
@comment = ref.tag.comment
|
21
21
|
@length = ref.audio_properties.length
|
22
22
|
end
|
23
|
+
|
24
|
+
# provide some sane fallbacks
|
25
|
+
@title ||= File.basename(path, File.extname(path))
|
26
|
+
@track ||= 0 # we'll need to sort by track number
|
23
27
|
end
|
24
28
|
|
25
29
|
def best_guess_album_art
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: muzak
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Woodruff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: taglib-ruby
|
@@ -30,6 +30,7 @@ executables:
|
|
30
30
|
- muzak
|
31
31
|
- muzakd
|
32
32
|
- muzak-cmd
|
33
|
+
- muzak-dmenu
|
33
34
|
extensions: []
|
34
35
|
extra_rdoc_files: []
|
35
36
|
files:
|
@@ -37,6 +38,7 @@ files:
|
|
37
38
|
- README.md
|
38
39
|
- bin/muzak
|
39
40
|
- bin/muzak-cmd
|
41
|
+
- bin/muzak-dmenu
|
40
42
|
- bin/muzakd
|
41
43
|
- lib/muzak.rb
|
42
44
|
- lib/muzak/album.rb
|