apple_music_library 0.8.0 → 0.11.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: 5c00fde335b53ca8bacdd13bdbce297b0bea1a7f5f4453f4c42bbe9c867b6c02
4
- data.tar.gz: cec158953268525e8142c5a51960d0b79584e646c4e16def0fb2e71cd66b2b7e
3
+ metadata.gz: 7b345adc65b1d7e12d09e6a7019a857b8abd77ae831420d92e33266b0106fd61
4
+ data.tar.gz: a372d17051416b41edfd62095b5f09b35bd0ca580dffbf545650caac9c0283c8
5
5
  SHA512:
6
- metadata.gz: debab2473712160521d5bc793b65e3febd984620f53d060e3864285bcb906119b074d645c678fcb4e865ea23ae90b6005eff4ccc89c26a3cfb0d91b556f26199
7
- data.tar.gz: 47e7b6381f4d94afda90441cdd975fed9ba6afc6ff09de115e0cd0a1144b0bd9b3582cec0f5f736d394308d6537b5f3e31bba407cde5496b7ace6b5cc59ee6b6
6
+ metadata.gz: 1261413cf1b0583017abcc2189f986927820a67faa1d970e70fbe42e4ecf27bfa41adaf3599829f210cbfd5f12b1dda8c544f935405a43dced50f8349f2d7a28
7
+ data.tar.gz: 1cda8031165413f399bfa1eeaf58187063435f0a5598cf190b11cabc3785d7a45f0ce99d356e3176aad894ba48bcbb911cc183254ff821c136807bb669db867a
data/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  ## [Unreleased]
4
4
  - Ability to print out playlist folder hierarchy
5
5
 
6
+ ## 0.11.0 - 2022-03-19
7
+ ### Added
8
+ - Added Decade model to retrieve track and album info per decade
9
+
10
+ ## 0.10.0 - 2022-03-16
11
+ ### Fixed
12
+ - Fixed incorrect handling of tracks when added to track collections
13
+ ### Added
14
+ - Added Year model to retrieve tracks and track counts per year of release
15
+
16
+ ## 0.9.0 - 2022-03-15
17
+ ### Added
18
+ - Ability to get genres associated with an artist
19
+
6
20
  ## 0.8.0 - 2022-03-13
7
21
  ### Added
8
22
  - Ability to sort artists by track count and album count
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- apple_music_library (0.8.0)
4
+ apple_music_library (0.11.0)
5
5
  facets (~> 3.1)
6
6
  plist (~> 3.6)
7
7
 
data/README.md CHANGED
@@ -44,10 +44,15 @@ playlist.tracks.each do |track|
44
44
  puts track.name
45
45
  end
46
46
 
47
- # Count tracks by artist
47
+ # Count tracks by an artist
48
48
  artist = library.artist('XTC')
49
49
  puts artist.tracks.count
50
50
 
51
+ # List genres associated with the artist
52
+ artist.genres.each do |genre|
53
+ puts genre.name
54
+ end
55
+
51
56
  # Get favorite tracks by this artist
52
57
  favorite_tracks = artist.tracks.select{|t| t.loved? || t.star_rating > 3}
53
58
 
@@ -68,8 +73,29 @@ end
68
73
 
69
74
  # Display track counts per genre
70
75
  library.genres.each do |genre|
71
- puts "#{genre.tracks.count} #{genre.name}"
76
+ puts "#{genre.track_count} #{genre.name}"
77
+ end
78
+
79
+ # Display track counts per year
80
+ library.years.each do |year|
81
+ puts "#{year.track_count} #{year.name}"
82
+ end
83
+
84
+ # Display track counts per decade
85
+ library.decades.each do |decade|
86
+ puts "#{decade.track_count} #{decade.name}"
72
87
  end
88
+
89
+ # Print a report on all decades in the library
90
+ # e.g.
91
+ # 1990-1999 - 7217 tracks on 1030 albums
92
+ # 2000-2009 - 9083 tracks on 1876 albums
93
+ # 2010-2019 - 4729 tracks on 1046 albums
94
+ # 2020-2029 - 1074 tracks on 455 albums
95
+ library.decades_report
96
+
97
+
98
+
73
99
  ```
74
100
  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`.
75
101
 
@@ -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
@@ -73,6 +73,10 @@ module AppleMusicLibrary
73
73
  tracks.map(&:play_count).sum
74
74
  end
75
75
 
76
+ def genres
77
+ @genres ||= tracks.map(&:genre).uniq
78
+ end
79
+
76
80
  protected
77
81
 
78
82
  def self.sorted_set(sort_by_method, limit)
@@ -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
@@ -84,6 +78,18 @@ module AppleMusicLibrary
84
78
  Track.find(track_id)
85
79
  end
86
80
 
81
+ def years
82
+ @years ||= Year.all
83
+ end
84
+
85
+ def decades
86
+ @decades ||= Decade.all
87
+ end
88
+
89
+ def decades_report
90
+ Decade.report
91
+ end
92
+
87
93
  def valid?
88
94
  has_tracks?
89
95
  end
@@ -59,6 +59,10 @@ module AppleMusicLibrary
59
59
  folder.present?
60
60
  end
61
61
 
62
+ def token
63
+ :playlist
64
+ end
65
+
62
66
  private
63
67
 
64
68
  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,16 +19,34 @@ 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
 
42
+ def track_count
43
+ @track_count ||= tracks.count
44
+ end
45
+
46
+ def album_count
47
+ @ablum_count ||= tracks.map(&:album).uniq.count
48
+ end
49
+
32
50
  def star_rating
33
51
  return nil if rated_tracks.empty?
34
52
  rated_tracks.map(&:star_rating).sum / rated_tracks.size
@@ -40,13 +58,6 @@ module AppleMusicLibrary
40
58
  @rated_tracks ||= tracks.select{|t| t.rated?}
41
59
  end
42
60
 
43
- def self.token
44
- self.class.name
45
- end
46
-
47
- def token
48
- self.class.token
49
- end
50
61
 
51
62
  end
52
63
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppleMusicLibrary
4
- VERSION = "0.8.0"
4
+ VERSION = "0.11.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.8.0
4
+ version: 0.11.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-13 00:00:00.000000000 Z
11
+ date: 2022-03-19 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: