content: module Main where
  
  import           Codec.FFmpeg
  import           Codec.FFmpeg.AudioStream
  import           Codec.FFmpeg.Decode
  import           Codec.FFmpeg.Encode
  import           Codec.FFmpeg.Resampler
  import           Control.Monad.Except
  import           System.Environment
  
  
  main :: IO ()
  main = do initFFmpeg
            args <- getArgs
  
            case args of
              [fname, outname] -> do
                eRes <- runExceptT $ frameAudioReader (File fname)
                case eRes of
                  Left er -> error er
                  Right (as, getFrame, cleanup) -> do
                    putStrLn $ "bitrate : " ++ show (asBitRate as)
                    putStrLn $ "sample rate : " ++ show (asSampleRate as)
                    putStrLn $ "sample format : " ++
                        show (getSampleFormatInt (asSampleFormat as))
                    putStrLn $ "channel layout : " ++ show (asChannelLayout as)
                    putStrLn $ "channel count : " ++ show (asChannelCount as)
                    let inParams = AudioParams
                                    { apChannelLayout = asChannelLayout as
                                    , apSampleRate = asSampleRate as
                                    , apSampleFormat = asSampleFormat as
                                    }
                        outParams = AudioParams
                                    { apChannelLayout = asChannelLayout as
                                    , apSampleRate = 44100
                                    , apSampleFormat = asSampleFormat as
                                    }
                        encParams = AEncodingParams
                                    { aepChannelLayout = apChannelLayout outParams
                                    , aepSampleRate = apSampleRate outParams
                                    , aepSampleFormat = apSampleFormat outParams
                                    , aepPreset = ""
                                    , aepFormatName = Nothing
                                    }
                    (mCtx, audWriter) <- audioWriter encParams outname
                    case mCtx of
                      Nothing -> error "Didn't get audio context"
                      Just ctx -> do
                        (sendFrame, getResampledFrame) <- makeResampler ctx inParams outParams
                        let go :: Int -> IO ()
                            go i = do
                              mFrame <- getFrame
                              case mFrame of
                                Nothing -> readAndWrite
                                Just frame -> do
                                  sendFrame frame
                                  readAndWrite
                                  go (i+1)
                            readAndWrite = do
                              mFrame <- getResampledFrame
                              case mFrame of
                                Nothing -> return ()
                                Just frame -> do
                                  audWriter (Just frame)
                                  readAndWrite
                        go 1
                        audWriter Nothing
  
                        cleanup
                        return ()
                return ()
              _ -> putStrLn usage
    where
      usage = "Supply an input video and output filename to extract the audio file to a mp3 file"
  