Skip to content

Instantly share code, notes, and snippets.

@Manuel-S
Created December 15, 2015 08:56
Show Gist options
  • Save Manuel-S/84e903760d4f482e725e to your computer and use it in GitHub Desktop.
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.
//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