muzak 0.0.9 → 0.0.10
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 +4 -4
- data/lib/muzak/cmd/index.rb +5 -44
- data/lib/muzak/cmd/meta.rb +2 -2
- data/lib/muzak/cmd/player.rb +22 -22
- data/lib/muzak/cmd/playlist.rb +12 -26
- data/lib/muzak/const.rb +1 -2
- data/lib/muzak/index.rb +58 -38
- data/lib/muzak/instance.rb +7 -12
- data/lib/muzak/playlist.rb +11 -0
- data/lib/muzak/plugin.rb +5 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fea7658ba10597fe2e70ededc6e8b33e179f200c
|
4
|
+
data.tar.gz: b320dc1ef8a2b0aa715f336290d1e66fe0771a12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 91fe7be79998568bb9b3727066561eb1fd9f82ce8d0a9be4829c45b13a13d59fb2ae2bce343fd9ab87202eb72862d192c402fe89438b84cf23efb9fd1f3df8e5
|
7
|
+
data.tar.gz: 1352f596a7e5a7df41027c62600524faf2352baf7a39d48c9671647e1d01e9c80ca3cdcb6278f7e71b1fa22dd866fe10c933b6f4f394ac66eae789619a9e6e80
|
data/lib/muzak/cmd/index.rb
CHANGED
@@ -1,76 +1,37 @@
|
|
1
1
|
module Muzak
|
2
2
|
module Cmd
|
3
|
-
def _index_available?
|
4
|
-
File.file?(INDEX_FILE)
|
5
|
-
end
|
6
|
-
|
7
|
-
def _index_loaded?
|
8
|
-
!!@index
|
9
|
-
end
|
10
|
-
|
11
|
-
def _index_outdated?
|
12
|
-
Time.now.to_i - @index.timestamp >= Config.index_autobuild
|
13
|
-
end
|
14
|
-
|
15
|
-
def _index_sync
|
16
|
-
debug "syncing index hash with #{INDEX_FILE}"
|
17
|
-
File.open(INDEX_FILE, "w") { |io| io.write @index.hash.to_yaml }
|
18
|
-
end
|
19
|
-
|
20
|
-
def index_load
|
21
|
-
verbose "loading index from #{INDEX_FILE}"
|
22
|
-
|
23
|
-
@index = Index.load_index(INDEX_FILE)
|
24
|
-
|
25
|
-
# the order is important here, since Config.index_autobuild
|
26
|
-
# will short-circuit if index-autobuild isn't set
|
27
|
-
if Config.index_autobuild && _index_outdated?
|
28
|
-
verbose "rebuilding outdated index"
|
29
|
-
index_build
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
3
|
def index_build(*args)
|
34
4
|
warn_arity(args, 0)
|
35
5
|
|
36
6
|
verbose "building a new index, this may take a while"
|
37
7
|
|
38
|
-
|
39
|
-
_index_sync
|
8
|
+
index.build!
|
40
9
|
end
|
41
10
|
|
42
11
|
def list_artists(*args)
|
43
|
-
return unless _index_loaded?
|
44
|
-
|
45
12
|
warn_arity(args, 0)
|
46
13
|
|
47
|
-
puts
|
14
|
+
puts index.artists.join("\n")
|
48
15
|
end
|
49
16
|
|
50
17
|
def list_albums(*args)
|
51
|
-
return unless _index_loaded?
|
52
|
-
|
53
18
|
warn_arity(args, 0)
|
54
19
|
|
55
|
-
puts
|
20
|
+
puts index.album_names.join("\n")
|
56
21
|
end
|
57
22
|
|
58
23
|
def albums_by_artist(*args)
|
59
|
-
return unless _index_loaded?
|
60
|
-
|
61
24
|
artist = args.join(" ")
|
62
25
|
return if artist.nil?
|
63
26
|
|
64
|
-
puts
|
27
|
+
puts index.albums_by(artist).map(&:title)
|
65
28
|
end
|
66
29
|
|
67
30
|
def songs_by_artist(*args)
|
68
|
-
return unless _index_loaded?
|
69
|
-
|
70
31
|
artist = args.join(" ")
|
71
32
|
return if artist.nil?
|
72
33
|
|
73
|
-
puts
|
34
|
+
puts index.songs_by(artist).map(&:title)
|
74
35
|
end
|
75
36
|
end
|
76
37
|
end
|
data/lib/muzak/cmd/meta.rb
CHANGED
data/lib/muzak/cmd/player.rb
CHANGED
@@ -1,54 +1,54 @@
|
|
1
1
|
module Muzak
|
2
2
|
module Cmd
|
3
3
|
def player_activate
|
4
|
-
if
|
4
|
+
if player.running?
|
5
5
|
warn "player is already running"
|
6
6
|
return
|
7
7
|
end
|
8
8
|
|
9
|
-
|
9
|
+
player.activate!
|
10
10
|
end
|
11
11
|
|
12
12
|
def player_deactivate
|
13
|
-
warn "player is not running" unless
|
13
|
+
warn "player is not running" unless player.running?
|
14
14
|
|
15
15
|
# do cleanup even if the player isn't running, just in case
|
16
|
-
|
16
|
+
player.deactivate!
|
17
17
|
end
|
18
18
|
|
19
19
|
def play
|
20
|
-
|
20
|
+
player.play
|
21
21
|
end
|
22
22
|
|
23
23
|
def pause
|
24
|
-
|
24
|
+
player.pause
|
25
25
|
end
|
26
26
|
|
27
27
|
def toggle
|
28
|
-
if
|
29
|
-
|
28
|
+
if player.playing?
|
29
|
+
player.pause
|
30
30
|
else
|
31
|
-
|
31
|
+
player.play
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
def next
|
36
|
-
|
36
|
+
player.next_song
|
37
37
|
end
|
38
38
|
|
39
39
|
def previous
|
40
|
-
|
40
|
+
player.previous_song
|
41
41
|
end
|
42
42
|
|
43
43
|
def enqueue_artist(*args)
|
44
44
|
artist = args.join(" ")
|
45
45
|
return if artist.nil?
|
46
46
|
|
47
|
-
albums =
|
47
|
+
albums = index.albums_by(artist)
|
48
48
|
return if albums.empty?
|
49
49
|
|
50
50
|
albums.each do |album|
|
51
|
-
|
51
|
+
player.enqueue_album album
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
@@ -57,37 +57,37 @@ module Muzak
|
|
57
57
|
return if album_name.nil?
|
58
58
|
|
59
59
|
debug album_name
|
60
|
-
album =
|
60
|
+
album = index.albums[album_name]
|
61
61
|
debug album.to_s
|
62
62
|
return if album.nil?
|
63
63
|
|
64
|
-
|
64
|
+
player.enqueue_album album
|
65
65
|
end
|
66
66
|
|
67
67
|
def jukebox(*args)
|
68
68
|
count = args.shift || Config.jukebox_size
|
69
69
|
|
70
|
-
songs =
|
70
|
+
songs = index.jukebox(count.to_i)
|
71
71
|
|
72
|
-
songs.each { |s|
|
72
|
+
songs.each { |s| player.enqueue_song s }
|
73
73
|
end
|
74
74
|
|
75
75
|
def list_queue
|
76
|
-
puts
|
76
|
+
puts player.list_queue.map(&:title)
|
77
77
|
end
|
78
78
|
|
79
79
|
def shuffle_queue
|
80
|
-
|
80
|
+
player.shuffle_queue
|
81
81
|
end
|
82
82
|
|
83
83
|
def clear_queue
|
84
|
-
|
84
|
+
player.clear_queue
|
85
85
|
end
|
86
86
|
|
87
87
|
def now_playing
|
88
|
-
return unless
|
88
|
+
return unless player.playing?
|
89
89
|
|
90
|
-
info
|
90
|
+
info player.now_playing.full_title
|
91
91
|
end
|
92
92
|
end
|
93
93
|
end
|
data/lib/muzak/cmd/playlist.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Muzak
|
2
2
|
module Cmd
|
3
3
|
def _playlists_loaded?
|
4
|
-
|
4
|
+
!!playlists
|
5
5
|
end
|
6
6
|
|
7
7
|
def list_playlists(*args)
|
@@ -10,20 +10,6 @@ module Muzak
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
def playlists_load(*args)
|
14
|
-
# fail_arity(args, 1)
|
15
|
-
# pname = args.shift
|
16
|
-
@playlists = {}
|
17
|
-
@playlists.default_proc = proc { |h, k| h[k] = Playlist.new(k) }
|
18
|
-
|
19
|
-
Playlist.playlist_names.each do |pname|
|
20
|
-
debug "loading playlist '#{pname}'"
|
21
|
-
@playlists[pname] = Playlist.new(pname)
|
22
|
-
end
|
23
|
-
|
24
|
-
event :playlists_loaded, @playlist
|
25
|
-
end
|
26
|
-
|
27
13
|
def playlist_delete(*args)
|
28
14
|
fail_arity(args, 1)
|
29
15
|
pname = args.shift
|
@@ -31,7 +17,7 @@ module Muzak
|
|
31
17
|
debug "deleting playist '#{pname}'"
|
32
18
|
|
33
19
|
Playlist.delete!(pname)
|
34
|
-
|
20
|
+
playlists[pname] = nil
|
35
21
|
end
|
36
22
|
|
37
23
|
def enqueue_playlist(*args)
|
@@ -39,8 +25,8 @@ module Muzak
|
|
39
25
|
fail_arity(args, 1)
|
40
26
|
pname = args.shift
|
41
27
|
|
42
|
-
|
43
|
-
event :playlist_enqueued,
|
28
|
+
player.enqueue_playlist(playlists[pname])
|
29
|
+
event :playlist_enqueued, playlists[pname]
|
44
30
|
end
|
45
31
|
|
46
32
|
def playlist_add_album(*args)
|
@@ -52,10 +38,10 @@ module Muzak
|
|
52
38
|
album_name = args.join(" ")
|
53
39
|
return if album_name.nil?
|
54
40
|
|
55
|
-
album =
|
41
|
+
album = index.albums[album_name]
|
56
42
|
return if album.nil?
|
57
43
|
|
58
|
-
|
44
|
+
playlists[pname].add(album.songs)
|
59
45
|
end
|
60
46
|
|
61
47
|
def playlist_add_artist(*args)
|
@@ -67,25 +53,25 @@ module Muzak
|
|
67
53
|
artist = args.join(" ")
|
68
54
|
return if artist.nil?
|
69
55
|
|
70
|
-
|
56
|
+
playlists[pname].add(index.songs_by(artist))
|
71
57
|
end
|
72
58
|
|
73
59
|
def playlist_add_current(*args)
|
74
|
-
return unless
|
60
|
+
return unless player.running? && _playlists_loaded?
|
75
61
|
|
76
62
|
pname = args.shift
|
77
63
|
return if pname.nil?
|
78
64
|
|
79
|
-
|
65
|
+
playlists[pname].add player.now_playing
|
80
66
|
end
|
81
67
|
|
82
68
|
def playlist_del_current(*args)
|
83
|
-
return unless
|
69
|
+
return unless player.running? && _playlists_loaded?
|
84
70
|
|
85
71
|
pname = args.shift
|
86
72
|
return if pname.nil?
|
87
73
|
|
88
|
-
|
74
|
+
playlists[pname].delete player.now_playing
|
89
75
|
end
|
90
76
|
|
91
77
|
def playlist_shuffle(*args)
|
@@ -94,7 +80,7 @@ module Muzak
|
|
94
80
|
pname = args.shift
|
95
81
|
return if pname.nil?
|
96
82
|
|
97
|
-
|
83
|
+
playlists[pname].shuffle!
|
98
84
|
end
|
99
85
|
end
|
100
86
|
end
|
data/lib/muzak/const.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Muzak
|
2
|
-
VERSION = "0.0.
|
2
|
+
VERSION = "0.0.10".freeze
|
3
3
|
|
4
4
|
CONFIG_DIR = File.expand_path("~/.config/muzak").freeze
|
5
5
|
CONFIG_FILE = File.join(CONFIG_DIR, "muzak.yml").freeze
|
@@ -12,7 +12,6 @@ module Muzak
|
|
12
12
|
:player_activated,
|
13
13
|
:player_deactivated,
|
14
14
|
:song_loaded,
|
15
|
-
:playlists_loaded,
|
16
15
|
:playlist_enqueued
|
17
16
|
]
|
18
17
|
end
|
data/lib/muzak/index.rb
CHANGED
@@ -1,59 +1,39 @@
|
|
1
1
|
module Muzak
|
2
2
|
class Index
|
3
3
|
include Utils
|
4
|
-
attr_accessor :hash
|
5
|
-
|
6
|
-
def self.load_index(file)
|
7
|
-
instance = allocate
|
8
|
-
instance.hash = YAML::load_file(file)
|
9
|
-
|
10
|
-
instance
|
11
|
-
end
|
4
|
+
attr_accessor :tree, :deep, :hash
|
12
5
|
|
13
6
|
def initialize(tree, deep: false)
|
14
|
-
@
|
15
|
-
|
16
|
-
"artists" => {},
|
17
|
-
"deep" => deep
|
18
|
-
}
|
19
|
-
|
20
|
-
Dir.entries(tree).each do |artist|
|
21
|
-
next unless File.directory?(File.join(tree, artist))
|
22
|
-
next if artist.start_with?(".")
|
23
|
-
|
24
|
-
@hash["artists"][artist] = {}
|
25
|
-
@hash["artists"][artist]["albums"] = {}
|
26
|
-
|
27
|
-
Dir.entries(File.join(tree, artist)).each do |album|
|
28
|
-
next if album.start_with?(".")
|
7
|
+
@tree = tree
|
8
|
+
@deep = deep
|
29
9
|
|
30
|
-
|
31
|
-
|
32
|
-
|
10
|
+
if File.exist?(INDEX_FILE)
|
11
|
+
verbose "loading index from #{INDEX_FILE}"
|
12
|
+
@hash = YAML::load_file(INDEX_FILE)
|
13
|
+
return unless outdated?
|
14
|
+
end
|
33
15
|
|
34
|
-
|
35
|
-
|
16
|
+
build!
|
17
|
+
end
|
36
18
|
|
37
|
-
|
38
|
-
|
39
|
-
@hash["artists"][artist]["albums"][album]["deep-songs"] << Song.new(file)
|
40
|
-
end
|
41
|
-
end
|
19
|
+
def build!
|
20
|
+
@hash = build_index_hash!
|
42
21
|
|
43
|
-
|
44
|
-
@hash["artists"][artist]["albums"][album]["deep-songs"].sort_by!(&:track)
|
45
|
-
end
|
46
|
-
end
|
22
|
+
File.open(INDEX_FILE, "w") { |io| io.write @hash.to_yaml }
|
47
23
|
end
|
48
24
|
|
49
25
|
def deep?
|
50
|
-
|
26
|
+
deep
|
51
27
|
end
|
52
28
|
|
53
29
|
def timestamp
|
54
30
|
@hash["timestamp"]
|
55
31
|
end
|
56
32
|
|
33
|
+
def outdated?
|
34
|
+
Time.now.to_i - timestamp >= Config.index_autobuild
|
35
|
+
end
|
36
|
+
|
57
37
|
def artists
|
58
38
|
@hash["artists"].keys
|
59
39
|
end
|
@@ -103,5 +83,45 @@ module Muzak
|
|
103
83
|
[]
|
104
84
|
end
|
105
85
|
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def build_index_hash!
|
90
|
+
index_hash = {
|
91
|
+
"timestamp" => Time.now.to_i,
|
92
|
+
"artists" => {},
|
93
|
+
"deep" => deep
|
94
|
+
}
|
95
|
+
|
96
|
+
Dir.entries(tree).each do |artist|
|
97
|
+
next unless File.directory?(File.join(tree, artist))
|
98
|
+
next if artist.start_with?(".")
|
99
|
+
|
100
|
+
index_hash["artists"][artist] = {}
|
101
|
+
index_hash["artists"][artist]["albums"] = {}
|
102
|
+
|
103
|
+
Dir.entries(File.join(tree, artist)).each do |album|
|
104
|
+
next if album.start_with?(".")
|
105
|
+
|
106
|
+
index_hash["artists"][artist]["albums"][album] = {}
|
107
|
+
index_hash["artists"][artist]["albums"][album]["songs"] = []
|
108
|
+
index_hash["artists"][artist]["albums"][album]["deep-songs"] = []
|
109
|
+
|
110
|
+
Dir.glob(File.join(tree, artist, album, "**")) do |file|
|
111
|
+
index_hash["artists"][artist]["albums"][album]["cover"] = file if album_art?(file)
|
112
|
+
|
113
|
+
if music?(file)
|
114
|
+
index_hash["artists"][artist]["albums"][album]["songs"] << file
|
115
|
+
index_hash["artists"][artist]["albums"][album]["deep-songs"] << Song.new(file)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
index_hash["artists"][artist]["albums"][album]["songs"].sort!
|
120
|
+
index_hash["artists"][artist]["albums"][album]["deep-songs"].sort_by!(&:track)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
index_hash
|
125
|
+
end
|
106
126
|
end
|
107
127
|
end
|
data/lib/muzak/instance.rb
CHANGED
@@ -12,34 +12,29 @@ module Muzak
|
|
12
12
|
help
|
13
13
|
end
|
14
14
|
|
15
|
-
attr_reader :
|
15
|
+
attr_reader :index, :player, :plugins, :playlists
|
16
16
|
|
17
17
|
def initialize(opts = {})
|
18
18
|
$debug = opts[:debug]
|
19
19
|
$verbose = opts[:verbose]
|
20
20
|
|
21
|
-
|
21
|
+
verbose "muzak is starting..."
|
22
22
|
|
23
|
-
|
24
|
-
index_load
|
23
|
+
@index = Index.new(Config.music, deep: Config.deep_index)
|
25
24
|
|
26
25
|
@player = Player::PLAYER_MAP[Config.player].new(self)
|
27
26
|
|
28
|
-
@plugins =
|
27
|
+
@plugins = Plugin.load_plugins!
|
29
28
|
|
30
|
-
|
31
|
-
enqueue_playlist Config.autoplay if Config.autoplay
|
32
|
-
end
|
29
|
+
@playlists = Playlist.load_playlists!
|
33
30
|
|
34
|
-
|
35
|
-
pks = Plugin.plugin_classes.select { |pk| Config.plugin? pk.plugin_name }
|
36
|
-
pks.map { |pk| pk.new(self) }
|
31
|
+
enqueue_playlist Config.autoplay if Config.autoplay
|
37
32
|
end
|
38
33
|
|
39
34
|
def event(type, *args)
|
40
35
|
return unless PLUGIN_EVENTS.include?(type)
|
41
36
|
|
42
|
-
|
37
|
+
plugins.each do |plugin|
|
43
38
|
Thread.new do
|
44
39
|
plugin.send(type, *args)
|
45
40
|
end.join
|
data/lib/muzak/playlist.rb
CHANGED
@@ -22,6 +22,17 @@ module Muzak
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
def self.load_playlists!
|
26
|
+
playlists = {}
|
27
|
+
playlists.default_proc = proc { |h, k| h[k] = Playlist.new(k) }
|
28
|
+
|
29
|
+
playlist_names.each do |pname|
|
30
|
+
playlists[pname] = Playlist.new(pname)
|
31
|
+
end
|
32
|
+
|
33
|
+
playlists
|
34
|
+
end
|
35
|
+
|
25
36
|
def initialize(pname)
|
26
37
|
@filename = self.class.path_for pname
|
27
38
|
|
data/lib/muzak/plugin.rb
CHANGED
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.10
|
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-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: taglib-ruby
|
@@ -83,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
83
|
version: '0'
|
84
84
|
requirements: []
|
85
85
|
rubyforge_project:
|
86
|
-
rubygems_version: 2.5.
|
86
|
+
rubygems_version: 2.5.2
|
87
87
|
signing_key:
|
88
88
|
specification_version: 4
|
89
89
|
summary: muzak - A metamusic player.
|