apple_music_library 0.7.0 → 0.10.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: be251230181d53ca2f311d1b3fe47f60773c16300f3c7c115761e98bfa8da47b
4
- data.tar.gz: e0ebe21930daf26dacca4d16e4ff94f5fad36da8a2e07e06ae4fa8b94ef7d721
3
+ metadata.gz: b67a41ade93ef2a93fb61db6496506bfd4bb57f6df952c7b3c57f91474116fdc
4
+ data.tar.gz: '068639ed7660feb425b667394861d5f295b0f4a211c6cb6c4c2bf4334357649e'
5
5
  SHA512:
6
- metadata.gz: a9ddddc083a2d4621110b304d32474fc1164471c67ec3c671a33ae5cbe40bc51ce6bb23b51c7a930d456fd9c8f33300dbd67b39e553ecf15558a3ae54515e774
7
- data.tar.gz: 1b08775b63e98f7e1eae53c6caa2ec5f6dbed16ba4b2c97df5ee41dfa8b836116ef58cf370b3b689485bad38d31e151f8dae732b337798d74dd5b6c172b94f9c
6
+ metadata.gz: 62eaabf37c4288bf1dc65fd00ce39b7bd944882c647043cb79df6b5340461109e959e80016d98e74800d170e9f66bc15aa05c01cd887aba3d068366682f5b01f
7
+ data.tar.gz: d8b7ed8641d329c4f33d3aedd0fd2262d021e817ca02aa2bb2d2994c1e91993ab9d9210eb1fd7202dc3b1bd7d6716212daa3d63620b65ed7ed26d5fa865913b8
data/CHANGELOG.md CHANGED
@@ -3,6 +3,20 @@
3
3
  ## [Unreleased]
4
4
  - Ability to print out playlist folder hierarchy
5
5
 
6
+ ## 0.10.0 - 2022-03-15
7
+ ### Fixed
8
+ - Fixed incorrect handling of tracks when added to track collections
9
+ ### Added
10
+ - Added Year model to retrieve tracks and track counts per year of release
11
+
12
+ ## 0.9.0 - 2022-03-15
13
+ ### Added
14
+ - Ability to get genres associated with an artist
15
+
16
+ ## 0.8.0 - 2022-03-13
17
+ ### Added
18
+ - Ability to sort artists by track count and album count
19
+
6
20
  ## 0.7.0 - 2022-03-12
7
21
  ### Added
8
22
  - Average star ratings for track collectsion (albums, playlists, genres)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- apple_music_library (0.7.0)
4
+ apple_music_library (0.10.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
 
@@ -56,10 +61,27 @@ library.artists(:most_played).each do |artist|
56
61
  puts "#{artist.play_count} :: #{artist.name}"
57
62
  end
58
63
 
64
+ # List out artists with the most tracks
65
+ library.artists(:most_tracks).each do |artist|
66
+ puts "#{artist.track_count} :: #{artist.name}"
67
+ end
68
+
69
+ # List out artists with the most albums
70
+ library.artists(:most_albums).each do |artist|
71
+ puts "#{artist.album_count} :: #{artist.name}"
72
+ end
73
+
59
74
  # Display track counts per genre
60
75
  library.genres.each do |genre|
61
- 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}"
62
82
  end
83
+
84
+
63
85
  ```
64
86
  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`.
65
87
 
@@ -4,14 +4,10 @@ module AppleMusicLibrary
4
4
  class Album < TrackCollection
5
5
  attr_reader :artist
6
6
 
7
-
8
- attr_reader :artist
9
-
10
7
  @@albums = {}
11
8
 
12
- def initialize(artist, album_name)
9
+ def initialize(album_name, artist)
13
10
  @artist = artist
14
- @album_name = album_name
15
11
  super
16
12
  end
17
13
 
@@ -24,7 +20,7 @@ module AppleMusicLibrary
24
20
  if @@albums[key]
25
21
  return @@albums[key]
26
22
  end
27
- @@albums[key] = self.new(artist, album_name)
23
+ @@albums[key] = self.new(album_name, artist)
28
24
  end
29
25
 
30
26
  def id
@@ -46,5 +42,9 @@ module AppleMusicLibrary
46
42
  end
47
43
  end
48
44
 
45
+ def self.token
46
+ :album
47
+ end
48
+
49
49
  end
50
50
  end
@@ -16,11 +16,15 @@ module AppleMusicLibrary
16
16
  end
17
17
 
18
18
  def self.most_played(limit = 20)
19
- if limit.nil?
20
- self.all.sort_by(&:play_count).reverse
21
- else
22
- self.all.sort_by(&:play_count).reverse.take(limit)
23
- end
19
+ self.sorted_set(:play_count, limit)
20
+ end
21
+
22
+ def self.most_tracks(limit = 20)
23
+ self.sorted_set(:track_count, limit)
24
+ end
25
+
26
+ def self.most_albums(limit = 20)
27
+ self.sorted_set(:album_count, limit)
24
28
  end
25
29
 
26
30
  def self.find_or_create(name)
@@ -53,13 +57,34 @@ module AppleMusicLibrary
53
57
  @albums.sort_by(&:year)
54
58
  end
55
59
 
60
+ def album_count
61
+ @albums.size
62
+ end
63
+
56
64
  def tracks
57
65
  @tracks
58
66
  end
59
67
 
68
+ def track_count
69
+ @tracks.size
70
+ end
71
+
60
72
  def play_count
61
73
  tracks.map(&:play_count).sum
62
74
  end
63
75
 
76
+ def genres
77
+ @genres ||= tracks.map(&:genre).uniq
78
+ end
79
+
80
+ protected
81
+
82
+ def self.sorted_set(sort_by_method, limit)
83
+ if limit.nil?
84
+ self.all.sort_by{|a| a.send(sort_by_method)}.reverse
85
+ else
86
+ self.all.sort_by{|a| a.send(sort_by_method)}.reverse.take(limit)
87
+ end
88
+ end
64
89
  end
65
90
  end
@@ -1,28 +1,8 @@
1
1
  module AppleMusicLibrary
2
2
  class Genre < TrackCollection
3
3
 
4
- attr_reader :name
5
-
6
- @@genres = {}
7
-
8
- def initialize(name)
9
- @name = name
10
- super
11
- end
12
-
13
- def self.all
14
- @@genres.values
15
- end
16
-
17
- def self.find_or_create(name)
18
- if @@genres[name]
19
- return @@genres[name]
20
- end
21
- @@genres[name] = self.new(name)
22
- end
23
-
24
- def self.find_by_name(name)
25
- @@genres[name]
4
+ def self.token
5
+ :genre
26
6
  end
27
7
 
28
8
  end
@@ -4,6 +4,7 @@ require_relative 'genre'
4
4
  require_relative 'playlist'
5
5
  require_relative 'playlist_folder'
6
6
  require_relative 'track'
7
+ require_relative 'year'
7
8
  require_relative "utils"
8
9
  require 'plist'
9
10
 
@@ -84,6 +85,10 @@ module AppleMusicLibrary
84
85
  Track.find(track_id)
85
86
  end
86
87
 
88
+ def years
89
+ @years ||= Year.all
90
+ end
91
+
87
92
  def valid?
88
93
  has_tracks?
89
94
  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,11 @@ 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
+ end
50
+
46
51
  @artist.add_track(self)
47
52
  @artist.add_album(@album)
48
53
  @album.add_track(self)
@@ -79,6 +84,10 @@ module AppleMusicLibrary
79
84
  @info['Genre']
80
85
  end
81
86
 
87
+ def year_name
88
+ @info['Year']
89
+ end
90
+
82
91
  def star_rating
83
92
  rating / 20
84
93
  end
@@ -1,16 +1,48 @@
1
1
  module AppleMusicLibrary
2
2
  class TrackCollection
3
3
 
4
- attr_reader :tracks
4
+ attr_reader :name, :tracks
5
5
 
6
- def initialize(*args)
6
+ @@track_collections = {}
7
+
8
+ def initialize(name, *args)
7
9
  @tracks = []
10
+ @name = name.present? ? name : 'Unknown'
11
+ end
12
+
13
+ def self.all
14
+ @@track_collections[token].values
15
+ end
16
+
17
+ def self.find_by_name(lookup_name)
18
+ @@track_collections[token][lookup_name]
19
+ end
20
+
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}"
26
+ unless @@track_collections[token]
27
+ @@track_collections[token] = {}
28
+ end
29
+ if @@track_collections[token][lookup_name]
30
+ # puts "FOUND"
31
+ return @@track_collections[token][lookup_name]
32
+ end
33
+ # puts "CREATING"
34
+ @@track_collections[token][lookup_name] = self.new(lookup_name)
8
35
  end
9
36
 
10
37
  def add_track(track)
38
+ # puts "Adding #{track.name} to #{self.class.token} #{name}"
11
39
  @tracks << track
12
40
  end
13
41
 
42
+ def track_count
43
+ @track_count ||= tracks.count
44
+ end
45
+
14
46
  def star_rating
15
47
  return nil if rated_tracks.empty?
16
48
  rated_tracks.map(&:star_rating).sum / rated_tracks.size
@@ -22,5 +54,6 @@ module AppleMusicLibrary
22
54
  @rated_tracks ||= tracks.select{|t| t.rated?}
23
55
  end
24
56
 
57
+
25
58
  end
26
59
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppleMusicLibrary
4
- VERSION = "0.7.0"
4
+ VERSION = "0.10.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.7.0
4
+ version: 0.10.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-12 00:00:00.000000000 Z
11
+ date: 2022-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print
@@ -134,6 +134,7 @@ files:
134
134
  - lib/apple_music_library/track_collection.rb
135
135
  - lib/apple_music_library/utils.rb
136
136
  - lib/apple_music_library/version.rb
137
+ - lib/apple_music_library/year.rb
137
138
  - sig/apple_music_library.rbs
138
139
  homepage: https://github.com/pugetive/apple_music_library
139
140
  licenses: