Class: Kagu::Tracks

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/kagu/tracks.rb

Constant Summary collapse

EXTENSIONS =
%w(.aac .flac .mp3 .wav).freeze

Instance Method Summary collapse

Instance Method Details

#eachObject



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/kagu/tracks.rb', line 9

def each
  return unless block_given?
  Kagu.logger.debug('Kagu') { 'Loading library tracks' }
  attributes = {}
  SwiftHelper.execute("
    import iTunesLibrary

    func printObjectProperty<T: Encodable>(name: String, value: T?) {
      let jsonEncoder = JSONEncoder()
      let jsonData = try! jsonEncoder.encode(value)
      let json = String(data: jsonData, encoding: String.Encoding.utf8)
      print(\"\\(name)=\\(json!)\")
    }

    let library = try! ITLibrary(apiVersion: \"1\")
    for track in library.allMediaItems.filter({ $0.mediaKind == ITLibMediaItemMediaKind.kindSong }) {
      print(\"BEGIN_TRACK\")
      printObjectProperty(name: \"added_at\", value: track.addedDate!.timeIntervalSince1970)
      printObjectProperty(name: \"album\", value: track.album.title)
      printObjectProperty(name: \"artist\", value: track.artist!.name)
      printObjectProperty(name: \"bpm\", value: track.beatsPerMinute)
      printObjectProperty(name: \"genre\", value: track.genre)
      printObjectProperty(name: \"id\", value: String(track.persistentID.uint64Value, radix: 16).uppercased())
      printObjectProperty(name: \"length\", value: track.totalTime)
      printObjectProperty(name: \"path\", value: track.location)
      printObjectProperty(name: \"title\", value: track.title)
      printObjectProperty(name: \"year\", value: track.year)
      print(\"END_TRACK\")
    }
  ").each do |line|
    if line == 'BEGIN_TRACK'
      attributes = {}
    elsif line == 'END_TRACK'
      yield(Track.new(attributes))
    elsif (match = /(^\w+)=(.*)/.match(line))
      attributes[match[1]] = JSON.parse(match[2])
    end
  end
  nil
end