public void RemoveMediaFile(MediaFileDTO video)
        {
            string        sql     = string.Format("Delete from MediaFile where MediaFile.Id = {0}", video.Id);
            SqliteCommand command = new SqliteCommand(sql, _connection);

            command.ExecuteNonQuery();
        }
        public IEnumerable <TV_ProgramDTO> GetPrograms()
        {
            List <TV_ProgramDTO> programsToReturn = new List <TV_ProgramDTO>();
            SqliteCommand        command          = new SqliteCommand(
                "select TVProgram.Id as 'TVProgramId', TVProgram.name as 'ProgramName', " +
                "TVProgram.Description, TVProgram.Actors, TVProgram.YearEstablished, TVProgram.AvatarSourcePath, " +
                "MediaFile.Id as 'MediaFileId', MediaFile.name as 'MediaFileName', MediaFile.CompleteName, " +
                "MediaFile.Format, MediaFile.FrameSize, MediaFile.TimingInFrames, MediaFile.Program_Id " +
                "from TVProgram left join MediaFile on MediaFile.Program_Id = TVProgram.Id order by TVProgram.Id", _connection);
            SqliteDataReader reader         = command.ExecuteReader();;
            int           PreviousProgramId = -1;
            TV_ProgramDTO newProgram        = new TV_ProgramDTO();

            while (reader.Read())
            {
                if (!reader.HasRows)
                {
                    break;
                }

                // Загружаем программы.
                // Т.к. используется left join, то возможны ситуации когда одна и та же программа содержит 2 видео.
                // Что бы избежать дублирования введена проверка (запоминаем предыдущий Id и сравниваем с текущим)
                // 1Program 1Media <--Программу добавляем
                // 1Program 2Media <--Программу игнорируем
                // Принимается что -1 это первый запуск
                // При этом учитывается что произведена сортировка по восходящей по полю Id - "order by TVProgram.Id"
                int currentProgramId = int.Parse(reader["TVProgramId"].ToString());
                if (PreviousProgramId != currentProgramId || PreviousProgramId == -1)
                {
                    newProgram                  = new TV_ProgramDTO();
                    newProgram.Id               = int.Parse(reader["TVProgramId"].ToString());
                    newProgram.Name             = reader["ProgramName"].ToString();
                    newProgram.Description      = reader["Description"].ToString();
                    newProgram.Actors           = reader["Actors"].ToString();
                    newProgram.AvatarSourcePath = reader["AvatarSourcePath"].ToString();
                    PreviousProgramId           = currentProgramId;
                    int.TryParse(reader["YearEstablished"].ToString(), out int tempYear);
                    newProgram.YearEstablished = tempYear;
                    programsToReturn.Add(newProgram);
                }

                //Добавляем зависимые видеозаписи
                if (!string.IsNullOrEmpty(reader["MediaFileId"].ToString()))
                {
                    MediaFileDTO newMediaFile = new MediaFileDTO();
                    newMediaFile.Id           = int.Parse(reader["MediaFileId"].ToString());
                    newMediaFile.Name         = reader["MediaFileName"].ToString();
                    newMediaFile.CompleteName = reader["CompleteName"].ToString();
                    newMediaFile.Format       = reader["Format"].ToString();
                    newMediaFile.FrameSize    = reader["FrameSize"].ToString();
                    int.TryParse(reader["TimingInFrames"].ToString(), out int tempFrames);
                    newMediaFile.TimingInFrames    = tempFrames;
                    newMediaFile.ParentTvProgramId = int.Parse(reader["Program_Id"].ToString());
                    newProgram.MediaFiles.Add(newMediaFile);
                }
            }
            return(programsToReturn);
        }
        private void DeleteVideoBtn_Click(object sender, RoutedEventArgs e)
        {
            Button       clickedBtn    = sender as Button;
            MediaFileDTO mediaToDelete = clickedBtn.DataContext as MediaFileDTO;

            _dataProvider.RemoveMediaFile(mediaToDelete);
            SelectedProgram.MediaFiles.Remove(mediaToDelete);
            SelectedProgramChanged();
        }
        public async void AddVideoFileAsync(MediaFileDTO video)
        {
            if (!IsMediaDataValid(video))
            {
                throw new FormatException("Поступило некорректное значение");
            }

            string sql = string.Format(
                "insert into MediaFile('Name', 'CompleteName', 'Format', 'FrameSize', TimingInFrames, Program_Id) " +
                "values ('{0}', '{1}', '{2}', '{3}', {4}, '{5}'); SELECT last_insert_rowid();",
                video.Name, video.CompleteName, video.Format, video.FrameSize, video.TimingInFrames, video.ParentTvProgramId);
            SqliteCommand command           = new SqliteCommand(sql, _connection);
            object        lastInsertedRowId = await command.ExecuteScalarAsync();

            video.Id = Convert.ToInt32(lastInsertedRowId);
        }
        private async void AddVideosAsync(string[] Files)
        {
            TV_ProgramDTO parentProgram = SelectedProgram;

            foreach (string file in Files)
            {
                if (!_mediaInfoProvider.IsMediaFile(file))
                {
                    continue;
                }

                await Task.Run(() =>
                {
                    MediaFileDTO video      = _mediaInfoProvider.GetMediaFileInfo(file, SelectedProgram);
                    video.ParentTvProgramId = parentProgram.Id;
                    App.Current.Dispatcher.Invoke(() => parentProgram.MediaFiles.Add(video));
                    App.Current.Dispatcher.Invoke(() => _dataProvider.AddVideoFileAsync(video));
                });
            }
            SelectedProgramChanged();
        }
 private bool IsMediaDataValid(MediaFileDTO video)
 {
     return(true); //В рамках ТЗ не требуется, но в проекте я бы реализовал
 }