using Microsoft.AspNetCore.Mvc; using Microsoft.Data.SqlClient; using Docnet.Core; using Docnet.Core.Models; using Docnet.Core.Readers; using SkiaSharp; using System.Runtime.InteropServices; namespace Library.Controllers; public class RepositoryController : PageController { public RepositoryController( ILogger logger , IConfiguration configuration ) : base( logger , configuration ) { } public IActionResult Cover( string? id ) { Trace( "/Repository/Cover" ); if ( id?.Length != 32 ) return RawText( "No such cover!" ); using SqlDataReader reader = PrepareSQL( @"SELECT uuid,data_format FROM gnm WHERE uuid=@uuid" ) .AddParameter( "@uuid" , id ) .ExecuteReader( ); if ( !reader.Read( ) ) return RawText( "No such cover!" ); if ( System.IO.File.Exists( GetDataDirectory( ) + id + ".jpg" ) ) { byte [] bytes = System.IO.File.ReadAllBytes( GetDataDirectory( ) + id + ".jpg"); HttpContext.Response.Headers.ContentDisposition = "inline;filename=" + id + ".jpg"; return File( bytes , System.Net.Mime.MediaTypeNames.Image.Jpeg ); } return RawText( "No such cover!" ); } public IActionResult Video( string? id ) { Trace( "/Repository/Video" ); if ( id?.Length != 32 ) return RawText( "No such video!" ); if ( GetUserData( ) != null && !GetUserData( )!.IsAdmin ) { SqlDataReader reader_u = PrepareSQL( @"update gnm_rec set cnt = isnull(cnt,0) + 1 where gnm_rec.uuid = @uuid") .AddParameter( "@uuid" , id ) .ExecuteReader( ); reader_u.Close( ); } using SqlDataReader reader = PrepareSQL( @"SELECT uuid,data_format FROM gnm_rec WHERE uuid=@uuid and data_format='mp4'" ) .AddParameter( "@uuid" , id ) .ExecuteReader( ); if ( !reader.Read( ) ) return RawText( "No such file!" ); byte [] bytes = System.IO.File.ReadAllBytes( GetDataDirectory( ) + id + ".mp4"); HttpContext.Response.Headers.ContentDisposition = "inline;filename=" + id + ".mp4"; return File( bytes , "video/mp4" ); } private string? ReadPDFTitle( string id ) { AssertLogin( id ); if ( id.Length != 32 ) return null; using SqlDataReader reader = PrepareSQL( @"SELECT gnm.ime FROM gnm_rec left join gnm on gnm.id = gnm_rec.idgnm WHERE gnm_rec.uuid = @uuid and gnm_rec.data_format = 'pdf'" ) .AddParameter( "@uuid" , id ) .ExecuteReader( ); if ( !reader.Read( ) ) return null; return reader.String( 0 ); } private byte[]? ReadPDFBytes( string id ) { // return System.IO.File.ReadAllBytes( "c:/Users/gbromov/Downloads/3950.pdf" ); return System.IO.File.ReadAllBytes( GetDataDirectory( ) + id + ".pdf" ); } private IActionResult RenderPDFPage( string id , int page , int width , int height ) { if ( ReadPDFTitle( id ) == null ) return RawText( "No such file!" ); byte[]? bytes = ReadPDFBytes( id ); if ( bytes == null ) return RawText( "No such file!" ); using IDocReader doc_reader = DocLib.Instance.GetDocReader( bytes , new PageDimensions( width , height ) ); using IPageReader page_reader = doc_reader.GetPageReader( page ); byte [] rgb_bytes = page_reader.GetImage( ); width = page_reader.GetPageWidth( ); height = page_reader.GetPageHeight( ); GCHandle data_handle = GCHandle.Alloc( rgb_bytes , GCHandleType.Pinned ); SKImageInfo info = new( width , height , SKColorType.Bgra8888 , SKAlphaType.Unpremul ); using SKBitmap bitmap = new( ); bitmap.InstallPixels( info , data_handle.AddrOfPinnedObject( ) , info.RowBytes , delegate { data_handle.Free( ); } , null ); using SKBitmap background = new( width , height , SKColorType.Bgra8888 , SKAlphaType.Opaque ); background.Erase( new SKColor( 255 , 255 , 255 ) ); using SKCanvas canvas = new(background); canvas.DrawBitmap( bitmap , 0 , 0 , SKSamplingOptions.Default ); using SKData bitmap_data = background.Encode( SKEncodedImageFormat.Jpeg , 80 ); byte [] bitmap_data_array = bitmap_data.ToArray( ); return File( bitmap_data_array , System.Net.Mime.MediaTypeNames.Image.Jpeg ); } [Route( "Repository/PDFPage/{id}/{page?}" )] public IActionResult PDFPage( string id , int page = 0 ) { Trace( "/Repository/PDFPage" ); return RenderPDFPage( id , page , 1080 , 1920 ); } [Route( "Repository/PDFThumb/{id}/{page?}" )] public IActionResult PDFThumb( string id , int page = 0 ) { Trace( "/Repository/PDFPage" ); return RenderPDFPage( id , page , 135 , 240 ); } [Route( "Repository/PDFView/{id}" )] public IActionResult PDFView( string id ) { Trace( "/Repository/PDFView" ); string? pdf_title = ReadPDFTitle( id ); if ( pdf_title == null ) throw new RedirectException( "/" ); byte[]? bytes = ReadPDFBytes( id ); if ( bytes == null ) throw new RedirectException( "/" ); // if ( GetUserData( ) != null && !GetUserData( )!.IsAdmin ) --- и админа, и всеки може да отваря PDF --- increment counter { SqlDataReader reader_u = PrepareSQL( @"update gnm_rec set cnt = isnull(cnt,0) + 1 where gnm_rec.uuid = @uuid") .AddParameter( "@uuid" , id ) .ExecuteReader( ); reader_u.Close( ); } using IDocReader doc_reader = DocLib.Instance.GetDocReader( bytes , new PageDimensions( 1080 , 1920 ) ); int page_count = doc_reader.GetPageCount( ); return View( new Models.PDFViewModel( GetDBConnection( ) , id , page_count ) { Title = pdf_title } ); } public IActionResult PDF( string? id ) { Trace( "/Repository/PDF" ); AssertLogin( id ); if ( id?.Length != 32 ) return RawText( "No such file!" ); using SqlDataReader reader = PrepareSQL( @"SELECT gnm.access, gnm_rec.uuid, gnm_rec.data_format FROM gnm_rec left join gnm on gnm.id = gnm_rec.idgnm WHERE gnm_rec.uuid = @uuid and gnm_rec.data_format = 'pdf'" ) .AddParameter( "@uuid" , id ) .ExecuteReader( ); if ( !reader.Read( ) ) return RawText( "No such file!" ); byte [] bytes = System.IO.File.ReadAllBytes( GetDataDirectory( ) + id + ".pdf"); HttpContext.Response.Headers.ContentDisposition = "inline;filename=" + id + ".pdf"; return File( bytes , System.Net.Mime.MediaTypeNames.Application.Pdf ); } public IActionResult Image( string? id ) { Trace( "/Repository/Image" ); if ( id?.Length != 32 ) return RawText( "No such image!" ); if ( GetUserData( ) != null && !GetUserData( )!.IsAdmin ) { SqlDataReader reader_u = PrepareSQL( @"update gnm_rec set cnt = isnull(cnt,0) + 1 where gnm_rec.uuid = @uuid") .AddParameter( "@uuid" , id ) .ExecuteReader( ); reader_u.Close( ); } using SqlDataReader reader = PrepareSQL( @"SELECT uuid,data_format FROM gnm_rec WHERE uuid=@uuid and data_format='jpg'" ) .AddParameter( "@uuid" , id ) .ExecuteReader( ); if ( !reader.Read( ) ) return RawText( "No such file!" ); byte [] bytes = System.IO.File.ReadAllBytes( GetDataDirectory( ) + id + ".jpg"); HttpContext.Response.Headers.ContentDisposition = "inline;filename=" + id + ".jpg"; return File( bytes , System.Net.Mime.MediaTypeNames.Image.Jpeg ); } }