Created
December 15, 2015 08:56
-
-
Save Manuel-S/84e903760d4f482e725e to your computer and use it in GitHub Desktop.
Synchronize Folders with iTunes Playlists. Usage: sync.exe [parent-folder] [parent-playlist]. Defaults to your OneDrive/Music Folder.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//reference iTunesLib from COM | |
using iTunesLib; | |
using Microsoft.Win32; | |
using System; | |
using System.IO; | |
using System.Threading; | |
using System.Linq; | |
class Program | |
{ | |
readonly static string[] Extensions = new[] { ".mp3", ".m4a", ".aac", ".aiff", ".wav", ".aa", "m4p" }; | |
[STAThread] | |
static void Main(string[] args) | |
{ | |
var iTunesApp = new iTunesAppClass(); | |
var folder = args.Any() ? Path.GetFullPath(args[0]) : Path.Combine(Registry.GetValue("HKEY_CURRENT_USER\\Software\\Microsoft\\SkyDrive", "UserFolder", | |
Registry.GetValue("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\SkyDrive", "UserFolder", null)).ToString(), @"Music\"); | |
var parent = args.Length > 1 ? args[1] : null; | |
var dir = new DirectoryInfo(folder); | |
var playlists = iTunesApp.LibrarySource.Playlists.Cast<IITPlaylist>().ToArray(); | |
foreach (var pair in dir.GetDirectories().Select(x => new | |
{ | |
dir = x, | |
playlist = playlists.SingleOrDefault(y => y.Name == x.Name && (((dynamic)y).Parent.Name == parent || parent == null)) | |
})) | |
{ | |
if (pair.playlist == null) | |
continue; | |
var tracks = pair.playlist.Tracks.Cast<IITTrack>().Select(track => new { track, location = (string)((dynamic)track).Location }).ToArray(); | |
foreach (var file in pair.dir.GetFiles().Where(x => Extensions.Contains(x.Extension))) | |
{ | |
try | |
{ | |
var tagFile = TagLib.File.Create(file.FullName); | |
if (!tracks.Any(x => x.location == file.FullName || x.track.Name == tagFile.Tag.Title)) | |
{ | |
dynamic playlist = (dynamic)pair.playlist; | |
var status = playlist.AddFile(file.FullName); | |
while (status.InProgress) { Thread.Sleep(100); } | |
Console.WriteLine(status.Tracks[1].Name + " added"); | |
} | |
} | |
catch (Exception e) | |
{ | |
Console.WriteLine("Error: " + e.Message); | |
} | |
} | |
} | |
Console.WriteLine("finished"); | |
Console.ReadKey(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment