public EditTags GetEditTags() { var editTags = new EditTags { VideoFileIDs = new List <int>(), Tags = new Dictionary <string, string>() }; var count = GetInt(); for (var ctr = 0; ctr < count; ++ctr) { editTags.VideoFileIDs.Add(GetInt()); } count = GetInt(); for (var ctr = 0; ctr < count; ++ctr) { editTags.Tags[GetString()] = GetString(); } return(editTags); }
async void EditTags(EditTags editTags) { var tags = await Database.GetAsync <Tag>(); tags.AddRange(editTags.Tags.Keys.Except(tags.Select(tag => tag.Name), StringComparer.OrdinalIgnoreCase).Select(name => new Tag { Name = name })); tags.Where(tag => tag.TagID == 0).ForEach(async tag => await Database.AddOrUpdateAsync(tag)); var tagIDs = tags.ToDictionary(tag => tag.Name, tag => tag.TagID, StringComparer.OrdinalIgnoreCase); var tagValues = (await Database.GetAsync <TagValue>()).GroupBy(tagValue => tagValue.VideoFileID).ToDictionary(group => group.Key, group => group.ToDictionary(tagValue => tagValue.TagID)); foreach (var videoFileID in editTags.VideoFileIDs) { foreach (var tag in editTags.Tags) { var tagID = tagIDs[tag.Key]; TagValue tagValue = null; if ((tagValues.ContainsKey(videoFileID)) && (tagValues[videoFileID].ContainsKey(tagID))) { tagValue = tagValues[videoFileID][tagID]; } else { tagValue = new TagValue { VideoFileID = videoFileID, TagID = tagID } }; if (string.Equals(tagValue.Value, tag.Value, StringComparison.OrdinalIgnoreCase)) { continue; } if (!string.IsNullOrWhiteSpace(tag.Value)) { tagValue.Value = tag.Value; await Database.AddOrUpdateAsync(tagValue); } else if (tagValue.TagValueID != 0) { await Database.DeleteAsync(tagValue); } } } await Database.ExecuteNonQueryAsync("DELETE FROM Tag WHERE TagID NOT IN (SELECT TagID FROM TagValue)"); UpdateVideoFiles(); } async void DeleteVideos(List <int> videoFileIDs) { var videoFiles = await Database.GetVideoFilesAsync(videoFileIDs); foreach (var videoFile in videoFiles) { await Database.DeleteAsync(videoFile); if (!(await Database.GetAsync <Deleted>($"Identifier = '{videoFile.Identifier}'")).Any()) { await Database.AddOrUpdateAsync(new Deleted { Identifier = videoFile.Identifier }); } File.Delete(Path.Combine(Settings.VideosPath, videoFile.FileName)); } UpdateVideoFiles(); } void SetVolume(int volume, bool relative) => Volume = (relative ? Volume : 0) + volume; void QueueVideos(List <int> videoFileIDs, string op) { var queueDict = queue.ToDictionary(videoFile => videoFile.VideoFileID); if ((op == "PlayNext") && (VideoState != null)) { videoFileIDs.Remove(CurrentVideo.VideoFileID); } var positions = Enumerable.Range(0, videoFileIDs.Count).ToDictionary(index => videoFileIDs[index], index => index); var videoFiles = Database.GetVideoFilesAsync(videoFileIDs).Result.OrderBy(videoFile => positions[videoFile.VideoFileID]).ToList(); if ((op == "AudioOnly") || (op == "VideoAndAudio")) { for (var ctr = 0; ctr < videoFiles.Count;) { videoFiles[ctr].AudioOnly = op == "AudioOnly"; Database.SaveVideoFileAsync(videoFiles[ctr]).Wait(); if (queueDict.ContainsKey(videoFiles[ctr].VideoFileID)) { var index = queue.IndexOf(queueDict[videoFiles[ctr].VideoFileID]); queue[index] = videoFiles[ctr]; queueDict[videoFiles[ctr].VideoFileID] = videoFiles[ctr]; videoFiles.RemoveAt(ctr); } else { ++ctr; } } UpdateVideoFiles(); } if ((op == "PlayNext") || ((op == "Toggle") && (videoFiles.Any(videoFile => queueDict.ContainsKey(videoFile.VideoFileID))))) { var oldFirst = queue.FirstOrDefault(); videoFiles.Where(videoFile => queueDict.ContainsKey(videoFile.VideoFileID)).ForEach(videoFile => queue.Remove(queueDict[videoFile.VideoFileID])); if (oldFirst != queue.FirstOrDefault()) { VideoState = null; } if (op == "Toggle") { return; } } var addIndex = op != "PlayNext" ? queue.Count : VideoState == null ? 0 : 1; foreach (var videoFile in videoFiles) { queue.Insert(addIndex++, videoFile); } }