apple_music_library 0.9.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d57d33d85a24895e93ca386313d43fe9dd28c6a48bec21fbb4348ec3b168a177
4
- data.tar.gz: d3d0b25dbd54fa23f03cea03b46729224d9b1054da276060a62cac40ab0016e3
3
+ metadata.gz: bd3e0f399519af81aa6cbcfe2b93ac6e1b46aed6c3bae8a3e7ececb38da228fa
4
+ data.tar.gz: 513c9a28c7ee88d54f4eac8775b8b521ea5809cd58f9e5dca88218c3cdddb69b
5
5
  SHA512:
6
- metadata.gz: 319fb967951a32d12f0d871c32d40b56a2c4d674bbb8966de6bf6b592da5b5ed0af41f9443caf2b7b222345ded89264af85bdf75694856a8ed7e37162ab706f1
7
- data.tar.gz: 148f0638affc3d19f1c96619e732280966574885fce0c66acc69e083d0cd569200e2a8535f75f96e8ef06b75fdee07b6f0ca82befd0ab8a4bcf914b86af2fff5
6
+ metadata.gz: cae55ca54cc8b379482da24e8d11f67c4b53c3d7735ac2e14d85930e3be5e4cc5fbef6e4b369799fd97d28941545093af5d39078a18010625d0550effa9cfbec
7
+ data.tar.gz: c8cd1e2cd3800896d2f76e7fd0576199f03f962fe5db1957758be9208f790a3222a9cfd2632de49e56bb8898ea7a184d5eba88a5c262234598e82aad1de33df7
data/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  ## [Unreleased]
4
4
  - Ability to print out playlist folder hierarchy
5
5
 
6
+ ## 0.12.0 - 2022-03-26
7
+ ### Added
8
+ - Added handling for smart versus regular playlists
9
+
10
+ ## 0.11.0 - 2022-03-19
11
+ ### Added
12
+ - Added Decade model to retrieve track and album info per decade
13
+
14
+ ## 0.10.0 - 2022-03-16
15
+ ### Fixed
16
+ - Fixed incorrect handling of tracks when added to track collections
17
+ ### Added
18
+ - Added Year model to retrieve tracks and track counts per year of release
19
+
6
20
  ## 0.9.0 - 2022-03-15
7
21
  ### Added
8
22
  - Ability to get genres associated with an artist
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- apple_music_library (0.9.0)
4
+ apple_music_library (0.12.0)
5
5
  facets (~> 3.1)
6
6
  plist (~> 3.6)
7
7
 
data/README.md CHANGED
@@ -32,12 +32,28 @@ library = AppleMusicLibrary.new('path/to/Library.xml')
32
32
  # Count albums
33
33
  puts library.albums.count
34
34
 
35
- # Show playlist inside playlist folder
35
+ # Show playlists contained in a playlist folder
36
36
  playlist_folder = library.playlist_folder('Folder for Testing')
37
37
  playlist_folder.playlists.each do |playlist|
38
38
  puts playlist.name
39
39
  end
40
40
 
41
+ # List all playlists
42
+ library.playlists.each do |playlist|
43
+ puts playlist.name
44
+ end
45
+
46
+ # List only 'smart' playlists
47
+ library.playlists(:smart).each do |playlist|
48
+ puts playlist.name
49
+ end
50
+
51
+ # List all regular (not 'smart') playlists
52
+ library.playlists(:regular).each do |playlist|
53
+ puts playlist.name
54
+ end
55
+
56
+
41
57
  # Show tracks in a specific playlist
42
58
  playlist = library.playlist('XTC Favorites')
43
59
  playlist.tracks.each do |track|
@@ -76,6 +92,26 @@ library.genres.each do |genre|
76
92
  puts "#{genre.track_count} #{genre.name}"
77
93
  end
78
94
 
95
+ # Display track counts per year
96
+ library.years.each do |year|
97
+ puts "#{year.track_count} #{year.name}"
98
+ end
99
+
100
+ # Display track counts per decade
101
+ library.decades.each do |decade|
102
+ puts "#{decade.track_count} #{decade.name}"
103
+ end
104
+
105
+ # Print a report on all decades in the library
106
+ # e.g.
107
+ # 1970-1979 - 336 tracks on 10 albums
108
+ # 1980-1989 - 816 tracks on 16 albums
109
+ # 1990-1999 - 300 tracks on 8 albums
110
+ # 2000-2009 - 110 tracks on 5 albums
111
+ library.decades_report
112
+
113
+
114
+
79
115
  ```
80
116
  All stored attributes are available via snake_cased methods on `Track` and `Playlist`. However, note that `#artist`, `#album`, and `#genre` are special cases, returning Ruby objects rather than their associated string values. Methods to return the string versions of these track attributes are provided as `track.artist_name`, `track.album_name`, and `track.genre_name`.
81
117
 
@@ -42,5 +42,9 @@ module AppleMusicLibrary
42
42
  end
43
43
  end
44
44
 
45
+ def self.token
46
+ :album
47
+ end
48
+
45
49
  end
46
50
  end
@@ -0,0 +1,25 @@
1
+ require_relative 'track_collection'
2
+
3
+ module AppleMusicLibrary
4
+ class Decade < TrackCollection
5
+
6
+ def self.report
7
+ self.all.sort_by{|d| d.name}.each do |decade|
8
+ puts "#{decade.name} - #{decade.track_count} tracks on #{decade.album_count} albums"
9
+ end
10
+ end
11
+
12
+ def self.find_or_create_for(year_name)
13
+ decade_start_year = year_name.to_i - (year_name.to_i % 10)
14
+ decade_stop_year = decade_start_year + 9
15
+ decade_name = "#{decade_start_year}-#{decade_stop_year}"
16
+
17
+ self.find_or_create(decade_name)
18
+ end
19
+
20
+ def self.token
21
+ :decade
22
+ end
23
+
24
+ end
25
+ end
@@ -1,6 +1,9 @@
1
1
  module AppleMusicLibrary
2
2
  class Genre < TrackCollection
3
3
 
4
+ def self.token
5
+ :genre
6
+ end
4
7
 
5
8
  end
6
9
  end
@@ -1,10 +1,4 @@
1
- require_relative 'album'
2
- require_relative 'artist'
3
- require_relative 'genre'
4
- require_relative 'playlist'
5
- require_relative 'playlist_folder'
6
- require_relative 'track'
7
- require_relative "utils"
1
+ Dir[File.join(__dir__, '.', '*.rb')].each { |file| require file }
8
2
  require 'plist'
9
3
 
10
4
  module AppleMusicLibrary
@@ -60,8 +54,9 @@ module AppleMusicLibrary
60
54
  Genre.find_by_name(genre_name)
61
55
  end
62
56
 
63
- def playlists
64
- @playlists ||= Playlist.all
57
+ def playlists(filter = nil)
58
+ return Playlist.all unless filter
59
+ Playlist.send(filter)
65
60
  end
66
61
 
67
62
  def playlist(playlist_name)
@@ -84,6 +79,18 @@ module AppleMusicLibrary
84
79
  Track.find(track_id)
85
80
  end
86
81
 
82
+ def years
83
+ @years ||= Year.all
84
+ end
85
+
86
+ def decades
87
+ @decades ||= Decade.all
88
+ end
89
+
90
+ def decades_report
91
+ Decade.report
92
+ end
93
+
87
94
  def valid?
88
95
  has_tracks?
89
96
  end
@@ -37,6 +37,14 @@ module AppleMusicLibrary
37
37
  @@playlists.values
38
38
  end
39
39
 
40
+ def self.smart
41
+ @@playlists.values.select{|p| p.smart?}
42
+ end
43
+
44
+ def self.regular
45
+ @@playlists.values.select{|p| !p.smart?}
46
+ end
47
+
40
48
  def self.find_by_name(playlist_name)
41
49
  results = @@playlists.values.select{|p| p.name == playlist_name}
42
50
  if results.size == 1
@@ -59,6 +67,14 @@ module AppleMusicLibrary
59
67
  folder.present?
60
68
  end
61
69
 
70
+ def smart?
71
+ smart_info.present?
72
+ end
73
+
74
+ def token
75
+ :playlist
76
+ end
77
+
62
78
  private
63
79
 
64
80
  def load_tracks
@@ -43,6 +43,14 @@ module AppleMusicLibrary
43
43
  # end
44
44
  @genre = Genre.find_or_create(genre_name)
45
45
 
46
+ if year_name.present?
47
+ @year = Year.find_or_create(year_name)
48
+ @year.add_track(self)
49
+
50
+ @decade = Decade.find_or_create_for(year_name)
51
+ @decade.add_track(self)
52
+ end
53
+
46
54
  @artist.add_track(self)
47
55
  @artist.add_album(@album)
48
56
  @album.add_track(self)
@@ -79,6 +87,10 @@ module AppleMusicLibrary
79
87
  @info['Genre']
80
88
  end
81
89
 
90
+ def year_name
91
+ @info['Year']
92
+ end
93
+
82
94
  def star_rating
83
95
  rating / 20
84
96
  end
@@ -7,7 +7,7 @@ module AppleMusicLibrary
7
7
 
8
8
  def initialize(name, *args)
9
9
  @tracks = []
10
- @name = name
10
+ @name = name.present? ? name : 'Unknown'
11
11
  end
12
12
 
13
13
  def self.all
@@ -19,13 +19,23 @@ module AppleMusicLibrary
19
19
  end
20
20
 
21
21
  def self.find_or_create(lookup_name)
22
+ if lookup_name.blank?
23
+ lookup_name = 'Unknown'
24
+ end
25
+ # puts "Finding or creating #{token}: #{lookup_name}"
22
26
  unless @@track_collections[token]
23
27
  @@track_collections[token] = {}
24
28
  end
29
+ if @@track_collections[token][lookup_name]
30
+ # puts "FOUND"
31
+ return @@track_collections[token][lookup_name]
32
+ end
33
+ # puts "CREATING"
25
34
  @@track_collections[token][lookup_name] = self.new(lookup_name)
26
35
  end
27
36
 
28
37
  def add_track(track)
38
+ # puts "Adding #{track.name} to #{self.class.token} #{name}"
29
39
  @tracks << track
30
40
  end
31
41
 
@@ -33,6 +43,10 @@ module AppleMusicLibrary
33
43
  @track_count ||= tracks.count
34
44
  end
35
45
 
46
+ def album_count
47
+ @ablum_count ||= tracks.map(&:album).uniq.count
48
+ end
49
+
36
50
  def star_rating
37
51
  return nil if rated_tracks.empty?
38
52
  rated_tracks.map(&:star_rating).sum / rated_tracks.size
@@ -44,13 +58,6 @@ module AppleMusicLibrary
44
58
  @rated_tracks ||= tracks.select{|t| t.rated?}
45
59
  end
46
60
 
47
- def self.token
48
- self.class.name
49
- end
50
-
51
- def token
52
- self.class.token
53
- end
54
61
 
55
62
  end
56
63
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppleMusicLibrary
4
- VERSION = "0.9.0"
4
+ VERSION = "0.12.0"
5
5
  end
@@ -0,0 +1,20 @@
1
+ require_relative 'track_collection'
2
+
3
+ module AppleMusicLibrary
4
+ class Year < TrackCollection
5
+
6
+ def self.dump
7
+ self.all.sort_by{|y| y.name}.each do |year|
8
+ puts "#{year.name} - #{year.track_count} tracks"
9
+ # year.tracks.each do |track|
10
+ # puts "\t#{track.name}"
11
+ # end
12
+ end
13
+ end
14
+
15
+ def self.token
16
+ :year
17
+ end
18
+
19
+ end
20
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: apple_music_library
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Todd Gehman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-03-15 00:00:00.000000000 Z
11
+ date: 2022-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print
@@ -126,6 +126,7 @@ files:
126
126
  - lib/apple_music_library.rb
127
127
  - lib/apple_music_library/album.rb
128
128
  - lib/apple_music_library/artist.rb
129
+ - lib/apple_music_library/decade.rb
129
130
  - lib/apple_music_library/genre.rb
130
131
  - lib/apple_music_library/library.rb
131
132
  - lib/apple_music_library/playlist.rb
@@ -134,6 +135,7 @@ files:
134
135
  - lib/apple_music_library/track_collection.rb
135
136
  - lib/apple_music_library/utils.rb
136
137
  - lib/apple_music_library/version.rb
138
+ - lib/apple_music_library/year.rb
137
139
  - sig/apple_music_library.rbs
138
140
  homepage: https://github.com/pugetive/apple_music_library
139
141
  licenses:
@@ -157,7 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
157
159
  - !ruby/object:Gem::Version
158
160
  version: '0'
159
161
  requirements: []
160
- rubygems_version: 3.3.9
162
+ rubygems_version: 3.3.3
161
163
  signing_key:
162
164
  specification_version: 4
163
165
  summary: Provides a Ruby interface to the information stored in an Apple Music (formerly