public iTunesTrack(iTunesLibrary library, Dictionary <string, object> fields) { this.library = library; this.fields = fields; trackType = fields.Get <string>("Track Type"); selected = !fields.Get <bool>("Disabled"); album = fields.Get <string>("Album"); name = fields.Get <string>("Name"); albumArtist = fields.Get <string>("Album Artist"); artist = fields.Get <string>("Artist"); path = fields.Get <string>("Location"); if (path != null) { path = path.Substring(@"file://localhost".Length); path = path.Replace('/', '\\'); path = Uri.UnescapeDataString(path); string folder = Path.GetDirectoryName(path); artistFolder = Path.GetFileName(Path.GetDirectoryName(folder)); albumFolder = Path.GetFileName(folder); filename = Path.GetFileName(path); string extension = Path.GetExtension(filename); if (extension.Equals(".m4a", StringComparison.OrdinalIgnoreCase)) { format = Constants.WPD_OBJECT_FORMAT_M4A; } else if (extension.Equals(".mp3", StringComparison.OrdinalIgnoreCase)) { format = Constants.WPD_OBJECT_FORMAT_MP3; } } }
public void SyncPlaylists(iTunesLibrary library) { if (playlistFolder == null) { foobalator.Log.WriteLine("Playlists folder could not be found"); return; } foreach (var playlist in library.playlists) { try { DeviceObject deviceObject = playlistFolder.GetChildByName(playlist.name); if (deviceObject == null) { foobalator.Log.WriteLine(playlist.ToString()); var references = new PortableDevicePropVariantCollection(); foreach (var track in playlist.Tracks) { if (track.deviceObject == null) { continue; } //var item = Constants.ToPropVariant(track.deviceObject.id); //var item = new System.Runtime.InteropServices.VariantWrapper(track.deviceObject.id); //references.Add(item); } uint count = 0; references.GetCount(ref count); var values = new PortableDeviceValues(); values.SetStringValue(Constants.WPD_OBJECT_PARENT_ID, playlistFolder.id); values.SetStringValue(Constants.WPD_OBJECT_NAME, playlist.name); //values.SetStringValue(Constants.WPD_OBJECT_ORIGINAL_FILE_NAME, playlist.name); values.SetGuidValue(Constants.WPD_OBJECT_CONTENT_TYPE, Constants.WPD_CONTENT_TYPE_PLAYLIST); values.SetUnsignedIntegerValue(Constants.WPD_OBJECT_SIZE, count); //values.SetGuidValue(Constants.WPD_OBJECT_FORMAT, Constants.WPD_OBJECT_FORMAT_WPLPLAYLIST); //values.SetGuidValue(Constants.WPD_OBJECT_FORMAT, Constants.WPD_OBJECT_FORMAT_PROPERTIES_ONLY); //values.SetIPortableDevicePropVariantCollectionValue(Constants.WPD_OBJECT_REFERENCES, references); string playlistDeviceId = null; content.CreateObjectWithPropertiesOnly(values, ref playlistDeviceId); deviceObject = playlistFolder.GetChildByName(playlist.name, true); } playlist.deviceObject = deviceObject; } catch (Exception e) { foobalator.Log.Write(playlist.ToString(), e); } } }
public iTunesPlaylist(iTunesLibrary library, Dictionary <string, object> fields) { this.library = library; this.fields = fields; this.name = fields.Get <string>("Name"); bool?visible = fields.Get <bool?>("Visible"); this.visible = visible.HasValue ? visible.Value : true; }
static void Main(string[] args) { string libraryFile = args.Length > 0 ? args[0] : iTunesLibrary.DefaultLibrary; iTunesLibrary library = new iTunesLibrary(); bool exists = library.Parse(libraryFile); if (!exists) { return; } if (args.Length > 1) { string destDir = args[1]; foreach (var playlist in library.playlists) { if (playlist.Tracks.Count > 200) { continue; } CopyTracks(playlist.Tracks, destDir); } } else { string[] deviceIDs = new string[1]; uint count = (uint)deviceIDs.Length; PortableDeviceManager devices = new PortableDeviceManager(); devices.GetDevices(deviceIDs, ref count); if (count == 0) { foobalator.Log.WriteLine("No device connected"); return; } Device device = new Device(devices, deviceIDs[0]); device.Sync(library); } }
public void SyncTracks(iTunesLibrary library) { if (musicFolder == null) { foobalator.Log.WriteLine("Music folder could not be found"); return; } foreach (var iTunesTrack in library.selected.Values) { try { if (iTunesTrack.path == null) { foobalator.Log.WriteLine(string.Format("{0}/{1}/{2} has no source. tracktype: {3}", iTunesTrack.artist, iTunesTrack.album, iTunesTrack.name, iTunesTrack.trackType)); continue; } if (!File.Exists(iTunesTrack.path)) { foobalator.Log.WriteLine(string.Format("file not found: \"{0}\"", iTunesTrack.path)); continue; } if (iTunesTrack.format == default(Guid)) { foobalator.Log.WriteLine(string.Format("unsupported file type: \"{0}\"", iTunesTrack.path)); continue; } DeviceObject artistFolder = musicFolder.GetChildByName(iTunesTrack.artistFolder); if (artistFolder == null) { PortableDeviceValues values = new PortableDeviceValues(); values.SetStringValue(Constants.WPD_OBJECT_PARENT_ID, musicFolder.id); values.SetStringValue(Constants.WPD_OBJECT_NAME, iTunesTrack.artistFolder); values.SetStringValue(Constants.WPD_OBJECT_ORIGINAL_FILE_NAME, iTunesTrack.artistFolder); values.SetGuidValue(Constants.WPD_OBJECT_CONTENT_TYPE, Constants.WPD_CONTENT_TYPE_FOLDER); values.SetGuidValue(Constants.WPD_OBJECT_FORMAT, Constants.WPD_OBJECT_FORMAT_PROPERTIES_ONLY); string artistFolderDeviceId = null; content.CreateObjectWithPropertiesOnly(values, ref artistFolderDeviceId); artistFolder = GetObject(artistFolderDeviceId); } DeviceObject albumFolder = artistFolder.GetChildByName(iTunesTrack.albumFolder); if (albumFolder == null) { PortableDeviceValues values = new PortableDeviceValues(); values.SetStringValue(Constants.WPD_OBJECT_PARENT_ID, artistFolder.id); values.SetStringValue(Constants.WPD_OBJECT_NAME, iTunesTrack.albumFolder); values.SetStringValue(Constants.WPD_OBJECT_ORIGINAL_FILE_NAME, iTunesTrack.albumFolder); values.SetGuidValue(Constants.WPD_OBJECT_CONTENT_TYPE, Constants.WPD_CONTENT_TYPE_FOLDER); values.SetGuidValue(Constants.WPD_OBJECT_FORMAT, Constants.WPD_OBJECT_FORMAT_PROPERTIES_ONLY); string albumFolderDeviceId = null; content.CreateObjectWithPropertiesOnly(values, ref albumFolderDeviceId); albumFolder = GetObject(albumFolderDeviceId); } DeviceObject deviceObject = albumFolder.GetChildByOriginalFilename(iTunesTrack.filename); if (deviceObject == null) { foobalator.Log.WriteLine(iTunesTrack.ToString()); PortableDeviceValues values = new PortableDeviceValues(); values.SetStringValue(Constants.WPD_OBJECT_PARENT_ID, albumFolder.id); values.SetStringValue(Constants.WPD_OBJECT_NAME, iTunesTrack.filename); values.SetGuidValue(Constants.WPD_OBJECT_FORMAT, iTunesTrack.format); values.SetGuidValue(Constants.WPD_OBJECT_CONTENT_TYPE, Constants.WPD_CONTENT_TYPE_AUDIO); values.SetStringValue(Constants.WPD_OBJECT_ORIGINAL_FILE_NAME, iTunesTrack.filename); values.SetStringValue(Constants.WPD_MEDIA_ARTIST, iTunesTrack.artist); values.SetStringValue(Constants.WPD_MEDIA_ALBUM_ARTIST, iTunesTrack.albumArtist); values.SetStringValue(Constants.WPD_MUSIC_ALBUM, iTunesTrack.album); values.SetUnsignedIntegerValue(Constants.WPD_MUSIC_TRACK, iTunesTrack.number); System.Runtime.InteropServices.ComTypes.IStream deviceData; uint writeSize = 0x10000; string cookie = ""; content.CreateObjectWithPropertiesAndData(values, out deviceData, ref writeSize, ref cookie); try { using (FileStream sourceData = File.OpenRead(iTunesTrack.path)) { while (true) { byte[] bytes = new byte[writeSize]; int length = sourceData.Read(bytes, 0, (int)bytes.Length); if (length <= 0) { break; } deviceData.Write(bytes, length, new IntPtr()); } } deviceData.Commit(0); } catch { deviceData.Revert(); content.Cancel(); throw; } deviceObject = albumFolder.GetChildByOriginalFilename(iTunesTrack.filename, true); } iTunesTrack.deviceObject = deviceObject; } catch (Exception e) { foobalator.Log.Write(iTunesTrack.ToString(), e); } } }
public void Sync(iTunesLibrary library) { SyncTracks(library); SyncPlaylists(library); }