-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRatingSync.cs
74 lines (61 loc) · 2.21 KB
/
RatingSync.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using iTunesLib;
using TagLib;
using File = System.IO.File;
namespace id3sync
{
public class RatingSync
{
private readonly bool simulateOnly;
private readonly string playlistName;
private readonly string email;
public RatingSync(bool simulateOnly, string playlistName, string email)
{
this.simulateOnly = simulateOnly;
this.playlistName = playlistName;
this.email = email;
}
public void SyncRatings()
{
var iTunesApp = new iTunesApp();
foreach (IITSource sources in iTunesApp.Sources)
{
foreach (IITPlaylist playlist in sources.Playlists)
{
if (playlist.Name != playlistName) continue;
WriteRatings(playlist);
return;
}
}
Console.WriteLine($"No playlist named {playlistName} found.");
}
private void WriteRatings(IITPlaylist playlist)
{
foreach (IITTrack playlistTrack in playlist.Tracks)
{
var file = (IITFileOrCDTrack)playlistTrack;
if (File.Exists(file.Location))
{
var tagFile = TagLib.File.Create(file.Location);
var tags = tagFile.GetTag(TagTypes.Id3v2);
var popm = TagLib.Id3v2.PopularimeterFrame.Get((TagLib.Id3v2.Tag)tags, email, true);
var computedRating = Math.Ceiling(ConvertToItunesRatingRange(popm.Rating));
var computedStars = ConvertToStarRange(computedRating);
Console.WriteLine($"Rating for {file.Artist}-{file.Name} => {computedRating} ({computedStars} stars)");
if (!simulateOnly)
{
file.Rating = (int)computedRating;
}
}
}
}
private static double ConvertToItunesRatingRange(byte popmRating)
{
return popmRating * 100 / 255d;
}
private static double ConvertToStarRange(double itunesRating)
{
return itunesRating * 5 / 100d;
}
}
}