39
39
public class Banshee
41
static BansheeDbus bus;
45
bus = new BansheeDbus ();
48
public static bool Playing {
49
get { return bus.Playing; }
41
static BansheeDBus bus;
42
static BansheeIndexer indexer;
46
bus = new BansheeDBus ();
47
indexer = new BansheeIndexer ();
50
public static void Index ()
55
public static bool IsPlaying {
56
get { return bus.IsPlaying (); }
59
public static void Enqueue (MediaItem item)
61
Services.Application.RunOnThread (() => bus.Enqueue (LoadMedia (item)));
52
64
public static void Play ()
54
66
Services.Application.RunOnThread (bus.Play);
69
public static void Play (MediaItem item)
71
Services.Application.RunOnThread (() => bus.Play (LoadMedia (item)));
57
74
public static void Pause ()
69
86
Services.Application.RunOnThread (bus.Previous);
89
public static PlaybackShuffleMode ShuffleMode {
90
set { bus.ShuffleMode = value; }
93
public static IEnumerable<IMediaFile> LoadMedia (MediaItem item)
95
if (item is MusicItem)
96
return LoadSongsFor (item as MusicItem);
97
else if (item is PodcastItem)
98
return LoadPodcastsFor (item as PodcastItem);
99
else if (item is VideoItem)
100
return indexer.Videos as IEnumerable<IMediaFile>;
102
return Enumerable.Empty<IMediaFile> ();
105
public static void LoadVideos (out List<VideoItem> videos)
107
videos = new List<VideoItem> (indexer.Videos);
110
public static List<IMediaFile> SearchMedia (string pattern)
112
List<IMediaFile> results = new List<IMediaFile> ();
114
results.AddRange (indexer.Songs.Where (item => ContainsMatch (item, pattern)).Cast<IMediaFile> ());
115
results.AddRange (indexer.Videos.Where (item => ContainsMatch (item, pattern)).Cast<IMediaFile> ());
116
results.AddRange (indexer.Podcasts.Where (item => ContainsMatch (item, pattern)).Cast<IMediaFile> ());
121
public static void LoadPodcasts (out List<PodcastItem> podcastsOut)
123
Dictionary<string, PodcastItem> publishers;
125
podcastsOut = new List<PodcastItem> ();
126
publishers = new Dictionary<string, PodcastItem> ();
128
foreach (PodcastPodcastItem podcast in indexer.Podcasts) {
129
if (!publishers.ContainsKey (podcast.Artist))
130
publishers[podcast.Artist] = new PodcastPublisherItem (
131
podcast.Artist, podcast.Year, podcast.Cover);
134
podcastsOut.AddRange (publishers.Values);
137
public static void LoadAlbumsAndArtists (out List<AlbumMusicItem> albumsOut, out List<ArtistMusicItem> artistsOut)
139
Dictionary<string, AlbumMusicItem> albums;
140
Dictionary<string, ArtistMusicItem> artists;
142
albumsOut = new List<AlbumMusicItem> ();
143
artistsOut = new List<ArtistMusicItem> ();
145
albums = new Dictionary<string, AlbumMusicItem> ();
146
artists = new Dictionary<string,ArtistMusicItem> ();
148
foreach (SongMusicItem song in indexer.Songs) {
149
if (!artists.ContainsKey (song.Artist))
150
artists[song.Artist] = new ArtistMusicItem (song.Artist, song.Cover);
152
if (!albums.ContainsKey (song.Album))
153
albums[song.Album] = new AlbumMusicItem (song.Album, song.Artist, song.Year,
157
albumsOut.AddRange (albums.Values);
158
artistsOut.AddRange (artists.Values);
161
public static IEnumerable<AlbumMusicItem> LoadAlbumsFor (ArtistMusicItem artist, IEnumerable<AlbumMusicItem> albums)
163
return albums.Where (album => album.Artist.Contains (artist.Name));
166
static List<IMediaFile> LoadSongsFor (MusicItem item)
168
SortedList<string, IMediaFile> albumSongs;
171
if (item is SongMusicItem) {
172
List<IMediaFile> single = new List<IMediaFile> ();
173
single.Add (item as SongMusicItem);
177
albumSongs = new SortedList<string, IMediaFile> ();
178
foreach (SongMusicItem song in indexer.Songs) {
179
switch (item.GetType ().Name) {
180
case "AlbumMusicItem":
181
if (item.Name != song.Album) continue;
183
case "ArtistMusicItem":
184
if (item.Name != song.Artist) continue;
188
key = string.Format ("{0}-{1}-{2}", song.Album, song.Track, song.Path);
190
if (albumSongs.ContainsKey (key)) continue;
191
albumSongs.Add (key, song);
192
} catch (Exception e) {
193
Log.Error ("{0} : {1}", key, e.Message);
197
return new List<IMediaFile> (albumSongs.Values);
200
static IEnumerable<IMediaFile> LoadPodcastsFor (PodcastItem item)
202
if (item is PodcastPodcastItem) {
203
yield return item as IMediaFile;
206
foreach (PodcastPodcastItem pc in indexer.Podcasts) {
207
if ((item as PodcastPublisherItem).Name != pc.Artist) continue;
214
static bool ContainsMatch (MediaItem item, string pattern)
216
return ContainsMatch (item, p => PropertyInfoMatchesPattern (item, p, pattern));
219
static bool ContainsMatch (MediaItem item, Func<PropertyInfo, bool> predicate)
221
return item.GetType ().GetProperties ().Any (predicate);
224
static bool PropertyInfoMatchesPattern (MediaItem item, PropertyInfo info, string pattern)
226
return (info.Name != "File" && (info.GetValue (item, null).ToString ().Contains (pattern)));