From b65dcc7a03e68bd6e01647eca2154a439d325c23 Mon Sep 17 00:00:00 2001 From: Cmdv Date: Tue, 8 Jan 2019 20:07:06 +0000 Subject: [PATCH 1/2] Make proxy media filenames content-adressable --- komposition.cabal | 3 +++ src/Komposition/Import/Hash.hs | 23 +++++++++++++++++++++++ src/Komposition/Import/Video/FFmpeg.hs | 6 ++++-- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 src/Komposition/Import/Hash.hs diff --git a/komposition.cabal b/komposition.cabal index c3d0318..bea0234 100644 --- a/komposition.cabal +++ b/komposition.cabal @@ -50,6 +50,7 @@ library , Komposition.History , Komposition.Import.Audio , Komposition.Import.Audio.Sox + , Komposition.Import.Hash , Komposition.Import.Video , Komposition.Import.Video.FFmpeg , Komposition.KeyMap @@ -89,6 +90,8 @@ library build-depends: base >=4.10 && <5 , async , binary + , bytestring + , cryptonite , deepseq , directory , exceptions diff --git a/src/Komposition/Import/Hash.hs b/src/Komposition/Import/Hash.hs new file mode 100644 index 0000000..00fcf31 --- /dev/null +++ b/src/Komposition/Import/Hash.hs @@ -0,0 +1,23 @@ +module Komposition.Import.Hash where + +import Komposition.Prelude + +import Crypto.Hash as H +import Crypto.Random as R +import qualified Data.ByteString.Lazy.Char8 as Lazy +import qualified Data.ByteString.Char8 as C +import System.FilePath + +-- | create a hashed basename from source file +createSHA1BaseName :: [Char] -> IO [Char] +createSHA1BaseName filepath = do + rand <- makeHex + let name = takeBaseName filepath + lazyBs = Lazy.pack (name <> rand) + pure $ hex lazyBs + +hex :: Lazy.ByteString -> [Char] +hex bs = show (H.hashlazy bs :: Digest SHA1) + +makeHex :: IO [Char] +makeHex = C.unpack <$> R.getRandomBytes 10 diff --git a/src/Komposition/Import/Video/FFmpeg.hs b/src/Komposition/Import/Video/FFmpeg.hs index 6c6baf6..6ede683 100644 --- a/src/Komposition/Import/Video/FFmpeg.hs +++ b/src/Komposition/Import/Video/FFmpeg.hs @@ -51,8 +51,8 @@ import Data.Time.Clock import qualified Data.Vector as V import qualified Data.Vector.Generic as VG import Graphics.ColorSpace as A -import Pipes (Pipe, Producer, (>->)) import qualified Pipes +import Pipes (Pipe, Producer, (>->)) import qualified Pipes.Parse as Pipes import qualified Pipes.Prelude as Pipes hiding (show) import Pipes.Safe @@ -64,6 +64,7 @@ import Komposition.Duration import Komposition.FFmpeg.Command (Command (Command)) import qualified Komposition.FFmpeg.Command as Command import Komposition.FFmpeg.Process +import Komposition.Import.Hash (createSHA1BaseName) import Komposition.Import.Video import Komposition.Library import Komposition.Progress @@ -315,8 +316,9 @@ transcode' transcode' videoSettings (view unOriginalPath -> sourceFile) fullLength outDir progressMsg = do liftIO (createDirectoryIfMissing True outDir) + shaBasename <- liftIO $ createSHA1BaseName sourceFile let - proxyPath = outDir takeBaseName sourceFile <> ".transcoded.mp4" + proxyPath = outDir shaBasename <> ".transcoded.mp4" cmd = Command { output = Command.FileOutput proxyPath , inputs = pure (Command.FileSource sourceFile) From f29eb113d05a593bf9e57c5a4b3ff453ff3eab69 Mon Sep 17 00:00:00 2001 From: Cmdv Date: Thu, 10 Jan 2019 20:49:55 +0000 Subject: [PATCH 2/2] add test for createSHA1BaseName --- komposition.cabal | 1 + test/Komposition/Import/HashTest.hs | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 test/Komposition/Import/HashTest.hs diff --git a/komposition.cabal b/komposition.cabal index bea0234..25b25ec 100644 --- a/komposition.cabal +++ b/komposition.cabal @@ -199,6 +199,7 @@ test-suite komposition-tests , Komposition.Composition.ValidFocusTest , Komposition.FFmpeg.CommandTest , Komposition.FocusTest + , Komposition.Import.HashTest , Komposition.Import.Video.FFmpegTest , Komposition.Project.Generators , Komposition.Project.StoreTest diff --git a/test/Komposition/Import/HashTest.hs b/test/Komposition/Import/HashTest.hs new file mode 100644 index 0000000..34579ae --- /dev/null +++ b/test/Komposition/Import/HashTest.hs @@ -0,0 +1,14 @@ +module Komposition.Import.HashTest where + +import Komposition.Prelude +import Test.Tasty.Hspec + +import Komposition.Import.Hash + +sha1 :: IO [Char] +sha1 = createSHA1BaseName "test1" + +spec_hashing :: Spec +spec_hashing = do + it "creates a different SHA1 given the same basename" $ + join (shouldNotBe <$> sha1 <*> sha1)