private IEnumerable <LinkedChild> GetM3u8Items(Stream stream) { var content = new M3u8Content(); var playlist = content.GetFromStream(stream); return(playlist.PlaylistEntries.Select(i => new LinkedChild { Path = i.Path, Type = LinkedChildType.Manual })); }
public static Playlist Read(string playlistPath) { if (!File.Exists(playlistPath)) { return(null); } var ext = Path.GetExtension(playlistPath).ToLower(); var playlistStream = new FileStream(playlistPath, FileMode.Open); IEnumerable <BasePlaylistEntry> playlistEntries; switch (ext) { case ".pls": playlistEntries = new PlsContent().GetFromStream(playlistStream).PlaylistEntries; break; case ".m3u": playlistEntries = new M3uContent().GetFromStream(playlistStream).PlaylistEntries; break; case ".m3u8": playlistEntries = new M3u8Content().GetFromStream(playlistStream).PlaylistEntries; break; case ".wpl": playlistEntries = new WplContent().GetFromStream(playlistStream).PlaylistEntries; break; case ".zpl": playlistEntries = new ZplContent().GetFromStream(playlistStream).PlaylistEntries; break; default: throw new InvalidOperationException("unknown playlist format"); } playlistStream.Close(); if (playlistEntries.Count() == 0) { return(null); } return(new Playlist(playlistEntries.Select(e => e.Path))); }
private R <Playlist, LocalStr> GetPlaylistContent(Stream stream, string url, Uid owner, string mime = null) { string name = null; List <PlaylistItem> items; mime = mime.ToLowerInvariant(); url = url.ToLowerInvariant(); string anyId = mime ?? url; switch (anyId) { case ".m3u": { var parser = new M3uContent(); var list = parser.GetFromStream(stream); items = new List <PlaylistItem>( from e in list.PlaylistEntries select new PlaylistItem(new AudioResource(e.Path, e.Title, ResolverFor))); break; } case ".m3u8": case "application/mpegurl": case "application/x-mpegurl": case "audio/mpegurl": case "audio/x-mpegurl": case "application/vnd.apple.mpegurl": case "application/vnd.apple.mpegurl.audio": { var parser = new M3u8Content(); var list = parser.GetFromStream(stream); items = new List <PlaylistItem>( from e in list.PlaylistEntries select new PlaylistItem(new AudioResource(e.Path, e.Title, ResolverFor))); break; } case ".pls": case "audio/x-scpls": case "application/x-scpls": case "application/pls+xml": { var parser = new PlsContent(); var list = parser.GetFromStream(stream); items = new List <PlaylistItem>( from e in list.PlaylistEntries select new PlaylistItem(new AudioResource(e.Path, e.Title, ResolverFor))); break; } case ".wpl": { var parser = new WplContent(); var list = parser.GetFromStream(stream); items = new List <PlaylistItem>( from e in list.PlaylistEntries select new PlaylistItem(new AudioResource(e.Path, e.TrackTitle, ResolverFor))); name = list.Title; break; } case ".zpl": { var parser = new ZplContent(); var list = parser.GetFromStream(stream); items = new List <PlaylistItem>( from e in list.PlaylistEntries select new PlaylistItem(new AudioResource(e.Path, e.TrackTitle, ResolverFor))); name = list.Title; break; } // ?? case "application/jspf+json": // ?? case "application/xspf+xml": default: return(new LocalStr(strings.error_media_file_not_found)); // TODO Loc "media not supported" } if (string.IsNullOrEmpty(name)) { var index = url.LastIndexOfAny(new[] { '\\', '/' }); name = index >= 0 ? url.Substring(index) : url; } return(new Playlist(name, owner, Enumerable.Empty <Uid>(), items)); }
private void SavePlaylistFile(Playlist item) { // this is probably best done as a metadata provider // saving a file over itself will require some work to prevent this from happening when not needed var playlistPath = item.Path; var extension = Path.GetExtension(playlistPath); if (string.Equals(".wpl", extension, StringComparison.OrdinalIgnoreCase)) { var playlist = new WplPlaylist(); foreach (var child in item.GetLinkedChildren()) { var entry = new WplPlaylistEntry() { Path = NormalizeItemPath(playlistPath, child.Path), TrackTitle = child.Name, AlbumTitle = child.Album }; var hasAlbumArtist = child as IHasAlbumArtist; if (hasAlbumArtist != null) { entry.AlbumArtist = hasAlbumArtist.AlbumArtists.FirstOrDefault(); } var hasArtist = child as IHasArtist; if (hasArtist != null) { entry.TrackArtist = hasArtist.Artists.FirstOrDefault(); } if (child.RunTimeTicks.HasValue) { entry.Duration = TimeSpan.FromTicks(child.RunTimeTicks.Value); } playlist.PlaylistEntries.Add(entry); } string text = new WplContent().ToText(playlist); File.WriteAllText(playlistPath, text); } if (string.Equals(".zpl", extension, StringComparison.OrdinalIgnoreCase)) { var playlist = new ZplPlaylist(); foreach (var child in item.GetLinkedChildren()) { var entry = new ZplPlaylistEntry() { Path = NormalizeItemPath(playlistPath, child.Path), TrackTitle = child.Name, AlbumTitle = child.Album }; var hasAlbumArtist = child as IHasAlbumArtist; if (hasAlbumArtist != null) { entry.AlbumArtist = hasAlbumArtist.AlbumArtists.FirstOrDefault(); } var hasArtist = child as IHasArtist; if (hasArtist != null) { entry.TrackArtist = hasArtist.Artists.FirstOrDefault(); } if (child.RunTimeTicks.HasValue) { entry.Duration = TimeSpan.FromTicks(child.RunTimeTicks.Value); } playlist.PlaylistEntries.Add(entry); } string text = new ZplContent().ToText(playlist); File.WriteAllText(playlistPath, text); } if (string.Equals(".m3u", extension, StringComparison.OrdinalIgnoreCase)) { var playlist = new M3uPlaylist(); playlist.IsExtended = true; foreach (var child in item.GetLinkedChildren()) { var entry = new M3uPlaylistEntry() { Path = NormalizeItemPath(playlistPath, child.Path), Title = child.Name, Album = child.Album }; var hasAlbumArtist = child as IHasAlbumArtist; if (hasAlbumArtist != null) { entry.AlbumArtist = hasAlbumArtist.AlbumArtists.FirstOrDefault(); } if (child.RunTimeTicks.HasValue) { entry.Duration = TimeSpan.FromTicks(child.RunTimeTicks.Value); } playlist.PlaylistEntries.Add(entry); } string text = new M3uContent().ToText(playlist); File.WriteAllText(playlistPath, text); } if (string.Equals(".m3u8", extension, StringComparison.OrdinalIgnoreCase)) { var playlist = new M3uPlaylist(); playlist.IsExtended = true; foreach (var child in item.GetLinkedChildren()) { var entry = new M3uPlaylistEntry() { Path = NormalizeItemPath(playlistPath, child.Path), Title = child.Name, Album = child.Album }; var hasAlbumArtist = child as IHasAlbumArtist; if (hasAlbumArtist != null) { entry.AlbumArtist = hasAlbumArtist.AlbumArtists.FirstOrDefault(); } if (child.RunTimeTicks.HasValue) { entry.Duration = TimeSpan.FromTicks(child.RunTimeTicks.Value); } playlist.PlaylistEntries.Add(entry); } string text = new M3u8Content().ToText(playlist); File.WriteAllText(playlistPath, text); } if (string.Equals(".pls", extension, StringComparison.OrdinalIgnoreCase)) { var playlist = new PlsPlaylist(); foreach (var child in item.GetLinkedChildren()) { var entry = new PlsPlaylistEntry() { Path = NormalizeItemPath(playlistPath, child.Path), Title = child.Name }; if (child.RunTimeTicks.HasValue) { entry.Length = TimeSpan.FromTicks(child.RunTimeTicks.Value); } playlist.PlaylistEntries.Add(entry); } string text = new PlsContent().ToText(playlist); File.WriteAllText(playlistPath, text); } }