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
         
     |