muzak 0.2.7 → 0.3.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 +4 -4
- data/CONFIGURATION.md +2 -2
- data/lib/muzak.rb +6 -2
- data/lib/muzak/cmd.rb +2 -2
- data/lib/muzak/cmd/config.rb +1 -1
- data/lib/muzak/config.rb +77 -15
- data/lib/muzak/index.rb +6 -5
- data/lib/muzak/instance.rb +3 -3
- data/lib/muzak/playlist.rb +3 -2
- data/lib/muzak/plugin.rb +1 -1
- data/lib/muzak/plugin/stub_plugin.rb +1 -1
- data/lib/muzak/utils.rb +3 -21
- metadata +2 -3
- data/lib/muzak/const.rb +0 -33
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 917b86d06294801e33561fe181e64fd755f09828
|
|
4
|
+
data.tar.gz: 3aebb78550918a276f0cefc7fc11e57d277759a3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2f9bcb70833ce12b36e14e2f56e6042cdbfef39dc88362b8e9908a255f1eaad19d185956ebde3dbf8608f562e41a3e52151390a9c49b6afb2b38435646c53e77
|
|
7
|
+
data.tar.gz: 817a120b22297d8f3ba64afa8fe11a42452914c628de0f4b1a5f64d4d701b44c371024b2cdba0e9191cb9555ed4a0bd7d84fd8cadc2f8921c2e0e3e7f231e1fd
|
data/CONFIGURATION.md
CHANGED
|
@@ -8,8 +8,8 @@ For the developer documentation, see {Muzak::Config}.
|
|
|
8
8
|
## General behavior
|
|
9
9
|
|
|
10
10
|
All of muzak's configuration is kept in {Muzak::Config}, which is read
|
|
11
|
-
during load-time (i.e., during `require`) from {Muzak::CONFIG_FILE},
|
|
12
|
-
is YAML-formatted.
|
|
11
|
+
during load-time (i.e., during `require`) from {Muzak::Config::CONFIG_FILE},
|
|
12
|
+
which is YAML-formatted.
|
|
13
13
|
|
|
14
14
|
Muzak loads configuration keys just like commands, translating them from
|
|
15
15
|
`kebab-case` to `snake_case`. For example, take the following configuration:
|
data/lib/muzak.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
require_relative "muzak/const"
|
|
2
|
-
require_relative "muzak/utils"
|
|
3
1
|
require_relative "muzak/config"
|
|
2
|
+
require_relative "muzak/utils"
|
|
4
3
|
require_relative "muzak/plugin"
|
|
5
4
|
require_relative "muzak/song"
|
|
6
5
|
require_relative "muzak/album"
|
|
@@ -10,3 +9,8 @@ require_relative "muzak/cmd"
|
|
|
10
9
|
require_relative "muzak/player"
|
|
11
10
|
require_relative "muzak/instance"
|
|
12
11
|
|
|
12
|
+
# The primary namespace for muzak.
|
|
13
|
+
module Muzak
|
|
14
|
+
# Muzak's current version
|
|
15
|
+
VERSION = "0.3.0".freeze
|
|
16
|
+
end
|
data/lib/muzak/cmd.rb
CHANGED
|
@@ -5,12 +5,12 @@ module Muzak
|
|
|
5
5
|
# @see file:COMMANDS.md User Commands
|
|
6
6
|
module Cmd
|
|
7
7
|
# load commands included by the user
|
|
8
|
-
Dir.glob(File.join(USER_COMMAND_DIR, "*")) { |file| require file }
|
|
8
|
+
Dir.glob(File.join(Config::USER_COMMAND_DIR, "*")) { |file| require file }
|
|
9
9
|
|
|
10
10
|
# @return [Array<String>] all valid muzak commands
|
|
11
11
|
def self.commands
|
|
12
12
|
commands = instance_methods.map(&:to_s).reject { |m| m.start_with?("_") }
|
|
13
|
-
commands.map { |c|
|
|
13
|
+
commands.map { |c| Config.resolve_method c }
|
|
14
14
|
end
|
|
15
15
|
end
|
|
16
16
|
end
|
data/lib/muzak/cmd/config.rb
CHANGED
data/lib/muzak/config.rb
CHANGED
|
@@ -10,6 +10,81 @@ module Muzak
|
|
|
10
10
|
# Config.art_geometry # => "300x300"
|
|
11
11
|
# @see file:CONFIGURATION.md User Configuration
|
|
12
12
|
class Config
|
|
13
|
+
# The root directory for all user configuration, data, etc
|
|
14
|
+
CONFIG_DIR = File.expand_path("~/.config/muzak").freeze
|
|
15
|
+
|
|
16
|
+
# Muzak's primary configuration file
|
|
17
|
+
# @see Muzak::Config
|
|
18
|
+
CONFIG_FILE = File.join(CONFIG_DIR, "muzak.yml").freeze
|
|
19
|
+
|
|
20
|
+
# Muzak's music index
|
|
21
|
+
INDEX_FILE = File.join(CONFIG_DIR, "index.dat").freeze
|
|
22
|
+
|
|
23
|
+
# The directory for all user playlists
|
|
24
|
+
PLAYLIST_DIR = File.join(CONFIG_DIR, "playlists").freeze
|
|
25
|
+
|
|
26
|
+
# The directory for all user plugins
|
|
27
|
+
USER_PLUGIN_DIR = File.join(CONFIG_DIR, "plugins").freeze
|
|
28
|
+
|
|
29
|
+
# The directory for all user commands
|
|
30
|
+
USER_COMMAND_DIR = File.join(CONFIG_DIR, "commands").freeze
|
|
31
|
+
|
|
32
|
+
# All filename suffixes that muzak recognizes as music.
|
|
33
|
+
MUSIC_SUFFIXES = [
|
|
34
|
+
".mp3",
|
|
35
|
+
".flac",
|
|
36
|
+
".m4a",
|
|
37
|
+
".wav",
|
|
38
|
+
".ogg",
|
|
39
|
+
".oga",
|
|
40
|
+
".opus",
|
|
41
|
+
].freeze
|
|
42
|
+
|
|
43
|
+
# The regular expression that muzak uses to find album art.
|
|
44
|
+
ALBUM_ART_REGEX = /(cover)|(folder).(jpg)|(png)/i.freeze
|
|
45
|
+
|
|
46
|
+
# All events currently propagated by {Muzak::Instance#event}
|
|
47
|
+
PLUGIN_EVENTS = [
|
|
48
|
+
:instance_started,
|
|
49
|
+
:player_activated,
|
|
50
|
+
:player_deactivated,
|
|
51
|
+
:song_loaded,
|
|
52
|
+
:song_unloaded,
|
|
53
|
+
:playlist_enqueued,
|
|
54
|
+
].freeze
|
|
55
|
+
|
|
56
|
+
# The default configuration keys and values.
|
|
57
|
+
DEFAULT_CONFIG = {
|
|
58
|
+
# core defaults
|
|
59
|
+
"debug" => false,
|
|
60
|
+
"verbose" => true,
|
|
61
|
+
"music" => File.expand_path("~/music"),
|
|
62
|
+
"player" => "mpv",
|
|
63
|
+
"jukebox-size" => 100,
|
|
64
|
+
|
|
65
|
+
# client/daemon defaults
|
|
66
|
+
"daemon-port" => 2669,
|
|
67
|
+
"daemon-host" => "localhost",
|
|
68
|
+
}.freeze
|
|
69
|
+
|
|
70
|
+
# Convert the given command into a method (kebab to camel case).
|
|
71
|
+
# @param cmd [String] the command to convert
|
|
72
|
+
# @return [String] the method corresponding to the command
|
|
73
|
+
# @example
|
|
74
|
+
# resolve_command "do-something" # => "do_something"
|
|
75
|
+
def self.resolve_command(cmd)
|
|
76
|
+
cmd.tr "-", "_"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Convert the given method into a command (camel to kebab case).
|
|
80
|
+
# @param meth [String, Symbol] the method to convert
|
|
81
|
+
# @return [String] the command corresponding to the method
|
|
82
|
+
# @example
|
|
83
|
+
# resolve_method "do_something" # => "do-something"
|
|
84
|
+
def self.resolve_method(meth)
|
|
85
|
+
meth.to_s.tr "_", "-"
|
|
86
|
+
end
|
|
87
|
+
|
|
13
88
|
# Catches all undefined configuration keys and defaults them to false.
|
|
14
89
|
# @return [false]
|
|
15
90
|
def self.method_missing(method, *args)
|
|
@@ -29,19 +104,6 @@ module Muzak
|
|
|
29
104
|
respond_to? "plugin_#{pname}"
|
|
30
105
|
end
|
|
31
106
|
|
|
32
|
-
DEFAULT_CONFIG = {
|
|
33
|
-
# core defaults
|
|
34
|
-
"debug" => false,
|
|
35
|
-
"verbose" => true,
|
|
36
|
-
"music" => File.expand_path("~/music"),
|
|
37
|
-
"player" => "mpv",
|
|
38
|
-
"jukebox-size" => 100,
|
|
39
|
-
|
|
40
|
-
# client/daemon defaults
|
|
41
|
-
"daemon-port" => 2669,
|
|
42
|
-
"daemon-host" => "localhost",
|
|
43
|
-
}.freeze
|
|
44
|
-
|
|
45
107
|
if File.exist?(CONFIG_FILE)
|
|
46
108
|
user_config = YAML::load_file(CONFIG_FILE)
|
|
47
109
|
else
|
|
@@ -57,11 +119,11 @@ module Muzak
|
|
|
57
119
|
@config = DEFAULT_CONFIG.merge(user_config)
|
|
58
120
|
|
|
59
121
|
@config.each do |key, _|
|
|
60
|
-
define_singleton_method
|
|
122
|
+
define_singleton_method resolve_command(key) do
|
|
61
123
|
@config[key]
|
|
62
124
|
end
|
|
63
125
|
|
|
64
|
-
define_singleton_method "#{
|
|
126
|
+
define_singleton_method "#{resolve_command(key)}=" do |value|
|
|
65
127
|
@config[key] = value
|
|
66
128
|
sync!
|
|
67
129
|
end
|
data/lib/muzak/index.rb
CHANGED
|
@@ -3,11 +3,12 @@ module Muzak
|
|
|
3
3
|
class Index
|
|
4
4
|
include Utils
|
|
5
5
|
|
|
6
|
+
# @return [Index] a {Index} instance instantiated with {Config::INDEX_FILE}
|
|
6
7
|
def self.load_index!
|
|
7
|
-
if File.exist?(INDEX_FILE)
|
|
8
|
+
if File.exist?(Config::INDEX_FILE)
|
|
8
9
|
Index.new
|
|
9
10
|
else
|
|
10
|
-
error! "#{INDEX_FILE} missing, did you forget to run muzak-index?"
|
|
11
|
+
error! "#{Config::INDEX_FILE} missing, did you forget to run muzak-index?"
|
|
11
12
|
end
|
|
12
13
|
end
|
|
13
14
|
|
|
@@ -17,9 +18,9 @@ module Muzak
|
|
|
17
18
|
# @return [Hash] the index hash
|
|
18
19
|
attr_accessor :hash
|
|
19
20
|
|
|
20
|
-
# @param
|
|
21
|
-
def initialize(file: INDEX_FILE)
|
|
22
|
-
debug "loading index from '#{INDEX_FILE}'..."
|
|
21
|
+
# @param file [String] the path of the index data file
|
|
22
|
+
def initialize(file: Config::INDEX_FILE)
|
|
23
|
+
debug "loading index from '#{Config::INDEX_FILE}'..."
|
|
23
24
|
|
|
24
25
|
@hash = Marshal.load(File.read file)
|
|
25
26
|
end
|
data/lib/muzak/instance.rb
CHANGED
|
@@ -12,7 +12,7 @@ module Muzak
|
|
|
12
12
|
# instance.command "pause"
|
|
13
13
|
def command(cmd, *args)
|
|
14
14
|
if Cmd.commands.include?(cmd)
|
|
15
|
-
meth = method(
|
|
15
|
+
meth = method(Config.resolve_command(cmd))
|
|
16
16
|
if meth.arity == args.size || meth.arity <= -1
|
|
17
17
|
meth.call *args
|
|
18
18
|
else
|
|
@@ -57,9 +57,9 @@ module Muzak
|
|
|
57
57
|
# Dispatch an event to all plugins.
|
|
58
58
|
# @param type [Symbol] the type of event to dispatch
|
|
59
59
|
# @param args [Array] the event's arguments
|
|
60
|
-
# @note {
|
|
60
|
+
# @note {Config::PLUGIN_EVENTS} contains all valid events.
|
|
61
61
|
def event(type, *args)
|
|
62
|
-
return unless PLUGIN_EVENTS.include?(type)
|
|
62
|
+
return unless Config::PLUGIN_EVENTS.include?(type)
|
|
63
63
|
|
|
64
64
|
plugins.each do |plugin|
|
|
65
65
|
Thread.new do
|
data/lib/muzak/playlist.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
module Muzak
|
|
2
|
+
# Represents a sequential list of songs for muzak.
|
|
2
3
|
class Playlist
|
|
3
4
|
# @return [String] the absolute path to the playlist on disk
|
|
4
5
|
attr_accessor :filename
|
|
@@ -9,7 +10,7 @@ module Muzak
|
|
|
9
10
|
# @param pname [String] the playlist's name
|
|
10
11
|
# @return [String] the absolute path to the given playlist name
|
|
11
12
|
def self.path_for(pname)
|
|
12
|
-
File.join(PLAYLIST_DIR, pname) + ".yml"
|
|
13
|
+
File.join(Config::PLAYLIST_DIR, pname) + ".yml"
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
# @param pname [String] the playlist's name
|
|
@@ -29,7 +30,7 @@ module Muzak
|
|
|
29
30
|
|
|
30
31
|
# @return [Array<String>] the names of all currently available playlists
|
|
31
32
|
def self.playlist_names
|
|
32
|
-
Dir.entries(PLAYLIST_DIR).reject do |ent|
|
|
33
|
+
Dir.entries(Config::PLAYLIST_DIR).reject do |ent|
|
|
33
34
|
ent.start_with?(".")
|
|
34
35
|
end.map do |ent|
|
|
35
36
|
File.basename(ent, File.extname(ent))
|
data/lib/muzak/plugin.rb
CHANGED
|
@@ -8,7 +8,7 @@ module Muzak
|
|
|
8
8
|
# The namespace for muzak plugins.
|
|
9
9
|
module Plugin
|
|
10
10
|
# load plugins included by the user
|
|
11
|
-
Dir.glob(File.join(USER_PLUGIN_DIR, "*")) { |file| require file }
|
|
11
|
+
Dir.glob(File.join(Config::USER_PLUGIN_DIR, "*")) { |file| require file }
|
|
12
12
|
|
|
13
13
|
# @return [Array<Class>] all plugin classes visible under Plugin
|
|
14
14
|
def self.plugin_classes
|
data/lib/muzak/utils.rb
CHANGED
|
@@ -1,36 +1,18 @@
|
|
|
1
1
|
module Muzak
|
|
2
2
|
# A collection of convenience utilities for use throughout muzak.
|
|
3
3
|
module Utils
|
|
4
|
-
# Convert the given command into a method (kebab to camel case).
|
|
5
|
-
# @param cmd [String] the command to convert
|
|
6
|
-
# @return [String] the method corresponding to the command
|
|
7
|
-
# @example
|
|
8
|
-
# resolve_command "do-something" # => "do_something"
|
|
9
|
-
def self.resolve_command(cmd)
|
|
10
|
-
cmd.tr "-", "_"
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
# Convert the given method into a command (camel to kebab case).
|
|
14
|
-
# @param meth [String, Symbol] the method to convert
|
|
15
|
-
# @return [String] the command corresponding to the method
|
|
16
|
-
# @example
|
|
17
|
-
# resolve_method "do_something" # => "do-something"
|
|
18
|
-
def self.resolve_method(meth)
|
|
19
|
-
meth.to_s.tr "_", "-"
|
|
20
|
-
end
|
|
21
|
-
|
|
22
4
|
# Tests whether the given filename is likely to be music.
|
|
23
5
|
# @param filename [String] the filename to test
|
|
24
6
|
# @return [Boolean] whether or not the file is a music file
|
|
25
7
|
def self.music?(filename)
|
|
26
|
-
|
|
8
|
+
Config::MUSIC_SUFFIXES.include?(File.extname(filename.downcase))
|
|
27
9
|
end
|
|
28
10
|
|
|
29
11
|
# Tests whether the given filename is likely to be album art.
|
|
30
12
|
# @param filename [String] the filename to test
|
|
31
13
|
# @return [Boolean] whether or not the file is an art file
|
|
32
14
|
def self.album_art?(filename)
|
|
33
|
-
File.basename(filename) =~
|
|
15
|
+
File.basename(filename) =~ Config::ALBUM_ART_REGEX
|
|
34
16
|
end
|
|
35
17
|
|
|
36
18
|
# Tests whether the given utility is available in the system path.
|
|
@@ -80,7 +62,7 @@ module Muzak
|
|
|
80
62
|
# Outputs a boxed warning message.
|
|
81
63
|
# @param args [Array<String>] the message(s)
|
|
82
64
|
# @return [void]
|
|
83
|
-
def
|
|
65
|
+
def danger(*args)
|
|
84
66
|
output pretty(:yellow, "warn"), args
|
|
85
67
|
end
|
|
86
68
|
|
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.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- William Woodruff
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-01-
|
|
11
|
+
date: 2017-01-22 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: taglib-ruby
|
|
@@ -72,7 +72,6 @@ files:
|
|
|
72
72
|
- lib/muzak/cmd/player.rb
|
|
73
73
|
- lib/muzak/cmd/playlist.rb
|
|
74
74
|
- lib/muzak/config.rb
|
|
75
|
-
- lib/muzak/const.rb
|
|
76
75
|
- lib/muzak/index.rb
|
|
77
76
|
- lib/muzak/instance.rb
|
|
78
77
|
- lib/muzak/player.rb
|
data/lib/muzak/const.rb
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
module Muzak
|
|
2
|
-
# Muzak's current version
|
|
3
|
-
VERSION = "0.2.7".freeze
|
|
4
|
-
|
|
5
|
-
# The root directory for all user configuration, data, etc
|
|
6
|
-
CONFIG_DIR = File.expand_path("~/.config/muzak").freeze
|
|
7
|
-
|
|
8
|
-
# Muzak's primary configuration file
|
|
9
|
-
# @see Muzak::Config
|
|
10
|
-
CONFIG_FILE = File.join(CONFIG_DIR, "muzak.yml").freeze
|
|
11
|
-
|
|
12
|
-
# Muzak's music index
|
|
13
|
-
INDEX_FILE = File.join(CONFIG_DIR, "index.dat").freeze
|
|
14
|
-
|
|
15
|
-
# The directory for all user playlists
|
|
16
|
-
PLAYLIST_DIR = File.join(CONFIG_DIR, "playlists").freeze
|
|
17
|
-
|
|
18
|
-
# The directory for all user plugins
|
|
19
|
-
USER_PLUGIN_DIR = File.join(CONFIG_DIR, "plugins").freeze
|
|
20
|
-
|
|
21
|
-
# The directory for all user commands
|
|
22
|
-
USER_COMMAND_DIR = File.join(CONFIG_DIR, "commands").freeze
|
|
23
|
-
|
|
24
|
-
# All events currently propagated by {Muzak::Instance#event}
|
|
25
|
-
PLUGIN_EVENTS = [
|
|
26
|
-
:instance_started,
|
|
27
|
-
:player_activated,
|
|
28
|
-
:player_deactivated,
|
|
29
|
-
:song_loaded,
|
|
30
|
-
:song_unloaded,
|
|
31
|
-
:playlist_enqueued
|
|
32
|
-
]
|
|
33
|
-
end
|