muzak 0.1.8 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3343a7ac9f6f6902736580ca2dc6d83821ccbdb8
4
- data.tar.gz: 6e4ae9b75369dbdee0f1f3c3b74c970689c68ed8
3
+ metadata.gz: d298ab0d509e9b3cbf82b012a282ab8fe9fe7713
4
+ data.tar.gz: 1128e587b3f0d81ba2c0cbbd641dfb1e47cd9755
5
5
  SHA512:
6
- metadata.gz: a00938c127bc0458f8055ed5f8519bb3e17f165665744fb71f1ba7b668db270387016c68e16ceddc9fdfde8b347eb05236c525daa650e245e6cdabf937c66716
7
- data.tar.gz: eb1c7eb8fb51521d7fed514915f4af1890ab1eab39b18af6810ae7167c0e1524790132bf7ffa489f367a2b074ff11b2f3998a7619340f27ed1a9a57b32e8e95f
6
+ metadata.gz: b12d25d6fc3854b96926b49e78e9e57becd903987f2a4ff9438b91d7a0bb942fae43a7cc3b7b3cec08464672b4017803f20bcecc4f6028ae6f157ec7f637d230
7
+ data.tar.gz: 99a06151ac245f18e4a03fb9c12dc1dda1a57848c09487b4d7a27b5e7bebdf49bb88a98ecdc982e9fe2681e61a6408f3345c99b4dfdc5708717b3245171e56e8
data/COMMANDS.md CHANGED
@@ -324,39 +324,6 @@ $ muzak-cmd help
324
324
  }
325
325
  ```
326
326
 
327
- ## `index-build`
328
-
329
- (Re-)builds the index.
330
-
331
- **Note:** This command can take quite some time to run. It's generally a good
332
- idea to either set `index-autobuild` in the configuration to do automatic
333
- rebuilds or schedule this command via `cron` or a similar tool.
334
-
335
- ### Syntax
336
-
337
- `index-build`
338
-
339
- ### Example
340
-
341
- ```bash
342
- $ muzak-cmd index-build
343
- ```
344
-
345
- ### Example Response
346
-
347
- ```json
348
- {
349
- "response" : {
350
- "error" : null,
351
- "method" : "index_build",
352
- "data" : {
353
- "artists" : 10,
354
- "albums": 100
355
- }
356
- }
357
- }
358
- ```
359
-
360
327
  ## `jukebox`
361
328
 
362
329
  Adds *N* random songs to the player's queue, where *N* is either the optional
data/CONFIGURATION.md CHANGED
@@ -34,7 +34,6 @@ Muzak::Config.music # => "/home/william/mnt/fortuna/music/"
34
34
  Muzak::Config.player # => "mpv"
35
35
  Muzak::Config.art_geometry # => "300x300"
36
36
  Muzak::Config.jukebox_size # => 100
37
- Muzak::Config.deep_index # => true
38
37
  ```
39
38
 
40
39
  Since {Muzak::Config} is populated whenever `muzak` is loaded via `require`,
@@ -119,36 +118,6 @@ initialize and control.
119
118
  The short names of supported players can be found in
120
119
  {Muzak::Player::PLAYER_MAP}.
121
120
 
122
- ### `index-autobuild`
123
-
124
- *Optional.*
125
-
126
- *Default:* `86400`
127
-
128
- `index-autobuild: <span>` should be set to maximum number of seconds before
129
- an index is considered outdated (based on its {Muzak::Index#timestamp} field).
130
-
131
- When an outdated index is loaded and this key is set, muzak will automatically
132
- rebuild the index.
133
-
134
- **Note:** This is *not* an interval - the outdated index is only rebuilt
135
- when a new {Muzak::Instance} or {Muzak::Index} is instantiated.
136
-
137
- ### `deep-index`
138
-
139
- *Optional.*
140
-
141
- *Default:* `false`
142
-
143
- If `deep-index: true` is set in the configuration file, then muzak will
144
- build a "deep" index. This involves opening each music file and reading metadata
145
- from it, which can take substantially longer than just a shallow filesystem
146
- index.
147
-
148
- This primary benefit of this is caching - having all the song metadata in the
149
- index allows muzak to make fewer disk accesses, which may be expensive over
150
- a remote disk.
151
-
152
121
  ### `jukebox-size`
153
122
 
154
123
  *Mandatory.*
@@ -1,19 +1,5 @@
1
1
  module Muzak
2
2
  module Cmd
3
- # Rebuild the current instance's index.
4
- # @command `index-build`
5
- # @cmdexample `muzak> index-build`
6
- def index_build(*args)
7
- verbose "building a new index, this may take a while"
8
-
9
- index.build!
10
-
11
- build_response data: {
12
- artists: index.artists.size,
13
- albums: index.albums.size
14
- }
15
- end
16
-
17
3
  # List all artists in the index.
18
4
  # @command `list-artists`
19
5
  # @cmdexample `muzak> list-artists`
data/lib/muzak/config.rb CHANGED
@@ -35,8 +35,6 @@ module Muzak
35
35
  "verbose" => true,
36
36
  "music" => File.expand_path("~/music"),
37
37
  "player" => "mpv",
38
- "index-autobuild" => 86400,
39
- "deep-index" => false,
40
38
  "jukebox-size" => 100,
41
39
 
42
40
  # client/daemon defaults
data/lib/muzak/const.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Muzak
2
2
  # Muzak's current version
3
- VERSION = "0.1.8".freeze
3
+ VERSION = "0.2.0".freeze
4
4
 
5
5
  # The root directory for all user configuration, data, etc
6
6
  CONFIG_DIR = File.expand_path("~/.config/muzak").freeze
data/lib/muzak/index.rb CHANGED
@@ -4,7 +4,11 @@ module Muzak
4
4
  include Utils
5
5
 
6
6
  def self.load_index!
7
- Index.new(Config.music, deep: Config.deep_index)
7
+ if File.exist?(INDEX_FILE)
8
+ Index.new
9
+ else
10
+ error! "#{INDEX_FILE} missing, did you forget to run muzak-index?"
11
+ end
8
12
  end
9
13
 
10
14
  # @return [String] the path of the root of the music tree
@@ -16,39 +20,10 @@ module Muzak
16
20
  # @return [Hash] the index hash
17
21
  attr_accessor :hash
18
22
 
19
- # @param tree [String] the root to begin indexing from
20
- # @param deep [Boolean] whether to build a "deep" index
21
- # @param sync [Boolean] whether or not to save to {Muzak::INDEX_FILE}
22
- # @note if the index ({Muzak::INDEX_FILE}) already exists and is not
23
- # outdated, no building is performed.
24
- # @see #build!
25
- def initialize(tree, deep: false, sync: true)
26
- @tree = tree
27
- @deep = deep
28
-
29
- if File.exist?(INDEX_FILE)
30
- verbose "loading index from #{INDEX_FILE}"
31
- @hash = Marshal::load(File.read INDEX_FILE)
32
- return unless outdated?
33
- end
34
-
35
- build!(sync: sync)
36
- end
37
-
38
- # Synchronize the in-memory index hash with {Muzak::INDEX_FILE}.
39
- def sync!
40
- File.open(INDEX_FILE, "w") { |io| io.write Marshal::dump @hash }
41
- end
42
-
43
- # (Re)builds and saves the index ({Muzak::INDEX_FILE}) to disk.
44
- # @param sync [Boolean] whether or not to save to {Muzak::INDEX_FILE}
45
- # @note This method can be expensive.
46
- def build!(sync: true)
47
- @hash = build_index_hash!
48
-
49
- debug "indexed #{albums.length} albums by #{artists.length} artists"
50
-
51
- sync! if sync
23
+ # @param index_file [String] the path of the index data file
24
+ def initialize(file: INDEX_FILE)
25
+ @hash = Marshal.load(File.read file)
26
+ @deep = @hash["deep"]
52
27
  end
53
28
 
54
29
  # @return [Boolean] whether or not the current index is deep
@@ -61,14 +36,6 @@ module Muzak
61
36
  @hash["timestamp"]
62
37
  end
63
38
 
64
- # @return [Boolean] whether or not the index is currently out of date
65
- # @note The behavior of this method is affected by the value of
66
- # {Muzak::Config.index_autobuild}.
67
- def outdated?
68
- return false unless Config.index_autobuild
69
- Time.now.to_i - timestamp >= Config.index_autobuild
70
- end
71
-
72
39
  # @return [Array<String>] a list of all artists in the index
73
40
  def artists
74
41
  @artists ||= @hash["artists"].keys
@@ -138,55 +105,5 @@ module Muzak
138
105
  []
139
106
  end
140
107
  end
141
-
142
- private
143
-
144
- def build_index_hash!
145
- index_hash = {
146
- "timestamp" => Time.now.to_i,
147
- "artists" => {},
148
- "deep" => deep
149
- }
150
-
151
- Dir.entries(tree).each do |artist|
152
- next unless File.directory?(File.join(tree, artist))
153
- next if artist.start_with?(".")
154
-
155
- index_hash["artists"][artist] = {}
156
- index_hash["artists"][artist]["albums"] = {}
157
-
158
- Dir.entries(File.join(tree, artist)).each do |album|
159
- next if album.start_with?(".")
160
-
161
- index_hash["artists"][artist]["albums"][album] = {}
162
- index_hash["artists"][artist]["albums"][album]["songs"] = []
163
- index_hash["artists"][artist]["albums"][album]["deep-songs"] = []
164
-
165
- Dir.glob(File.join(tree, artist, album, "**")) do |file|
166
- index_hash["artists"][artist]["albums"][album]["cover"] = file if album_art?(file)
167
-
168
- if music?(file)
169
- index_hash["artists"][artist]["albums"][album]["songs"] << file
170
- if deep?
171
- index_hash["artists"][artist]["albums"][album]["deep-songs"] << Song.new(file)
172
- end
173
- end
174
- end
175
-
176
- index_hash["artists"][artist]["albums"][album]["songs"].sort!
177
-
178
- # if any of the track numbers in the album are > 0 (the fallback),
179
- # sort by ID3 track numbers. otherwise, hope that the song
180
- # paths contain track numbers (e.g, "01 song.mp3").
181
- if index_hash["artists"][artist]["albums"][album]["deep-songs"].any? { |s| s.track > 0 }
182
- index_hash["artists"][artist]["albums"][album]["deep-songs"].sort_by!(&:track)
183
- else
184
- index_hash["artists"][artist]["albums"][album]["deep-songs"].sort_by!(&:path)
185
- end
186
- end
187
- end
188
-
189
- index_hash
190
- end
191
108
  end
192
109
  end
data/lib/muzak/song.rb CHANGED
@@ -60,7 +60,7 @@ module Muzak
60
60
  def best_guess_album_art
61
61
  album_dir = File.dirname(path)
62
62
 
63
- art = Dir.entries(album_dir).find { |ent| album_art?(ent) }
63
+ art = Dir.entries(album_dir).find { |ent| Utils.album_art?(ent) }
64
64
  File.join(album_dir, art) unless art.nil?
65
65
  end
66
66
 
data/lib/muzak/utils.rb CHANGED
@@ -22,14 +22,14 @@ module Muzak
22
22
  # Tests whether the given filename is likely to be music.
23
23
  # @param filename [String] the filename to test
24
24
  # @return [Boolean] whether or not the file is a music file
25
- def music?(filename)
25
+ def self.music?(filename)
26
26
  [".mp3", ".flac", ".m4a", ".wav", ".ogg", ".oga", ".opus"].include?(File.extname(filename.downcase))
27
27
  end
28
28
 
29
29
  # Tests whether the given filename is likely to be album art.
30
30
  # @param filename [String] the filename to test
31
31
  # @return [Boolean] whether or not the file is an art file
32
- def album_art?(filename)
32
+ def self.album_art?(filename)
33
33
  File.basename(filename) =~ /(cover)|(folder).(jpg)|(png)/i
34
34
  end
35
35
 
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.1.8
4
+ version: 0.2.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-08 00:00:00.000000000 Z
11
+ date: 2017-01-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: taglib-ruby