コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }