Exemple #1
0
        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);
        }
Exemple #2
0
        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);
            }
        }