diff options
author | pacien | 2023-02-17 22:57:38 +0100 |
---|---|---|
committer | pacien | 2023-02-17 22:57:38 +0100 |
commit | 46cd42de44e402fbf33522d999fa2649729ffaa8 (patch) | |
tree | 1281beefda5d9b6d2411bc47ec1327fbf0b38dde /compiler/src | |
parent | 11bbbae2850b9c45da697a8ed9626495a50a38c0 (diff) | |
parent | e939712a284dff9af6d81cc1fcd4e7f7ec9ad503 (diff) | |
download | ldgallery-2.2.tar.gz |
Merge branch 'develop': release v2.2v2.2
Diffstat (limited to 'compiler/src')
-rw-r--r-- | compiler/src/Compiler.hs | 6 | ||||
-rw-r--r-- | compiler/src/FileProcessors.hs | 24 | ||||
-rw-r--r-- | compiler/src/Input.hs | 6 | ||||
-rw-r--r-- | compiler/src/ItemProcessors.hs | 5 | ||||
-rw-r--r-- | compiler/src/Resource.hs | 16 |
5 files changed, 39 insertions, 18 deletions
diff --git a/compiler/src/Compiler.hs b/compiler/src/Compiler.hs index 4111f02..d92d8e9 100644 --- a/compiler/src/Compiler.hs +++ b/compiler/src/Compiler.hs | |||
@@ -85,7 +85,8 @@ loadGalleryIndex path = | |||
85 | doesFileExist path >>= bool (return Nothing) decodeIndex | 85 | doesFileExist path >>= bool (return Nothing) decodeIndex |
86 | where | 86 | where |
87 | decodeIndex = | 87 | decodeIndex = |
88 | JSON.eitherDecodeFileStrict path | 88 | putStrLn ("Loading previous index:\t" ++ path) |
89 | >> JSON.eitherDecodeFileStrict path | ||
89 | >>= either (\err -> warn err >> return Nothing) (return . Just) | 90 | >>= either (\err -> warn err >> return Nothing) (return . Just) |
90 | warn = putStrLn . ("Warning:\tUnable to reuse existing index as cache: " ++) | 91 | warn = putStrLn . ("Warning:\tUnable to reuse existing index as cache: " ++) |
91 | 92 | ||
@@ -136,10 +137,13 @@ compileGallery configPath inputDirPath outputDirPath outputIndexPath excludedDir | |||
136 | do | 137 | do |
137 | config <- readConfig $ inputGalleryConf configPath | 138 | config <- readConfig $ inputGalleryConf configPath |
138 | 139 | ||
140 | putStrLn "Inventorying input files" | ||
139 | inputDir <- readDirectory inputDirPath | 141 | inputDir <- readDirectory inputDirPath |
140 | excludedCanonicalDirs <- mapM canonicalizePath excludedDirs | 142 | excludedCanonicalDirs <- mapM canonicalizePath excludedDirs |
143 | |||
141 | let sourceFilter = galleryDirFilter config excludedCanonicalDirs | 144 | let sourceFilter = galleryDirFilter config excludedCanonicalDirs |
142 | let sourceTree = filterDir sourceFilter inputDir | 145 | let sourceTree = filterDir sourceFilter inputDir |
146 | putStrLn "Reading input metadata" | ||
143 | inputTree <- readInputTree sourceTree | 147 | inputTree <- readInputTree sourceTree |
144 | let curatedInputTree = filterInputTree (inputTreeFilter config) inputTree | 148 | let curatedInputTree = filterInputTree (inputTreeFilter config) inputTree |
145 | 149 | ||
diff --git a/compiler/src/FileProcessors.hs b/compiler/src/FileProcessors.hs index 6e1738e..78e7351 100644 --- a/compiler/src/FileProcessors.hs +++ b/compiler/src/FileProcessors.hs | |||
@@ -100,17 +100,35 @@ type FileDescriber a = | |||
100 | 100 | ||
101 | getImageResolution :: FilePath -> IO Resolution | 101 | getImageResolution :: FilePath -> IO Resolution |
102 | getImageResolution fsPath = | 102 | getImageResolution fsPath = |
103 | readProcess "magick" ["identify", "-format", "%w %h", firstFrame] [] | 103 | readProcess "magick" |
104 | >>= parseResolution . break (== ' ') | 104 | [ "identify" |
105 | , "-ping" | ||
106 | , "-format", "%[orientation] %w %h" | ||
107 | , firstFrame | ||
108 | ] [] | ||
109 | >>= parseOutput . words | ||
110 | |||
105 | where | 111 | where |
106 | firstFrame :: FilePath | 112 | firstFrame :: FilePath |
107 | firstFrame = fsPath ++ "[0]" | 113 | firstFrame = fsPath ++ "[0]" |
108 | 114 | ||
115 | -- Flip the dimensions when necessary according to the metadata. | ||
116 | -- ImageMagick's `-auto-orient` flag does the same, but isn't compatible | ||
117 | -- with `-ping` and causes the whole image file to be loaded. | ||
118 | parseOutput :: [String] -> IO Resolution | ||
119 | parseOutput ["RightTop", w, h] = parseResolution (h, w) | ||
120 | parseOutput ["LeftBottom", w, h] = parseResolution (h, w) | ||
121 | parseOutput [_, w, h] = parseResolution (w, h) | ||
122 | parseOutput _ = throwIO failedRead | ||
123 | |||
109 | parseResolution :: (String, String) -> IO Resolution | 124 | parseResolution :: (String, String) -> IO Resolution |
110 | parseResolution (widthString, heightString) = | 125 | parseResolution (widthString, heightString) = |
111 | case (readMaybe widthString, readMaybe heightString) of | 126 | case (readMaybe widthString, readMaybe heightString) of |
112 | (Just w, Just h) -> return $ Resolution w h | 127 | (Just w, Just h) -> return $ Resolution w h |
113 | _ -> throwIO $ ProcessingException fsPath "Unable to read image resolution." | 128 | _ -> throwIO failedRead |
129 | |||
130 | failedRead :: ProcessingException | ||
131 | failedRead = ProcessingException fsPath "Unable to read image resolution." | ||
114 | 132 | ||
115 | resourceAt :: FileDescriber Resource | 133 | resourceAt :: FileDescriber Resource |
116 | resourceAt resPath fsPath = Resource resPath <$> getModificationTime fsPath | 134 | resourceAt resPath fsPath = Resource resPath <$> getModificationTime fsPath |
diff --git a/compiler/src/Input.hs b/compiler/src/Input.hs index 4cfabe6..7990571 100644 --- a/compiler/src/Input.hs +++ b/compiler/src/Input.hs | |||
@@ -1,7 +1,7 @@ | |||
1 | -- ldgallery - A static generator which turns a collection of tagged | 1 | -- ldgallery - A static generator which turns a collection of tagged |
2 | -- pictures into a searchable web gallery. | 2 | -- pictures into a searchable web gallery. |
3 | -- | 3 | -- |
4 | -- Copyright (C) 2019-2021 Pacien TRAN-GIRARD | 4 | -- Copyright (C) 2019-2022 Pacien TRAN-GIRARD |
5 | -- | 5 | -- |
6 | -- This program is free software: you can redistribute it and/or modify | 6 | -- This program is free software: you can redistribute it and/or modify |
7 | -- it under the terms of the GNU Affero General Public License as | 7 | -- it under the terms of the GNU Affero General Public License as |
@@ -153,6 +153,4 @@ filterInputTree cond = filterNode | |||
153 | filterNode :: InputTree -> InputTree | 153 | filterNode :: InputTree -> InputTree |
154 | filterNode inputFile@InputFile{} = inputFile | 154 | filterNode inputFile@InputFile{} = inputFile |
155 | filterNode inputDir@InputDir{items} = | 155 | filterNode inputDir@InputDir{items} = |
156 | filter cond items | 156 | inputDir { Input.items = filter cond items & map filterNode } |
157 | & map filterNode | ||
158 | & \curatedItems -> inputDir { items = curatedItems } :: InputTree | ||
diff --git a/compiler/src/ItemProcessors.hs b/compiler/src/ItemProcessors.hs index fa99316..6035477 100644 --- a/compiler/src/ItemProcessors.hs +++ b/compiler/src/ItemProcessors.hs | |||
@@ -1,7 +1,7 @@ | |||
1 | -- ldgallery - A static generator which turns a collection of tagged | 1 | -- ldgallery - A static generator which turns a collection of tagged |
2 | -- pictures into a searchable web gallery. | 2 | -- pictures into a searchable web gallery. |
3 | -- | 3 | -- |
4 | -- Copyright (C) 2019-2021 Pacien TRAN-GIRARD | 4 | -- Copyright (C) 2019-2022 Pacien TRAN-GIRARD |
5 | -- | 5 | -- |
6 | -- This program is free software: you can redistribute it and/or modify | 6 | -- This program is free software: you can redistribute it and/or modify |
7 | -- it under the terms of the GNU Affero General Public License as | 7 | -- it under the terms of the GNU Affero General Public License as |
@@ -38,6 +38,7 @@ data Format = | |||
38 | | PlainTextFormat | 38 | | PlainTextFormat |
39 | | MarkdownFormat | 39 | | MarkdownFormat |
40 | | PortableDocumentFormat | 40 | | PortableDocumentFormat |
41 | | EPUBFormat | ||
41 | | VideoFormat | 42 | | VideoFormat |
42 | | AudioFormat | 43 | | AudioFormat |
43 | | Unknown | 44 | | Unknown |
@@ -59,6 +60,7 @@ formatFromPath = | |||
59 | ".txt" -> PlainTextFormat | 60 | ".txt" -> PlainTextFormat |
60 | ".md" -> MarkdownFormat | 61 | ".md" -> MarkdownFormat |
61 | ".pdf" -> PortableDocumentFormat | 62 | ".pdf" -> PortableDocumentFormat |
63 | ".epub" -> EPUBFormat | ||
62 | ".wav" -> AudioFormat | 64 | ".wav" -> AudioFormat |
63 | ".oga" -> AudioFormat | 65 | ".oga" -> AudioFormat |
64 | ".ogg" -> AudioFormat | 66 | ".ogg" -> AudioFormat |
@@ -103,6 +105,7 @@ itemFileProcessor maxResolution = | |||
103 | processorFor PlainTextFormat _ = copyResource PlainText | 105 | processorFor PlainTextFormat _ = copyResource PlainText |
104 | processorFor MarkdownFormat _ = copyResource Markdown | 106 | processorFor MarkdownFormat _ = copyResource Markdown |
105 | processorFor PortableDocumentFormat _ = copyResource PDF | 107 | processorFor PortableDocumentFormat _ = copyResource PDF |
108 | processorFor EPUBFormat _ = copyResource EPUB | ||
106 | processorFor VideoFormat _ = copyResource Video | 109 | processorFor VideoFormat _ = copyResource Video |
107 | processorFor AudioFormat _ = copyResource Audio | 110 | processorFor AudioFormat _ = copyResource Audio |
108 | processorFor Unknown _ = copyResource Other | 111 | processorFor Unknown _ = copyResource Other |
diff --git a/compiler/src/Resource.hs b/compiler/src/Resource.hs index 804c9a1..e8ca58c 100644 --- a/compiler/src/Resource.hs +++ b/compiler/src/Resource.hs | |||
@@ -1,7 +1,7 @@ | |||
1 | -- ldgallery - A static generator which turns a collection of tagged | 1 | -- ldgallery - A static generator which turns a collection of tagged |
2 | -- pictures into a searchable web gallery. | 2 | -- pictures into a searchable web gallery. |
3 | -- | 3 | -- |
4 | -- Copyright (C) 2019-2021 Pacien TRAN-GIRARD | 4 | -- Copyright (C) 2019-2022 Pacien TRAN-GIRARD |
5 | -- | 5 | -- |
6 | -- This program is free software: you can redistribute it and/or modify | 6 | -- This program is free software: you can redistribute it and/or modify |
7 | -- it under the terms of the GNU Affero General Public License as | 7 | -- it under the terms of the GNU Affero General Public License as |
@@ -56,7 +56,7 @@ encodingOptions :: JSON.Options | |||
56 | encodingOptions = JSON.defaultOptions | 56 | encodingOptions = JSON.defaultOptions |
57 | { JSON.fieldLabelModifier = map toLower | 57 | { JSON.fieldLabelModifier = map toLower |
58 | , JSON.constructorTagModifier = map toLower | 58 | , JSON.constructorTagModifier = map toLower |
59 | , JSON.sumEncoding = JSON.defaultTaggedObject | 59 | , JSON.sumEncoding = JSON.TaggedObject |
60 | { JSON.tagFieldName = "type" | 60 | { JSON.tagFieldName = "type" |
61 | , JSON.contentsFieldName = "contents" | 61 | , JSON.contentsFieldName = "contents" |
62 | } | 62 | } |
@@ -92,6 +92,7 @@ data GalleryItemProps = | |||
92 | | PlainText { resource :: Resource } | 92 | | PlainText { resource :: Resource } |
93 | | Markdown { resource :: Resource } | 93 | | Markdown { resource :: Resource } |
94 | | PDF { resource :: Resource } | 94 | | PDF { resource :: Resource } |
95 | | EPUB { resource :: Resource } | ||
95 | | Video { resource :: Resource } | 96 | | Video { resource :: Resource } |
96 | | Audio { resource :: Resource } | 97 | | Audio { resource :: Resource } |
97 | | Other { resource :: Resource } | 98 | | Other { resource :: Resource } |
@@ -179,7 +180,7 @@ buildGalleryTree processItem processThumbnail tagsFromDirsConfig = | |||
179 | & map (prefix tagsFromDirsConfig ++) | 180 | & map (prefix tagsFromDirsConfig ++) |
180 | 181 | ||
181 | aggregateTags :: [GalleryItem] -> [Tag] | 182 | aggregateTags :: [GalleryItem] -> [Tag] |
182 | aggregateTags = concatMap (\item -> tags (item::GalleryItem)) | 183 | aggregateTags = concatMap Resource.tags |
183 | 184 | ||
184 | maybeThumbnail :: Path -> Maybe Path -> IO (Maybe Thumbnail) | 185 | maybeThumbnail :: Path -> Maybe Path -> IO (Maybe Thumbnail) |
185 | maybeThumbnail _ Nothing = return Nothing | 186 | maybeThumbnail _ Nothing = return Nothing |
@@ -187,7 +188,7 @@ buildGalleryTree processItem processThumbnail tagsFromDirsConfig = | |||
187 | 188 | ||
188 | mostRecentModTime :: [GalleryItem] -> Maybe ZonedTime | 189 | mostRecentModTime :: [GalleryItem] -> Maybe ZonedTime |
189 | mostRecentModTime = | 190 | mostRecentModTime = |
190 | maximumByMay comparingTime . map (datetime::(GalleryItem -> ZonedTime)) | 191 | maximumByMay comparingTime . map Resource.datetime |
191 | 192 | ||
192 | comparingTime :: ZonedTime -> ZonedTime -> Ordering | 193 | comparingTime :: ZonedTime -> ZonedTime -> Ordering |
193 | comparingTime l r = compare (zonedTimeToUTC l) (zonedTimeToUTC r) | 194 | comparingTime l r = compare (zonedTimeToUTC l) (zonedTimeToUTC r) |
@@ -219,14 +220,11 @@ galleryOutputDiff resources ref = | |||
219 | 220 | ||
220 | resPath :: GalleryItemProps -> Maybe Path | 221 | resPath :: GalleryItemProps -> Maybe Path |
221 | resPath Directory{} = Nothing | 222 | resPath Directory{} = Nothing |
222 | resPath resourceProps = | 223 | resPath resourceProps = Just $ resourcePath $ resourceProps.resource |
223 | Just | ||
224 | $ resourcePath | ||
225 | $ (resource :: (GalleryItemProps -> Resource)) resourceProps | ||
226 | 224 | ||
227 | thumbnailPaths :: [GalleryItem] -> [Path] | 225 | thumbnailPaths :: [GalleryItem] -> [Path] |
228 | thumbnailPaths = | 226 | thumbnailPaths = |
229 | map (resourcePath . (resource :: (Thumbnail -> Resource))) | 227 | map (\thumbnail -> resourcePath thumbnail.resource) |
230 | . mapMaybe thumbnail | 228 | . mapMaybe thumbnail |
231 | 229 | ||
232 | (\\) :: [Path] -> [Path] -> [Path] | 230 | (\\) : |