icemaker 0.1.0 → 0.1.1
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/README.md +85 -6
- data/examples/Icefile +13 -0
- data/lib/icemaker.rb +9 -0
- data/lib/icemaker/filter.rb +2 -2
- data/lib/icemaker/icemaker.rb +9 -16
- data/lib/icemaker/query.rb +1 -1
- data/lib/icemaker/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c4d35a2e92669d91e168cc3b143c76c66062354
|
4
|
+
data.tar.gz: 8dd4fa5b0b1414d7c2bea0d92ade18e80202f2aa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29659ba44156e7887259f597177f2c177acdbeae965a63211ef9252898775a6b7a2c4cd04b5714ec9301d6e31d2755e4e719edf921cfa1785852e102d7fbe1e3
|
7
|
+
data.tar.gz: ec89388cec9787d6b89bcac3f034c190d9ba0a50f9cf42b951e4baa2912172bb774eb199f9814e3e7ce527fa56e79f8d37e6be97a841ba59860f5187edc304ab
|
data/README.md
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+

|
1
2
|
# Icemaker
|
2
3
|
|
3
|
-
|
4
|
+
`icemaker` is a small cli tool, written in Ruby, that applies search filters to the audio metadata of a set of files and writes any matches out to disk. It was created to write playlists for Ices/Icecast; hence the name.
|
4
5
|
|
6
|
+
Access to the metadata is provided via [taglib-ruby](https://rubygems.org/gems/taglib-ruby).
|
5
7
|
## Installation
|
6
8
|
|
7
9
|
Add this line to your application's Gemfile:
|
@@ -20,14 +22,91 @@ Or install it yourself as:
|
|
20
22
|
|
21
23
|
## Usage
|
22
24
|
|
23
|
-
|
25
|
+
run `icemaker` in a directory containing an `Icefile`.
|
24
26
|
|
25
|
-
|
27
|
+
```ruby
|
28
|
+
# An example Icefile
|
29
|
+
|
30
|
+
Icemaker::Playlist.make do |with|
|
31
|
+
|
32
|
+
# .sources, an array containing paths to the locations of the audio files we want to search
|
33
|
+
with.sources = ['/path/to/some/music']
|
34
|
+
|
35
|
+
# .is_recursive, if true, do a fully recursive search through the sources
|
36
|
+
with.is_recursive = true
|
37
|
+
|
38
|
+
# .verbose, if true, verbalize some status info during run, if false, remain silent
|
39
|
+
with.verbose = true
|
40
|
+
|
41
|
+
# .output_to_file, the name of the output file, if a full path is
|
42
|
+
# given, it will need to exist before writing out to the file.
|
43
|
+
with.output_to_file = 'playlist.txt'
|
44
|
+
|
45
|
+
# .formatter, the format string for the output
|
46
|
+
# the following is the default formatter for the playlist output and,
|
47
|
+
# as such, it's redundant to specify it in the Icefile its presence here is merely instructional
|
48
|
+
# with.formatter = lambda { |track| "#{track[:file]}" }
|
49
|
+
|
50
|
+
# an example of a custom formatter; the keys for the hash are any of the searchable fields
|
51
|
+
#with.formatter = lambda { |track| "#{track[:file]} genre: #{track[:genre]} length: #{track[:length]}"}
|
52
|
+
|
53
|
+
# .filters, the array of search filters applied to each track, they take the basic form:
|
54
|
+
|
55
|
+
# { search_field: { search_operator: search_term}}
|
56
|
+
|
57
|
+
# searchable fields are:
|
58
|
+
# :title
|
59
|
+
# :artist
|
60
|
+
# :album
|
61
|
+
# :genre
|
62
|
+
# :year
|
63
|
+
# :length
|
64
|
+
# :bitrate
|
65
|
+
# :channels
|
66
|
+
# :sample_rate
|
26
67
|
|
27
|
-
|
68
|
+
# available search operators (and their synonyms) are:
|
69
|
+
# :is (eq:)
|
70
|
+
# :has (contains:)
|
71
|
+
# :gt (greater_than:)
|
72
|
+
# :gte (greater_than_or_equal_to:)
|
73
|
+
# :lt (less_than:)
|
74
|
+
# :lte (less_than_or_equal_to:)
|
75
|
+
# :regx (satisfies:)
|
76
|
+
|
77
|
+
# all searches are case insensitive, however, case sensitive searches are available using the :regx search operator
|
78
|
+
|
79
|
+
# some examples:
|
80
|
+
|
81
|
+
with.filters << { genre: { is: "ambient" }}
|
82
|
+
with.filters << { album: { has: "air structures" }}
|
83
|
+
with.filters << { length: { gt: 200 }}
|
84
|
+
with.filters << { length: { lt: 800 }}
|
85
|
+
with.filters << { artist: { regx: /[Ff]ripp/}}
|
86
|
+
|
87
|
+
# compound search terms are given as a hash where the
|
88
|
+
# key represents a boolean operator (:or, :and) and the value
|
89
|
+
# is an array of terms to which the operator is applied.
|
90
|
+
|
91
|
+
# { search_field: { search_operator: { boolean_operator: [search_term_0, search_term_1,...] }}}
|
92
|
+
|
93
|
+
# some examples of compound search terms:
|
94
|
+
|
95
|
+
#with.filters << { artist: { has: { or: ["Aphex", "Cowboy"] }}}
|
96
|
+
#with.filters << { genre: { has: { and: ["Ambient", "Darkwave"] }}}
|
97
|
+
|
98
|
+
# synonyms for boolean_operators are:
|
99
|
+
# :intersection_of for :and
|
100
|
+
# :union_of for :or
|
101
|
+
|
102
|
+
#with.filters << { artist: { has: { union_of: ["Aphex", "Cowboy"] }}}
|
103
|
+
#with.filters << { genre: { has: { intersection_of: ["Ambient", "Darkwave"] }}}
|
104
|
+
|
105
|
+
end
|
106
|
+
```
|
28
107
|
|
29
|
-
|
108
|
+
A much smaller example `Icefile` is available in the `/examples` directory.
|
30
109
|
|
31
110
|
## Contributing
|
32
111
|
|
33
|
-
Bug reports
|
112
|
+
Bug reports are welcome on GitHub at https://github.com/twocats/icemaker.
|
data/examples/Icefile
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
|
4
|
+
Icemaker::Playlist.make do |with|
|
5
|
+
|
6
|
+
with.sources = ['/path/to/some/music']
|
7
|
+
with.is_recursive = true
|
8
|
+
with.verbose = true
|
9
|
+
with.output_to_file = 'playlist.txt'
|
10
|
+
|
11
|
+
# with.filters << { album: { has: "air structures" }}
|
12
|
+
|
13
|
+
end
|
data/lib/icemaker.rb
CHANGED
@@ -4,6 +4,15 @@ require 'icemaker/filter'
|
|
4
4
|
require 'icemaker/query'
|
5
5
|
require 'icemaker/icemaker'
|
6
6
|
|
7
|
+
module Icemaker
|
8
|
+
ALLOWED_MEDIA_EXTENSIONS = ['.mp3', '.ogg', '.flac']
|
9
|
+
DEFAULT_PLAYLIST_FILE = 'playlist.txt'
|
10
|
+
DEFAULT_FORMATTER = lambda { |track| "#{track[:file]}"}
|
11
|
+
DEFAULT_VERBOSE_VALUE = true
|
12
|
+
DEFAULT_RECURSIVE_VALUE = true
|
13
|
+
UNKNOWN_VALUE = 'unknown'
|
14
|
+
end
|
15
|
+
|
7
16
|
class String
|
8
17
|
def has(params)
|
9
18
|
self.index params[:substring]
|
data/lib/icemaker/filter.rb
CHANGED
data/lib/icemaker/icemaker.rb
CHANGED
@@ -1,7 +1,4 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
VALID_MEDIA_EXTENSIONS = [".mp3", ".ogg", ".flac"]
|
4
|
-
UNKNOWN_VALUE = 'unknown'
|
1
|
+
module Icemaker
|
5
2
|
|
6
3
|
class Playlist
|
7
4
|
|
@@ -51,10 +48,8 @@ module IceMaker
|
|
51
48
|
|
52
49
|
end
|
53
50
|
|
54
|
-
@@files.flatten
|
55
|
-
|
56
|
-
@@files.uniq! if @@icefile.unique
|
57
|
-
|
51
|
+
@@files.flatten!
|
52
|
+
|
58
53
|
end
|
59
54
|
|
60
55
|
def self.remove_non_audio_files
|
@@ -62,7 +57,7 @@ module IceMaker
|
|
62
57
|
verbalize "#{@@files.length} total files found."
|
63
58
|
|
64
59
|
@@files.reject! { |file|
|
65
|
-
!(
|
60
|
+
!(ALLOWED_MEDIA_EXTENSIONS.include? (File.extname file).downcase) || (File.directory? file )
|
66
61
|
}
|
67
62
|
|
68
63
|
verbalize "#{@@files.length} audio files found."
|
@@ -116,17 +111,15 @@ module IceMaker
|
|
116
111
|
|
117
112
|
class Icefile
|
118
113
|
|
119
|
-
attr_accessor :sources, :is_recursive, :
|
120
|
-
:output_to_file, :arbitrary_file_prefix, :filters, :formatter
|
114
|
+
attr_accessor :sources, :is_recursive, :verbose, :output_to_file, :filters, :formatter
|
121
115
|
|
122
116
|
def initialize
|
123
117
|
@sources = []
|
124
118
|
@filters = []
|
125
|
-
@verbose =
|
126
|
-
@is_recursive =
|
127
|
-
@
|
128
|
-
@
|
129
|
-
@formatter = lambda { |track| "#{track[:file]}"}
|
119
|
+
@verbose = DEFAULT_VERBOSE_VALUE
|
120
|
+
@is_recursive = DEFAULT_RECURSIVE_VALUE
|
121
|
+
@formatter = DEFAULT_FORMATTER
|
122
|
+
@output_to_file = DEFAULT_PLAYLIST_FILE
|
130
123
|
end
|
131
124
|
end
|
132
125
|
end
|
data/lib/icemaker/query.rb
CHANGED
data/lib/icemaker/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: icemaker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- twocats
|
@@ -80,6 +80,7 @@ files:
|
|
80
80
|
- README.md
|
81
81
|
- Rakefile
|
82
82
|
- bin/icemaker
|
83
|
+
- examples/Icefile
|
83
84
|
- icemaker.gemspec
|
84
85
|
- lib/icemaker.rb
|
85
86
|
- lib/icemaker/filter.rb
|