Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Update Metadata for iCloud Matched songs in your library (Windows Port)

(Windows Port)

sudo gem install json
ruby meta.rb
require 'rubygems'
require 'win32ole'
require 'json'
require 'open-uri'
class Track
attr_reader :iTunes_id
attr_reader :iTunes_track
def initialize(iTunes_track)
@iTunes_track = iTunes_track
path = @iTunes_track.location
file_string = File.open(path, 'r').read(1024)
index = file_string.index('song')
if index
@iTunes_id = file_string[index+4,4].unpack('N')[0]
else
puts "Couldn't find @iTunes_track id #{track.name.get}"
end
end
def valid?
@iTunes_id.nil?
end
def update_track(result)
@iTunes_track.name = result['trackName']
@iTunes_track.album = result['collectionName']
@iTunes_track.artist = result['artistName']
@iTunes_track.trackCount = result['trackCount']
@iTunes_track.trackNumber = result['trackNumber']
@iTunes_track.genre = result['primaryGenreName']
@iTunes_track.discCount = result['discCount']
@iTunes_track.discNumber = result['discNumber']
end
end
WORK_SIZE = 100
STDOUT.sync = true
tracks = []
app = WIN32OLE.new('iTunes.Application')
iTunes_tracks = app.SelectedTracks
if iTunes_tracks.count == 0
iTunes_tracks = app.library_playlists[1].tracks.get
end
print "Reading #{iTunes_tracks.count} tracks "
iTunes_tracks.each do | iTunes_track |
begin
if iTunes_track.KindAsString == 'Matched AAC audio file'
track = Track.new(iTunes_track)
unless track.valid?
tracks << track
print '*' if ((tracks.count % WORK_SIZE) == 0)
end
end
rescue StandardError => e
puts e
end
end
puts ''
# all 2 char countries codes lots currently not valid %w(AF AX AL DZ AS AD AO AI AQ AG AR AM AW AU AT AZ BS BH BD BB BY BE BZ BJ BM BT BO BQ BA BW BV BR IO BN BG BF BI KH CM CA CV KY CF TD CL CN CX CC CO KM CG CD CK CR CI HR CU CW CY CZ DK DJ DM DO EC EG SV GQ ER EE ET FK FO FJ FI FR GF PF TF GA GM GE DE GH GI GR GL GD GP GU GT GG GN GW GY HT HM VA HN HK HU IS IN ID IR IQ IE IM IL IT JM JP JE JO KZ KE KI KP KR KW KG LA LV LB LS LR LY LI LT LU MO MK MG MW MY MV ML MT MH MQ MR MU YT MX FM MD MC MN ME MS MA MZ MM NA NR NP NL NC NZ NI NE NG NU NF MP NO OM PK PW PS PA PG PY PE PH PN PL PT PR QA RE RO RU RW BL SH KN LC MF PM VC WS SM ST SA SN RS SC SL SG SX SK SI SB SO ZA GS SS ES LK SD SR SJ SZ SE CH SY TW TJ TZ TH TL TG TK TO TT TN TR TM TC TV UG UA AE GB US UM UY UZ VU VE VN VG VI WF EH YE ZM ZW)
countries = %w(US GB AU FR DE CA IT JP DZ AO AI AG AR AM AT AZ BS BH BD BB BY BE BZ BM BO BW BR BN BG CM KY CL CN CO CR CI HR CY CZ DK DM DO EC EG SV EE ET FI GH GR GD GT GY HN HK HU IS IN ID IE IL JM JO KZ KE KR KW LV LB LY LI LT LU MO MK MG MY MV ML MT MU MX MD MS MM NP NL NZ NI NE NG NO OM PK PA PY PE PH PL PT QA RO RU KN LC VC SA SN RS SG SK SI ZA ES LK SR SE CH TW TZ TH TT TN TR TC UG UA AE UY UZ VE VN VG YE)
puts "Found #{tracks.count} matched tracks"
countries.each do | country |
print "Querying #{country} store for #{tracks.count} tracks "
counter = 0
tracks.dup.each.each_slice(WORK_SIZE) do | subtracks |
ids = subtracks.map { | track | track.iTunes_id }
iTunesHash = JSON.parse(open("http://itunes.apple.com/lookup?id=#{ids.join(',')}&country=#{country}").read)
print '*'
iTunesHash['results'].each do | result |
result_id = result['trackId']
subtracks.each do | track |
if result_id == track.iTunes_id
track.update_track(result)
tracks.delete(track)
counter += 1
break
end
end
end
end
puts " #{counter} updated"
break if tracks.empty?
end
puts "Couldn't find meatadata for #{tracks.count} tracks" if tracks.count != 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.