SND\AstrorEnales_cp 9f4369c05d - Working on implementing the WindowsMediaLibrary via the WMPLib
- Implemented nearly all classes in the Media namespace side by side with the Windows implementation
- Started adding unit tests to compare the ANX and XNA MediaLibrary behaviour
- Merged the ConvertEquals for PackedVectors to a single method that does the job equally good
2015-03-15 01:11:33 +01:00

294 lines
9.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using ANX.Framework.Media;
using ANX.Framework.NonXNA.PlatformSystem;
using WMPLib;
namespace ANX.PlatformSystem.Windows
{
/// <summary>
/// List of media item attributes: http://msdn.microsoft.com/en-us/library/dd562379%28v=vs.85%29.aspx
/// </summary>
public class WindowsMediaLibrary : INativeMediaLibrary
{
private enum MediaType
{
Audio,
Other,
Photo,
Playlist,
Radio,
Video
}
private PictureCollection pictureCollection;
private PictureAlbum rootPictureAlbum;
private PictureCollection savedPictures;
private SongCollection songs;
private ArtistCollection artists;
private GenreCollection genres;
private PlaylistCollection playlists;
private AlbumCollection albums;
private WindowsMediaPlayer nativePlayer;
public WindowsMediaLibrary()
{
nativePlayer = new WindowsMediaPlayer();
CollectAllData();
}
#region CollectAllData
private void CollectAllData()
{
var allArtists = new List<Artist>();
var allSongs = new List<Song>();
var allAlbums = new List<Album>();
var allPictures = new List<Picture>();
var allGenres = new List<Genre>();
var allPictureAlbums = new List<PictureAlbum>();
var list = nativePlayer.mediaCollection.getAll();
for (int index = 0; index < list.count; index++)
{
var media = list.Item[index];
string id = media.getItemInfo("TrackingID");
if (GetType(media) == MediaType.Audio)
{
string artistName = media.getItemInfo("Author");
var newArtist = GetArtist(artistName, allArtists);
string albumId = media.getItemInfo("AlbumID");
string albumName = media.getItemInfo("WM/AlbumTitle");
string albumArtistName = albumName.Length > 0 ? albumId.Replace(albumName, "") : artistName;
if (albumArtistName.Length == 0)
albumArtistName = artistName;
var newAlbum = GetAlbum(albumId, allAlbums);
newAlbum.Name = albumName;
newAlbum.Artist = GetArtist(albumArtistName, allArtists);
string genreName = media.getItemInfo("WM/Genre");
Genre newGenre = GetGenre(genreName, allGenres);
int duration = GetMediaDuration(media, "Duration");
string name = media.getItemInfo("Title");
var newSong = new Song(name, id, media.sourceURL, duration)
{
Artist = newArtist,
Album = newAlbum,
Genre = newGenre,
Rating = GetMediaIntValue(media, "UserRating", 0),
TrackNumber = GetMediaIntValue(media, "WM/TrackNumber", 0),
PlayCount = GetMediaIntValue(media, "UserPlayCount", 0),
IsProtected = GetMediaBoolValue(media, "Is_Protected", false),
};
allSongs.Add(newSong);
}
else if (GetType(media) == MediaType.Photo)
{
string name = media.getItemInfo("Title");
var newPicture = new Picture(id)
{
Name = name,
};
allPictures.Add(newPicture);
}
}
foreach (Artist artist in allArtists)
{
var allSongsFromArtist = allSongs.Where(song => song.Artist == artist).ToArray();
artist.Songs = new SongCollection(allSongsFromArtist);
var allAlbumsFromArtist = allAlbums.Where(album => album.Artist == artist).ToArray();
artist.Albums = new AlbumCollection(allAlbumsFromArtist);
}
foreach (Album album in allAlbums)
{
var allSongsFromAlbum = allSongs.Where(song => song.Album == album).ToArray();
album.Songs = new SongCollection(allSongsFromAlbum);
}
foreach (Genre genre in allGenres)
{
var allSongsInGenre = allSongs.Where(song => song.Genre == genre).ToArray();
genre.Songs = new SongCollection(allSongsInGenre);
// TODO: albums
}
songs = new SongCollection(allSongs);
pictureCollection = new PictureCollection(allPictures);
artists = new ArtistCollection(allArtists);
albums = new AlbumCollection(allAlbums);
genres = new GenreCollection(allGenres);
// TODO
rootPictureAlbum = null;
playlists = new PlaylistCollection();
savedPictures = new PictureCollection(new Picture[0]);
}
#endregion
private Artist GetArtist(string name, List<Artist> allArtists)
{
foreach (Artist artist in allArtists)
if (artist.Name == name)
return artist;
var newArtist = new Artist(name);
allArtists.Add(newArtist);
return newArtist;
}
private Genre GetGenre(string name, List<Genre> allGenres)
{
foreach (Genre genre in allGenres)
if (genre.Name == name)
return genre;
var newGenre = new Genre(name);
allGenres.Add(newGenre);
return newGenre;
}
private Album GetAlbum(string id, List<Album> allAlbums)
{
foreach (Album album in allAlbums)
if (album.Name == id)
return album;
var newAlbum = new Album(id);
allAlbums.Add(newAlbum);
return newAlbum;
}
#region GetMethods
public PictureCollection GetPictures()
{
return pictureCollection;
}
public PictureAlbum GetRootPictureAlbum()
{
return rootPictureAlbum;
}
public PictureCollection GetSavedPictures()
{
return savedPictures;
}
public SongCollection GetSongs()
{
return songs;
}
public ArtistCollection GetArtists()
{
return artists;
}
public AlbumCollection GetAlbums()
{
return albums;
}
public PlaylistCollection GetPlaylists()
{
return playlists;
}
public GenreCollection GetGenres()
{
return genres;
}
#endregion
#region GetMediaBoolValue
private bool GetMediaBoolValue(IWMPMedia media, string name, bool defaultValue)
{
string value = media.getItemInfo(name);
bool result;
return bool.TryParse(value, out result) == false ? defaultValue : result;
}
#endregion
#region GetMediaDuration
private int GetMediaDuration(IWMPMedia media, string name)
{
string value = media.getItemInfo(name).Replace(',', '.');
float seconds;
if (float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out seconds) == false)
return 0;
return (int)(seconds * 1000f);
}
#endregion
#region GetMediaIntValue
private int GetMediaIntValue(IWMPMedia media, string name, int defaultValue)
{
string value = media.getItemInfo(name);
int result;
return int.TryParse(value, out result) == false ? defaultValue : result;
}
#endregion
#region GetType
private static MediaType GetType(IWMPMedia media)
{
switch (media.getItemInfo("MediaType"))
{
case "audio":
return MediaType.Audio;
default:
return MediaType.Other;
case "photo":
return MediaType.Photo;
case "playlist":
return MediaType.Playlist;
case "radio":
return MediaType.Radio;
case "video":
return MediaType.Video;
}
}
#endregion
public Picture SavePicture(string file, Stream data)
{
throw new NotImplementedException();
}
public Picture SavePicture(string file, byte[] data)
{
throw new NotImplementedException();
}
public Picture GetPictureFromToken(string file)
{
throw new NotImplementedException();
}
#region Dispose
public void Dispose()
{
pictureCollection = null;
rootPictureAlbum = null;
savedPictures = null;
songs = null;
artists = null;
genres = null;
playlists = null;
albums = null;
if (nativePlayer != null)
{
nativePlayer.close();
nativePlayer = null;
}
}
#endregion
}
}