Esempio n. 1
0
        public async Task <IActionResult> Delete(int id)
        {
            try
            {
                BaseMedia media = await _Db.Media.FindAsync(id);

                if (media == null)
                {
                    return(NotFound("The requested media file does not exist."));
                }

                // Todo: Check whether the media file is being used in the website or app
                // and prevent deletion if so.
                Dictionary <string, HashSet <string> > usages = media.GetUsages(_Db);

                // If the usages dictionary has keys, file is used
                if (usages.Count > 0)
                {
                    return(BadRequest(new ResponseHelper("This file cannot be deleted as it is in use. Remove usages and try again.")));
                }

                // Otherwise, we can go ahead and delete

                if (media is ImageMedia)
                {
                    // Delete the directory containing image versions
                    string dirPath = Path.Combine("Storage", "Media", "Images", Path.GetFileNameWithoutExtension(media.Filename));
                    try
                    {
                        Directory.Delete(dirPath, recursive: true);
                    }
                    catch (DirectoryNotFoundException)
                    {
                        _Logger.LogWarning("While deleting image {0}: Version directory not found. Continuing.", id);
                    }
                }

                // Finally, delete the media file itself
                System.IO.File.Delete(media.FilePath);

                // And remove its record in the database
                _Db.Remove(media);
                await _Db.SaveChangesAsync();

                _Logger.LogDebug("Media file {0} deleted", id);

                return(Ok());
            }
            catch (Exception ex)
            {
                _Logger.LogError("Error deleting media file {0}: {1}", id, ex.Message);
                _Logger.LogError(ex.StackTrace);
                return(BadRequest("Something went wrong, please try again later."));
            }
        }
Esempio n. 2
0
        public async Task <IActionResult> Crop(int id, CropData args)
        {
            try
            {
                if (!ModelState.IsValid)
                {
                    return(BadRequest("Invalid arguments provided to crop image."));
                }

                BaseMedia media = await _Db.Media.FindAsync(id);

                if (media == null)
                {
                    return(NotFound("The requested media file does not exist."));
                }

                ImageMedia oldImage = media as ImageMedia;
                if (oldImage == null)
                {
                    return(BadRequest("Unable to crop non-image media file."));
                }

                // Generate new GUID
                string filename = Guid.NewGuid().ToString() + Path.GetExtension(oldImage.Filename);

                // Save the file again, passing in crop data
                ImageUtils.SaveImage(await System.IO.File.ReadAllBytesAsync(oldImage.FilePath), Path.Combine("Storage", "Media", "Images", filename), args);

                ImageMedia newImage = new ImageMedia
                {
                    Title = oldImage.Title,
                    Alt   = oldImage.Alt,
                    Name  = oldImage.Name + "_cropped",
                    // other values provided by cropping code
                };

                await _Db.AddAsync(newImage);

                await _Db.SaveChangesAsync();

                _Logger.LogDebug("Media file {0} cropped - new file ID is {1}", id, newImage.Id);

                return(Ok(newImage.Id)); // Todo: may want to pass back something else here
            }
            catch (Exception ex)
            {
                _Logger.LogError("Error cropping media file {0}: {1}", id, ex.Message);
                _Logger.LogError(ex.StackTrace);
                return(BadRequest("Something went wrong, please try again later."));
            }
        }
Esempio n. 3
0
        public async Task <IActionResult> Index(string filename, int width = 0, bool original = false, bool download = false)
        {
            try
            {
                if (string.IsNullOrEmpty(filename))
                {
                    return(NotFound("No filename provided"));
                }

                BaseMedia file = await _Db.Media
                                 .Where(m => m.Filename == filename)
                                 .FirstOrDefaultAsync();

                if (file == null)
                {
                    return(NotFound("No file exists for the supplied filename"));
                }

                // If a download is requested, set the mandatory header.
                if (download)
                {
                    Response.Headers.Add(file.DownloadHeader());
                }

                // Return file if not image
                if (file.GetCategory() != MediaCategory.Image)
                {
                    //return new EmptyResult();
                    return(File(await System.IO.File.ReadAllBytesAsync(file.FilePath), file.MediaType.Mime));
                }
                else
                {
                    ImageMedia imageFile = (ImageMedia)file;
                    // Return the appropriate image
                    //return new EmptyResult();
                    return(File(await System.IO.File.ReadAllBytesAsync(imageFile.GetImagePath(width, original)), imageFile.MediaType.Mime));
                }
            }
            catch (Exception ex)
            {
                _Logger.LogError("Error retrieving file: {0}", ex.Message);
                _Logger.LogError(ex.StackTrace);
                return(BadRequest("Something went wrong, please try again later."));
            }
        }
Esempio n. 4
0
        public async Task <IActionResult> GetOne(int id)
        {
            try
            {
                BaseMedia mediaFile = await _Db.Media.FindAsync(id);

                ImageMedia imageFile = mediaFile as ImageMedia;
                AudioMedia audioFile = mediaFile as AudioMedia;
                if (mediaFile == null)
                {
                    return(NotFound("No file exists for the supplied ID"));
                }

                return(Ok(new
                {
                    mediaFile.Id,
                    mediaFile.Name,
                    mediaFile.FilePath,
                    mediaFile.Size,
                    mediaFile.MediaType,
                    Source = new {
                        showCopyright = mediaFile.ShowCopyright,
                        info = mediaFile.Source
                    },
                    fileName = mediaFile.Filename,
                    height = imageFile?.Height,
                    width = imageFile?.Width,
                    versions = imageFile?.Versions,
                    title = imageFile?.Title,
                    alt = imageFile?.Alt,
                    duration = audioFile?.Duration,
                    tags = mediaFile.Tags(),
                    usages = mediaFile.GetUsages(_Db)
                }));
            }
            catch (Exception ex)
            {
                _Logger.LogError("Error retrieving file data: {0}", ex.Message);
                _Logger.LogError(ex.StackTrace);
                return(BadRequest("Something went wrong, please try again later."));
            }
        }
Esempio n. 5
0
        public async Task <IActionResult> Update(int id, IFormCollection request)
        {
            try
            {
                BaseMedia media = await _Db.Media.FindAsync(id);

                if (media == null)
                {
                    return(NotFound("The requested media file does not exist."));
                }

                // All types of media have a name, so we can update that
                media.Name          = request.Str("name");
                media.Source        = request.Str("source");
                media.ShowCopyright = request.Bool("showCopyright");

                // If file is an image, we can also set the title and alt-text
                if (media is ImageMedia)
                {
                    (media as ImageMedia).Title = request.Str("title");
                    (media as ImageMedia).Alt   = request.Str("alt");
                }

                // Save changes
                await _Db.SaveChangesAsync();

                _Logger.LogDebug("Metadata updated for media file {0}", id);

                return(Ok());
            }
            catch (Exception ex)
            {
                _Logger.LogError("Error updating metadata for media file {0}: {1}", id, ex.Message);
                _Logger.LogError(ex.StackTrace);
                return(BadRequest("Something went wrong, please try again later."));
            }
        }
Esempio n. 6
0
        public BaseMedia CreateEmptyMP4(Mp4Metadata videoData)
        {
            var test = new BaseMedia();

            {// File type
                var ftyp = new MatrixIO.IO.Bmff.Boxes.FileTypeBox();
                ftyp.CompatibleBrands.Add("isom");
                ftyp.CompatibleBrands.Add("iso2");
                ftyp.CompatibleBrands.Add("avc1");
                ftyp.CompatibleBrands.Add("iso6");
                ftyp.CompatibleBrands.Add("mp41");
                ftyp.MajorBrand   = "isom";
                ftyp.MinorVersion = 512;
                test.Children.Add(ftyp);
            }
            {     // Movie
                var moov = new MatrixIO.IO.Bmff.Boxes.MovieBox();
                { // Movie header
                    var mvhd = new MatrixIO.IO.Bmff.Boxes.MovieHeaderBox();
                    // Leave all default, except stuff from ffmpeg that isn't the same
                    mvhd.TimeScale   = 1000;
                    mvhd.NextTrackID = 2;
                    moov.Children.Add(mvhd);
                }
                {     // Track
                    var trak = new MatrixIO.IO.Bmff.Boxes.TrackBox();
                    { // Track header
                        var tkhd = new MatrixIO.IO.Bmff.Boxes.TrackHeaderBox();
                        tkhd.Width   = MatrixIO.IO.Numerics.FixedPoint_16_16.FromDouble(videoData.Dimensions.Width);
                        tkhd.Height  = MatrixIO.IO.Numerics.FixedPoint_16_16.FromDouble(videoData.Dimensions.Height);
                        tkhd.Enabled = true;
                        tkhd.InMovie = true;
                        tkhd.TrackID = 1;
                        trak.Children.Add(tkhd);
                    }
                    {     // Media
                        var mdia = new MatrixIO.IO.Bmff.Boxes.MediaBox();
                        { // Media header
                            var mdhd = new MatrixIO.IO.Bmff.Boxes.MediaHeaderBox();
                            mdhd.TimeScale = 10240;
                            mdia.Children.Add(mdhd);
                        }
                        {// Handler
                            var hdlr = new MatrixIO.IO.Bmff.Boxes.HandlerBox();
                            hdlr.HandlerType = HDLR.TYPE_VIDEO;
                            hdlr.Name        = HDLR.NAME_VIDEO;
                            mdia.Children.Add(hdlr);
                        }
                        {     // Media information
                            var minf = new MatrixIO.IO.Bmff.Boxes.MediaInformationBox();
                            { // Video media header
                                var vmhd = new MatrixIO.IO.Bmff.Boxes.VideoMediaHeaderBox();
                                vmhd.NoLeanAhead = true;
                                minf.Children.Add(vmhd);
                            }
                            {         // Data Information
                                var dinf = new MatrixIO.IO.Bmff.Boxes.DataInformationBox();
                                {     // Data reference
                                    var dref = new MatrixIO.IO.Bmff.Boxes.DataReferenceBox();
                                    { // URL
                                        var url = new MatrixIO.IO.Bmff.Boxes.DataEntryUrlBox();
                                        url.MovieIsSelfContained = true;
                                        dref.Children.Add(url);
                                    }
                                    dinf.Children.Add(dref);
                                }
                                minf.Children.Add(dinf);
                            }
                            {         // Sample table
                                var stbl = new MatrixIO.IO.Bmff.Boxes.SampleTableBox();
                                {     // Sample description
                                    var stsd = new MatrixIO.IO.Bmff.Boxes.SampleDescriptionBox();
                                    { // Avc1
                                        var avc1 = new Avc1();
                                        avc1.VideoWidth  = (UInt16)videoData.Dimensions.Width;
                                        avc1.VideoHeight = (UInt16)videoData.Dimensions.Height;
                                        {// avcC
                                            var avcc = new AvcC();
                                            avcc.ProfileIndication        = videoData.Sps[1];
                                            avcc.Compatibility            = videoData.Sps[2];
                                            avcc.LevelIndication          = videoData.Sps[3];
                                            avcc.SequenceParameterSets    = new byte[1][];
                                            avcc.SequenceParameterSets[0] = videoData.Sps;
                                            avcc.PictureParameterSets     = new byte[1][];
                                            avcc.PictureParameterSets[0]  = videoData.Pps;
                                            avc1.Children.Add(avcc);
                                        }
                                        {// Aspect ratio
                                            var pasp = new AspectRatio();
                                            avc1.Children.Add(pasp);
                                        }
                                        stsd.Children.Add(avc1);
                                    }
                                    stbl.Children.Add(stsd);
                                }
                                {// Time to Sample
                                    var stts = new MatrixIO.IO.Bmff.Boxes.TimeToSampleBox();
                                    stbl.Children.Add(stts);
                                }
                                {// Sample to Chunk
                                    var stsc = new MatrixIO.IO.Bmff.Boxes.SampleToChunkBox();
                                    stbl.Children.Add(stsc);
                                }
                                {// Sample size
                                    var stsz = new MatrixIO.IO.Bmff.Boxes.SampleSizeBox();
                                    stbl.Children.Add(stsz);
                                }
                                {// Chunk offset
                                    var stco = new MatrixIO.IO.Bmff.Boxes.ChunkOffsetBox();
                                    stbl.Children.Add(stco);
                                }
                                minf.Children.Add(stbl);
                            }
                            mdia.Children.Add(minf);
                        }
                        trak.Children.Add(mdia);
                    }
                    moov.Children.Add(trak);
                }
                {     // Movie extends
                    var mvex = new MatrixIO.IO.Bmff.Boxes.MovieExtendsBox();
                    { // Track extends
                        var trex = new MatrixIO.IO.Bmff.Boxes.TrackExtendsBox();
                        trex.TrackID = 1;
                        trex.DefaultSampleDescriptionIndex = 1;
                        mvex.Children.Add(trex);
                    }
                    moov.Children.Add(mvex);
                }

                /*{// User data
                 *  var udta = new MatrixIO.IO.Bmff.Boxes.UserDataBox();
                 *  // TODO (e.g. ffmpeg mov_write_track_udta_tag writes title?)
                 *  moov.Children.Add(udta);
                 * }*/
                test.Children.Add(moov);
            }
            streamCursor = 0;
            foreach (var box in test.Children)
            {
                streamCursor += box.CalculateSize();
            }
            sequenceCounter = 0;
            totalCount      = 0;
            return(test);
        }