parent
357245a9eb
commit
a9e181425b
@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace NzbDrone.Core.Books.Calibre
|
||||
{
|
||||
// see https://github.com/kovidgoyal/calibre/blob/876290c600b26d6ce915c5449c641d98053b9037/src/calibre/utils/imghdr.py#L16
|
||||
public static class CalibreImageValidator
|
||||
{
|
||||
private static readonly byte[] JFIF = Encoding.ASCII.GetBytes("JFIF");
|
||||
private static readonly byte[] EXIF = Encoding.ASCII.GetBytes("Exif");
|
||||
private static readonly byte[] BIM = Encoding.ASCII.GetBytes("8BIM");
|
||||
private static readonly byte[] JPEG_MARKER = new byte[] { 255, 216 };
|
||||
|
||||
private static readonly byte[] GIF87 = Encoding.ASCII.GetBytes("GIF87a");
|
||||
private static readonly byte[] GIF89 = Encoding.ASCII.GetBytes("GIF89a");
|
||||
|
||||
private static readonly byte[] PNG = new byte[] { 137, 80, 78, 71, 13, 10, 26, 10 };
|
||||
|
||||
public static bool IsValidImage(byte[] data)
|
||||
{
|
||||
//jpeg
|
||||
var jpegRange = data.Skip(6).Take(4);
|
||||
|
||||
if (jpegRange.SequenceEqual(JFIF) ||
|
||||
jpegRange.SequenceEqual(EXIF))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (data.Take(2).SequenceEqual(JPEG_MARKER))
|
||||
{
|
||||
for (var i = 0; i < 28; i++)
|
||||
{
|
||||
var sub = data.Skip(i).Take(4);
|
||||
if (sub.SequenceEqual(JFIF) || sub.SequenceEqual(BIM))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// png
|
||||
if (data.Take(8).SequenceEqual(PNG))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// gif (not supported by calibre)
|
||||
var gifRange = data.Take(6);
|
||||
if (gifRange.SequenceEqual(GIF87) ||
|
||||
gifRange.SequenceEqual(GIF89))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// last ditch jpeg
|
||||
if (data.Take(2).SequenceEqual(JPEG_MARKER))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in new issue