apple_music_library 0.4.0 → 0.7.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: 90fcf6cf83ff9c5cf4bf0cf022ad5b4038c0464277a86e20c658580661cb233a
4
- data.tar.gz: 3498457024ed7a40644dc14baa9eccb7b1f072e92d28f7739cf49959c86d90ea
3
+ metadata.gz: be251230181d53ca2f311d1b3fe47f60773c16300f3c7c115761e98bfa8da47b
4
+ data.tar.gz: e0ebe21930daf26dacca4d16e4ff94f5fad36da8a2e07e06ae4fa8b94ef7d721
5
5
  SHA512:
6
- metadata.gz: 86f0e0d87e57d27a93034f0b055399c37c2a265984726eba7b1dc2e6ddd15a2ebb34a11676c64411417e772320ec170bad7b52eb91c35f703a9cd6286c923a74
7
- data.tar.gz: 4ebe190007f3e9426dfe6968b61934cea5bc23e63cb72d4a824de9ff5a97061abd27b9dc91639c4af8492f438d04623338581a5c99697dbb920cbc1f89d6af19
6
+ metadata.gz: a9ddddc083a2d4621110b304d32474fc1164471c67ec3c671a33ae5cbe40bc51ce6bb23b51c7a930d456fd9c8f33300dbd67b39e553ecf15558a3ae54515e774
7
+ data.tar.gz: 1b08775b63e98f7e1eae53c6caa2ec5f6dbed16ba4b2c97df5ee41dfa8b836116ef58cf370b3b689485bad38d31e151f8dae732b337798d74dd5b6c172b94f9c
data/CHANGELOG.md CHANGED
@@ -3,7 +3,19 @@
3
3
  ## [Unreleased]
4
4
  - Ability to print out playlist folder hierarchy
5
5
 
6
- ## 0.4.0 - 2022-03-10
6
+ ## 0.7.0 - 2022-03-12
7
+ ### Added
8
+ - Average star ratings for track collectsion (albums, playlists, genres)
9
+
10
+ ## 0.6.0 - 2022-03-11
11
+ ### Added
12
+ - Ability to list top artists by play count
13
+
14
+ ## 0.5.0 - 2022-03-11
15
+ ### Added
16
+ - Basic functionality for track ratings via the #rating, #star_rating, and #loved
17
+
18
+ ## 0.4.0 - 2022-03-11
7
19
  ### Added
8
20
  - Basic functionality for Playlist Folders
9
21
  ### Fixed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- apple_music_library (0.4.0)
4
+ apple_music_library (0.7.0)
5
5
  facets (~> 3.1)
6
6
  plist (~> 3.6)
7
7
 
data/README.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  The `apple_music_library` gem offeres a ruby interface to the information stored in an iTunes / Apple Muisic `Library.xml` file, as can be generated with the app's menu option `File > Library > Export Library...`
4
4
 
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/86a57ad0904e4358dd02/maintainability)](https://codeclimate.com/github/pugetive/apple_music_library/maintainability)
6
+
7
+
8
+
5
9
  ## Installation
6
10
 
7
11
  Add this line to your application's Gemfile:
@@ -44,6 +48,14 @@ end
44
48
  artist = library.artist('XTC')
45
49
  puts artist.tracks.count
46
50
 
51
+ # Get favorite tracks by this artist
52
+ favorite_tracks = artist.tracks.select{|t| t.loved? || t.star_rating > 3}
53
+
54
+ # List out the most played artists
55
+ library.artists(:most_played).each do |artist|
56
+ puts "#{artist.play_count} :: #{artist.name}"
57
+ end
58
+
47
59
  # Display track counts per genre
48
60
  library.genres.each do |genre|
49
61
  puts "#{genre.tracks.count} #{genre.name}"
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
 
19
19
  spec.metadata["homepage_uri"] = spec.homepage
20
20
  spec.metadata["source_code_uri"] = "https://github.com/pugetive/apple_music_library"
21
- # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
21
+ spec.metadata["changelog_uri"] = "https://github.com/pugetive/apple_music_library/blob/main/CHANGELOG.md"
22
22
 
23
23
  # Specify which files should be added to the gem when it is released.
24
24
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -1,16 +1,18 @@
1
+ require_relative 'track_collection'
2
+
1
3
  module AppleMusicLibrary
2
- class Album
4
+ class Album < TrackCollection
3
5
  attr_reader :artist
4
6
 
5
7
 
6
- attr_reader :artist, :album_name, :tracks
8
+ attr_reader :artist
7
9
 
8
10
  @@albums = {}
9
11
 
10
12
  def initialize(artist, album_name)
11
13
  @artist = artist
12
14
  @album_name = album_name
13
- @tracks = []
15
+ super
14
16
  end
15
17
 
16
18
  def self.all
@@ -29,13 +31,20 @@ module AppleMusicLibrary
29
31
  "#{artist.name}-#{album_name}"
30
32
  end
31
33
 
32
- def add_track(track)
33
- @tracks << track
34
+ def name
35
+ @album_name
34
36
  end
35
37
 
36
38
  def year
37
39
  @year ||= @tracks.sort_by(&:year).last.year
38
40
  end
39
41
 
42
+ def dump
43
+ puts "#{artist.name} - #{name}"
44
+ tracks.each do |track|
45
+ puts "\t#{track.name}"
46
+ end
47
+ end
48
+
40
49
  end
41
50
  end
@@ -15,6 +15,14 @@ module AppleMusicLibrary
15
15
  @@artists.values
16
16
  end
17
17
 
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
24
+ end
25
+
18
26
  def self.find_or_create(name)
19
27
  if @@artists[name]
20
28
  return @@artists[name]
@@ -49,5 +57,9 @@ module AppleMusicLibrary
49
57
  @tracks
50
58
  end
51
59
 
60
+ def play_count
61
+ tracks.map(&:play_count).sum
62
+ end
63
+
52
64
  end
53
65
  end
@@ -1,13 +1,13 @@
1
1
  module AppleMusicLibrary
2
- class Genre
2
+ class Genre < TrackCollection
3
3
 
4
- attr_reader :name, :tracks
4
+ attr_reader :name
5
5
 
6
6
  @@genres = {}
7
7
 
8
8
  def initialize(name)
9
9
  @name = name
10
- @tracks = []
10
+ super
11
11
  end
12
12
 
13
13
  def self.all
@@ -25,11 +25,5 @@ module AppleMusicLibrary
25
25
  @@genres[name]
26
26
  end
27
27
 
28
- def add_track(track)
29
- unless tracks.include?(track)
30
- @tracks << track
31
- end
32
- end
33
-
34
28
  end
35
29
  end
@@ -44,8 +44,8 @@ module AppleMusicLibrary
44
44
  @albums ||= Album.all
45
45
  end
46
46
 
47
- def artists
48
- @artists ||= Artist.all
47
+ def artists(filter = nil, limit = nil)
48
+ filter.present? ? Artist.send(filter, limit) : Artist.all
49
49
  end
50
50
 
51
51
  def artist(artist_name)
@@ -76,8 +76,8 @@ module AppleMusicLibrary
76
76
  PlaylistFolder.find_by_name(playlist_folder_name)
77
77
  end
78
78
 
79
- def tracks
80
- @tracks ||= Track.all
79
+ def tracks(filter = nil)
80
+ filter.present? ? Track.send(filter) : Track.all
81
81
  end
82
82
 
83
83
  def track(track_id)
@@ -92,6 +92,10 @@ module AppleMusicLibrary
92
92
  tracks.any?
93
93
  end
94
94
 
95
+ def rated_tracks
96
+ tracks.select{|t| t.rated?}
97
+ end
98
+
95
99
  private
96
100
 
97
101
  def extract_plist_info
@@ -1,9 +1,10 @@
1
1
  require 'facets'
2
+ require_relative 'track_collection'
2
3
 
3
4
  module AppleMusicLibrary
4
- class Playlist
5
+ class Playlist < TrackCollection
5
6
 
6
- attr_reader :info, :tracks
7
+ attr_reader :info
7
8
 
8
9
  @@playlists = {}
9
10
 
@@ -25,7 +26,7 @@ module AppleMusicLibrary
25
26
  return PlaylistFolder.new(info)
26
27
  end
27
28
 
28
- @tracks = []
29
+ super
29
30
 
30
31
  load_tracks
31
32
 
@@ -24,6 +24,7 @@ module AppleMusicLibrary
24
24
  'Rating',
25
25
  'Album Rating',
26
26
  'Album Rating Computed',
27
+ 'Loved',
27
28
  'Normalization',
28
29
  'Persistent ID',
29
30
  'Track Type',
@@ -37,6 +38,9 @@ module AppleMusicLibrary
37
38
  @info = info
38
39
  @artist = Artist.find_or_create(artist_name)
39
40
  @album = Album.find_or_create(@artist, album_name)
41
+ # if name.match(/Humble.*demo/)
42
+ # puts "Adding track #{name} to album #{album_name}"
43
+ # end
40
44
  @genre = Genre.find_or_create(genre_name)
41
45
 
42
46
  @artist.add_track(self)
@@ -55,6 +59,10 @@ module AppleMusicLibrary
55
59
  @@tracks.values
56
60
  end
57
61
 
62
+ def self.loved
63
+ @loved ||= self.all.select{|t| t.loved?}
64
+ end
65
+
58
66
  def id
59
67
  track_id
60
68
  end
@@ -71,6 +79,18 @@ module AppleMusicLibrary
71
79
  @info['Genre']
72
80
  end
73
81
 
82
+ def star_rating
83
+ rating / 20
84
+ end
85
+
86
+ def rated?
87
+ rating > 0 and rating <= 100
88
+ end
89
+
90
+ def loved?
91
+ loved
92
+ end
93
+
74
94
  ATTRIBUTES.each do |track_attribute|
75
95
  define_method(track_attribute.to_s.snakecase) do
76
96
  @info[track_attribute]
@@ -0,0 +1,26 @@
1
+ module AppleMusicLibrary
2
+ class TrackCollection
3
+
4
+ attr_reader :tracks
5
+
6
+ def initialize(*args)
7
+ @tracks = []
8
+ end
9
+
10
+ def add_track(track)
11
+ @tracks << track
12
+ end
13
+
14
+ def star_rating
15
+ return nil if rated_tracks.empty?
16
+ rated_tracks.map(&:star_rating).sum / rated_tracks.size
17
+ end
18
+
19
+ protected
20
+
21
+ def rated_tracks
22
+ @rated_tracks ||= tracks.select{|t| t.rated?}
23
+ end
24
+
25
+ end
26
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AppleMusicLibrary
4
- VERSION = "0.4.0"
4
+ VERSION = "0.7.0"
5
5
  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.0
4
+ version: 0.7.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 00:00:00.000000000 Z
11
+ date: 2022-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_print
@@ -131,6 +131,7 @@ files:
131
131
  - lib/apple_music_library/playlist.rb
132
132
  - lib/apple_music_library/playlist_folder.rb
133
133
  - lib/apple_music_library/track.rb
134
+ - lib/apple_music_library/track_collection.rb
134
135
  - lib/apple_music_library/utils.rb
135
136
  - lib/apple_music_library/version.rb
136
137
  - sig/apple_music_library.rbs
@@ -140,6 +141,7 @@ licenses:
140
141
  metadata:
141
142
  homepage_uri: https://github.com/pugetive/apple_music_library
142
143
  source_code_uri: https://github.com/pugetive/apple_music_library
144
+ changelog_uri: https://github.com/pugetive/apple_music_library/blob/main/CHANGELOG.md
143
145
  post_install_message:
144
146
  rdoc_options: []
145
147
  require_paths: