QuickImage – Blame information for rev 2

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 using MimeDetective;
2 using System;
3 using System.Collections.Concurrent;
4 using System.Collections.Generic;
5 using System.Collections.Immutable;
6 using System.IO;
7 using System.Linq;
8 using System.Text;
9 using System.Threading;
10 using System.Threading.Tasks;
11 using MimeDetective.Storage;
12 using System.Security.Cryptography;
2 office 13 using MimeDetective.Engine;
14  
1 office 15 namespace QuickImage.Utilities
16 {
17 public class MagicMime
18 {
19 private static FileMutex _fileMutex;
2 office 20 private static ConcurrentDictionary<string, MagicMimeFile> _fileMime;
21 private static IContentInspector _mimeInspector;
22  
1 office 23 private MagicMime()
24 {
25 _fileMime = new ConcurrentDictionary<string, MagicMimeFile>();
26 _mimeInspector = new ContentInspectorBuilder()
27 {
28 Definitions = new MimeDetective.Definitions.ExhaustiveBuilder()
29 {
30 UsageType = MimeDetective.Definitions.Licensing.UsageType.PersonalNonCommercial
31 }.Build()
32 }.Build();
33 }
34  
35 public MagicMime(FileMutex fileMutex) :this()
36 {
37 _fileMutex = fileMutex;
38 }
39  
40 public async Task<MagicMimeFile> Identify(string fileName, CancellationToken cancellationToken)
41 {
42 await _fileMutex[fileName].WaitAsync(cancellationToken);
43 try
44 {
2 office 45 var matches = new List<DefinitionMatch>(_mimeInspector.Inspect(fileName));
46 matches.Sort(MimeInspectorDefinitionMatchComparer);
47 var definitionMatch = matches.FirstOrDefault();
1 office 48 if (definitionMatch == null)
49 {
50 return null;
51 }
52  
53 var magicMimeFile = new MagicMimeFile
54 {
55 FileName = fileName,
56 Definition = definitionMatch.Definition,
57 FileHash = Cryptography.Hashes.MD5Hash(fileName)
58 };
59  
60 _fileMime.AddOrUpdate(fileName, magicMimeFile,
61 (key, oldValue) => magicMimeFile);
62  
63 return magicMimeFile;
64 }
65 finally
66 {
67 _fileMutex[fileName].Release();
68 }
2 office 69 }
70  
71 private int MimeInspectorDefinitionMatchComparer(DefinitionMatch x, DefinitionMatch y)
72 {
73 return y.Points.CompareTo(x.Points);
74 }
75  
1 office 76 public async Task<string> GetMimeType(string fileName, CancellationToken cancellationToken)
77 {
78 var identify = await Identify(fileName, cancellationToken);
79  
80 return identify.Definition.File.MimeType;
81 }
82  
83 public MagicMimeFile Identify(string fileName, MemoryStream memoryStream, CancellationToken cancellationToken)
84 {
85 var definitionMatch = _mimeInspector.Inspect(memoryStream).FirstOrDefault();
86 if (definitionMatch == null)
87 {
88 return null;
89 }
90  
91 var magicMimeFile = new MagicMimeFile
92 {
93 FileName = fileName,
94 Definition = definitionMatch.Definition,
95 FileHash = Cryptography.Hashes.MD5Hash(fileName)
96 };
97  
98 _fileMime.AddOrUpdate(fileName, magicMimeFile,
99 (key, oldValue) => magicMimeFile);
100  
101 return magicMimeFile;
102 }
103 }
104 }