Пример #1
0
        public Task <bool> SaveVideoFileAsync(TvItem tvItem, IFormFile file)
        {
            string     filename = tvItem.ID + "_" + Guid.NewGuid() + Path.GetExtension(file.FileName);
            TvItemFile itemFile = new TvItemFile()
            {
                FileName = filename,
                Length   = file.Length,
                TvItemId = tvItem.ID
            };

            using (var fileStream = new FileStream(itemFile.AbsolutePath, FileMode.Create))
            {
                file.CopyTo(fileStream);
            }

            if (tvItem.Duration == 0)
            {
                throw new Exception("Video duration is 0s.");
            }

            Context.Add(itemFile);
            Context.SaveChanges();

            return(Task.FromResult(true));
        }
Пример #2
0
 public McFileInfo(TvItemFile itemFile, int dur)
 {
     filename      = itemFile.FileName;
     length        = itemFile.Length;
     mainContentID = itemFile.TvItemId;
     duration      = dur;
     fullPath      = itemFile.FullUrl(true);
     thumb300Path  = fullPath;
 }
Пример #3
0
        public Task <bool> SaveImageFilesAsync(TvItem item, List <IFormFile> modelFiles)
        {
            foreach (IFormFile formFile in modelFiles)
            {
                Image <Rgba32> image       = null;
                Stream         inputStream = formFile.OpenReadStream();

                image = Image.Load(inputStream);

                double height = image.Height;
                double width  = image.Width;
                double k1     = width / Constants.MAX_IMAGE_WIDTH;
                double k2     = height / Constants.MAX_IMAGE_HEIGHT;
                if (k1 > k2 && k1 > 1)
                {
                    image.Mutate(x => x.Resize(Constants.MAX_IMAGE_WIDTH, (int)(height / k1)));
                }

                if (k1 < k2 && k2 > 1)
                {
                    image.Mutate(x => x.Resize((int)(width / k2), Constants.MAX_IMAGE_HEIGHT));
                }

                string     extension = Path.GetExtension(formFile.FileName) ?? "";
                string     filename  = item.ID + "_" + Guid.NewGuid() + extension;
                TvItemFile itemFile  = new TvItemFile()
                {
                    FileName = filename,
                    Length   = formFile.Length,
                    TvItemId = item.ID
                };

                using (var fileStream = new FileStream(itemFile.AbsolutePath, FileMode.Create))
                {
                    if (extension.ToLower().EndsWith("jpg") || extension.ToLower().EndsWith("jpeg"))
                    {
                        image.SaveAsJpeg(fileStream);
                    }
                    else if (extension.ToLower().EndsWith("png"))
                    {
                        image.SaveAsPng(fileStream);
                    }
                    else
                    {
                        throw new Exception($"Unsupported image file extension [{extension}].");
                    }

                    itemFile.Length = fileStream.Length;
                    Context.Add(itemFile);
                }
            }

            Context.SaveChanges();

            return(Task.FromResult(true));
        }
Пример #4
0
        public Task <TvItemFile> FetchTvItemFileAsync(int fileId)
        {
            TvItemFile itemFile = Context.TvItemFile.FirstOrDefault(x => x.ID == fileId);

            if (itemFile == null)
            {
                throw new Exception($"Item not found with fileId {fileId}.");
            }

            return(Task.FromResult(itemFile));
        }
Пример #5
0
        public async Task <IActionResult> DeleteFile(int id)
        {
            TvItemFile itemFile = await _tvItemService.FetchTvItemFileAsync(id);

            TvItem item = await _tvItemService.FetchTvItemAsync(itemFile.TvItemId);

            await _tvItemService.DeleteTvItemFileAsync(id);

            await _eventService.AddWebServerLogAsync(
                User.Identity.Name,
                WebServerLogType.ItemDeleteSingleFile,
                $"User deleted file[{itemFile.FileName}] for item [{item.GetDetailHyperlink(false)}] with id [{item.ID}].",
                item.ID);

            return(RedirectToAction(nameof(Edit), new { id = item.ID }));
        }
Пример #6
0
        public static string GetFileSize(TvItemFile item)
        {
            long size = item.Length;

            string[] sizes = { "B", "KB", "MB", "GB", "TB" };
            int      order = 0;

            while (size >= 1024 && order < sizes.Length - 1)
            {
                order++;
                size = size / 1024;
            }

            // Adjust the format string to your preferences. For example "{0:0.#}{1}" would
            // show a single decimal place, and no space.
            return(String.Format("{0:0.##} {1}", size, sizes[order]));
        }
Пример #7
0
        public Task DeleteTvItemFileAsync(int fileId)
        {
            TvItemFile tvItemFile = Context.TvItemFile.SingleOrDefault(m => m.ID == fileId);

            if (tvItemFile == null)
            {
                throw new Exception($"Item not found with id {fileId}.");
            }
            Console.WriteLine($"deleting file: {tvItemFile.FileName}");

            _fileService.DeletePhysicalFileAsync(tvItemFile.AbsolutePath);
            tvItemFile.Deleted = true;

            Context.TvItemFile.Update(tvItemFile);
            Context.SaveChanges();

            return(Task.CompletedTask);
        }
Пример #8
0
        public Task <List <TvItemFile> > FindZombieFilesAsync()
        {
            // file types in files directory:
            // 1. TvItem is not deleted: doesnt matter about its files yet
            // 2. TvItem is  deleted and file is:
            //      existing and deleted == true -> zombie, unsuccessful first delete
            //      existing and deleted == false -> not yet zombie, must call tvItem delete files, only tvitem was deleted
            //      existing and no record -> zombie
            //      non existing and deleted == true -> OK
            //      non existing and deleted == false -> OK, but must call delete files to change property 'deleted'

            DirectoryInfo d = new DirectoryInfo(Path.Combine(Constants.WEB_ROOT_PATH, Constants.FILES_DIR));

            FileInfo[]        files       = d.GetFiles();
            List <TvItemFile> tvItemFiles = Context.TvItemFile.ToList();

            List <TvItemFile> zombieFiles = new List <TvItemFile>();

            foreach (FileInfo file in files)
            {
                if (!file.Name.Equals(".gitignore"))
                {
                    // case 1: file that was unsuccessfully deleted
                    TvItemFile zombie = tvItemFiles.FirstOrDefault(tf => tf.FileName.Equals(file.Name) && tf.Deleted == true);
                    if (zombie != null)
                    {
                        zombieFiles.Add(zombie);
                    }
                    else
                    {
                        if (!tvItemFiles.Any(tf => tf.FileName.Equals(file.Name)))
                        {
                            // case 2: existing and no record, delete immediately
                            bool result = DeletePhysicalFileAsync(file.Name).Result;
                        }
                    }
                }
            }

            return(Task.FromResult(zombieFiles));
        }
Пример #9
0
        public Task <bool> ReplaceVideoFileAsync(TvItem tvItem, IFormFile file)
        {
            string     filename    = tvItem.ID + "_" + Guid.NewGuid() + Path.GetExtension(file.FileName);
            TvItemFile newItemFile = new TvItemFile()
            {
                FileName = filename,
                Length   = file.Length
            };

            using (var fileStream = new FileStream(newItemFile.AbsolutePath, FileMode.Create))
            {
                file.CopyTo(fileStream);
            }

            if (tvItem.Duration == 0)
            {
                throw new Exception("Video duration is 0s.");
            }

            TvItemFile tvItemFile = tvItem.Files.FirstOrDefault();

            if (tvItemFile != null)
            {
                bool success = DeletePhysicalFileAsync(tvItemFile.FileName).Result;
                // if not successful delete, then new zombie file

                tvItemFile.FileName = newItemFile.FileName;
                tvItemFile.Length   = newItemFile.Length;

                Context.Update(tvItemFile);
                Context.Update(tvItem);
                Context.SaveChanges();

                return(Task.FromResult(true));
            }
            else
            {
                throw new Exception($"TvItem with id {tvItem.ID} does not have any files.");
            }
        }
Пример #10
0
        /// <summary>
        /// Removing specific file. If the file does not exist, then it is still a success.
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        public Task <bool> DeletePhysicalFileAsync(string filename)
        {
            TvItemFile file = new TvItemFile()
            {
                FileName = filename
            };

            try
            {
                if (File.Exists(file.AbsolutePath))
                {
                    File.Delete(file.AbsolutePath);
                    Console.WriteLine($"successfully deleted file: {filename}");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return(Task.FromResult(false));
            }

            return(Task.FromResult(true));
        }
Пример #11
0
        public Task AddFileRequestEventAsync(string sourceIp, string filename)
        {
            TvItemFile itemFile = _tvItemService.FetchTvItemFileAsync(filename).Result;

            if (itemFile != null)
            {
                WebClientLog wcl = new WebClientLog()
                {
                    Source       = sourceIp,
                    TimeInserted = DateTime.Now,
                    TvItemFileId = itemFile.ID,
                    TvScreenId   = KnownTvScreens.FirstOrDefault(x => x.IpAddress.Equals(sourceIp))?.ID,
                    Type         = itemFile.IsVideoFile() ? WebClientLogType.VideoRequest : WebClientLogType.ImageRequest
                };

                Context.Add(wcl);
                Context.SaveChanges();
                Console.WriteLine($"adding file request from ip {sourceIp} for file: " + wcl);
            }
            else
            {
                WebClientLog wcl = new WebClientLog()
                {
                    Source       = sourceIp,
                    TimeInserted = DateTime.Now,
                    Message      = $"file with filename [{filename}] not found!",
                    Type         = WebClientLogType.Exception
                };

                Context.Add(wcl);
                Context.SaveChanges();
                Console.WriteLine("file not found on file request: " + wcl);
            }

            return(Task.CompletedTask);
        }
Пример #12
0
        public Task <TvItemFile> FetchTvItemFileAsync(string filename)
        {
            TvItemFile itemFile = Context.TvItemFile.FirstOrDefault(x => x.FileName.Equals(filename));

            return(Task.FromResult(itemFile));
        }
Пример #13
0
        public Task <bool> ReplaceImageFileAsync(TvItem tvItem, IFormFile formFile)
        {
            Image <Rgba32> image       = null;
            Stream         inputStream = formFile.OpenReadStream();

            image = Image.Load(inputStream);

            double height = image.Height;
            double width  = image.Width;
            double k1     = width / Constants.MAX_IMAGE_WIDTH;
            double k2     = height / Constants.MAX_IMAGE_HEIGHT;

            if (k1 > k2 && k1 > 1)
            {
                image.Mutate(x => x.Resize(Constants.MAX_IMAGE_WIDTH, (int)(height / k1)));
            }

            if (k1 < k2 && k2 > 1)
            {
                image.Mutate(x => x.Resize((int)(width / k2), Constants.MAX_IMAGE_HEIGHT));
            }

            string     extension   = Path.GetExtension(formFile.FileName) ?? "";
            string     filename    = tvItem.ID + "_" + Guid.NewGuid() + extension;
            TvItemFile newItemFile = new TvItemFile()
            {
                FileName = filename,
                Length   = formFile.Length,
                TvItemId = tvItem.ID
            };

            using (var fileStream = new FileStream(newItemFile.AbsolutePath, FileMode.Create))
            {
                if (extension.ToLower().EndsWith("jpg") || extension.ToLower().EndsWith("jpeg"))
                {
                    image.SaveAsJpeg(fileStream);
                }
                else if (extension.ToLower().EndsWith("png"))
                {
                    image.SaveAsPng(fileStream);
                }
                else
                {
                    throw new Exception($"Unsupported image file extension [{extension}].");
                }
                newItemFile.Length = fileStream.Length;
            }

            TvItemFile tvItemFile = tvItem.Files.FirstOrDefault();

            if (tvItemFile != null)
            {
                bool success = DeletePhysicalFileAsync(tvItemFile.FileName).Result;
                // if not successfull delete, then new zombie file

                tvItemFile.FileName = newItemFile.FileName;
                tvItemFile.Length   = newItemFile.Length;

                Context.Update(tvItemFile);
                Context.Update(tvItem);
                Context.SaveChanges();

                return(Task.FromResult(true));
            }
            else
            {
                throw new Exception($"TvItem with id {tvItem.ID} does not have any files.");
            }
        }