apple_music_library 0.9.0 → 0.12.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
  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