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 +4 -4
- data/CHANGELOG.md +14 -0
- data/Gemfile.lock +1 -1
- data/README.md +37 -1
- data/lib/apple_music_library/album.rb +4 -0
- data/lib/apple_music_library/decade.rb +25 -0
- data/lib/apple_music_library/genre.rb +3 -0
- data/lib/apple_music_library/library.rb +16 -9
- data/lib/apple_music_library/playlist.rb +16 -0
- data/lib/apple_music_library/track.rb +12 -0
- data/lib/apple_music_library/track_collection.rb +15 -8
- data/lib/apple_music_library/version.rb +1 -1
- data/lib/apple_music_library/year.rb +20 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd3e0f399519af81aa6cbcfe2b93ac6e1b46aed6c3bae8a3e7ececb38da228fa
|
4
|
+
data.tar.gz: 513c9a28c7ee88d54f4eac8775b8b521ea5809cd58f9e5dca88218c3cdddb69b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
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
|
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
|
|
@@ -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,10 +1,4 @@
|
|
1
|
-
|
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
|
-
|
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
|
@@ -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.
|
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-
|
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.
|
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
|