public R SavePlaylist(Playlist plist) { if (plist == null) { throw new ArgumentNullException(nameof(plist)); } if (!IsNameValid(plist.Name)) { return("Invalid playlist name."); } var di = new DirectoryInfo(data.PlaylistPath); if (!di.Exists) { return("No playlist directory has been set up."); } var fi = GetFileInfo(plist.Name); if (fi.Exists) { var tempList = LoadPlaylist(plist.Name, true); if (!tempList) { return("Existing playlist ist corrupted, please use another name or repair the existing."); } if (tempList.Value.CreatorDbId.HasValue && tempList.Value.CreatorDbId != plist.CreatorDbId) { return("You cannot overwrite a playlist which you dont own."); } } using (var sw = new StreamWriter(fi.Open(FileMode.Create, FileAccess.Write, FileShare.Read), FileEncoding)) { sw.WriteLine("version:1"); if (plist.CreatorDbId.HasValue) { sw.Write("owner:"); sw.Write(plist.CreatorDbId.Value); sw.WriteLine(); } sw.WriteLine(); foreach (var pli in plist.AsEnumerable()) { if (pli.HistoryId.HasValue) { sw.Write("id:"); if (pli.Meta.ResourceOwnerDbId.HasValue) { sw.Write(pli.Meta.ResourceOwnerDbId.Value); } sw.Write(":"); sw.Write(pli.HistoryId.Value); } else if (!string.IsNullOrWhiteSpace(pli.Link)) { sw.Write("ln:"); if (pli.Meta.ResourceOwnerDbId.HasValue) { sw.Write(pli.Meta.ResourceOwnerDbId.Value); } sw.Write(":"); if (pli.AudioType.HasValue) { sw.Write(pli.AudioType.Value); } sw.Write(","); sw.Write(Uri.EscapeDataString(pli.Link)); } else if (pli.Resource != null) { sw.Write("rs:"); if (pli.Meta.ResourceOwnerDbId.HasValue) { sw.Write(pli.Meta.ResourceOwnerDbId.Value); } sw.Write(":"); sw.Write(pli.Resource.AudioType); sw.Write(","); sw.Write(Uri.EscapeDataString(pli.Resource.ResourceId)); sw.Write(","); sw.Write(Uri.EscapeDataString(pli.Resource.ResourceTitle)); } else { continue; } sw.WriteLine(); } } return(R.OkR); }
public R <Playlist> LoadPlaylist(string name, bool headOnly = false) { if (name.StartsWith(".", StringComparison.Ordinal)) { var result = GetSpecialPlaylist(name); if (result) { return(result); } } var fi = GetFileInfo(name); if (!fi.Exists) { return("Playlist not found"); } using (var sr = new StreamReader(fi.Open(FileMode.Open, FileAccess.Read, FileShare.Read), FileEncoding)) { var plist = new Playlist(name); // Info: version:<num> // Info: owner:<dbid> // Line: <kind>:<data,data,..>:<opt-title> string line; // read header while ((line = sr.ReadLine()) != null) { if (string.IsNullOrEmpty(line)) { break; } var kvp = line.Split(new[] { ':' }, 2); if (kvp.Length < 2) { continue; } string key = kvp[0]; string value = kvp[1]; switch (key) { case "version": // skip, not yet needed break; case "owner": if (plist.CreatorDbId != null) { return("Invalid playlist file: duplicate userid"); } ulong userid; if (ulong.TryParse(value, out userid)) { plist.CreatorDbId = userid; } else { return("Broken playlist header"); } break; } } if (headOnly) { return(plist); } // read content while ((line = sr.ReadLine()) != null) { var kvp = line.Split(new[] { ':' }, 3); if (kvp.Length < 3) { Log.Write(Log.Level.Warning, "Erroneus playlist split count: {0}", line); continue; } string kind = kvp[0]; string optOwner = kvp[1]; string content = kvp[2]; var meta = new MetaData(); if (string.IsNullOrWhiteSpace(optOwner)) { meta.ResourceOwnerDbId = null; } else if (ulong.TryParse(optOwner, out ulong userid)) { meta.ResourceOwnerDbId = userid; } else { Log.Write(Log.Level.Warning, "Erroneus playlist meta data: {0}", line); } AudioType audioType; switch (kind) { case "ln": var lnSplit = content.Split(new[] { ',' }, 2); if (lnSplit.Length < 2) { goto default; } #pragma warning disable CS0612 if (!string.IsNullOrWhiteSpace(lnSplit[0]) && Enum.TryParse(lnSplit[0], out audioType)) { plist.AddItem(new PlaylistItem(Uri.UnescapeDataString(lnSplit[1]), audioType, meta)); } else { plist.AddItem(new PlaylistItem(Uri.UnescapeDataString(lnSplit[1]), null, meta)); } #pragma warning restore CS0612 break; case "rs": var rsSplit = content.Split(new[] { ',' }, 3); if (rsSplit.Length < 3) { goto default; } if (!string.IsNullOrWhiteSpace(rsSplit[0]) && Enum.TryParse(rsSplit[0], out audioType)) { plist.AddItem(new PlaylistItem(new AudioResource(Uri.UnescapeDataString(rsSplit[1]), Uri.UnescapeDataString(rsSplit[2]), audioType), meta)); } else { goto default; } break; case "id": uint hid; if (!uint.TryParse(content, out hid)) { goto default; } plist.AddItem(new PlaylistItem(hid, meta)); break; default: Log.Write(Log.Level.Warning, "Erroneus playlist data block: {0}", line); break; } } return(plist); } }