summaryrefslogtreecommitdiff
path: root/Annex
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2017-11-30 14:35:25 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2017-11-30 14:57:20 -0400
commitf60688147594c2d7ba323aa29620166b96c371d1 (patch)
tree6cbf001e04490c54cb4587989a93dce23c857ee9 /Annex
parent7a8d7ba5ef558f3038ee5ee06e92e5f5e8df1ec5 (diff)
check youtube-dl for --fast and --relaxed when adding new file
The filename comes from youtube-dl also. This commit was sponsored by Denis Dzyubenko on Patreon.
Diffstat (limited to 'Annex')
-rw-r--r--Annex/YoutubeDl.hs34
1 files changed, 28 insertions, 6 deletions
diff --git a/Annex/YoutubeDl.hs b/Annex/YoutubeDl.hs
index 4e33c2ff3..ea08b664c 100644
--- a/Annex/YoutubeDl.hs
+++ b/Annex/YoutubeDl.hs
@@ -43,9 +43,8 @@ youtubeDl url workdir = ifM (liftIO (inPath "youtube-dl") <&&> runcmd)
nofiles = Left "youtube-dl did not put any media in its work directory, perhaps it's been configured to store files somewhere else?"
toomanyfiles fs = Left $ "youtube-dl downloaded multiple media files; git-annex is only able to deal with one per url: " ++ show fs
runcmd = do
- opts <- map Param . annexYoutubeDlOptions <$> Annex.getGitConfig
quiet <- commandProgressDisabled
- let opts' = opts ++
+ opts <- youtubeDlOpts $
[ Param url
-- To make youtube-dl only download one file,
-- when given a page with a video and a playlist,
@@ -60,7 +59,7 @@ youtubeDl url workdir = ifM (liftIO (inPath "youtube-dl") <&&> runcmd)
-- TODO --max-filesize
] ++
if quiet then [ Param "--quiet" ] else []
- liftIO $ boolSystem' "youtube-dl" opts' $
+ liftIO $ boolSystem' "youtube-dl" opts $
\p -> p { cwd = Just workdir }
-- Download a media file to a destination,
@@ -81,9 +80,32 @@ youtubeDlTo key url dest = do
youtubeDlSupported :: URLString -> Annex Bool
youtubeDlSupported url = either (const False) id <$> youtubeDlCheck url
--- Check if youtube-dl can still find media in an url.
+-- Check if youtube-dl can find media in an url.
youtubeDlCheck :: URLString -> Annex (Either String Bool)
youtubeDlCheck url = catchMsgIO $ do
+ opts <- youtubeDlOpts [ Param url, Param "--simulate" ]
+ liftIO $ snd <$> processTranscript "youtube-dl" (toCommand opts) Nothing
+
+-- Ask youtube-dl for the filename of media in an url.
+--
+-- (This is not always identical to the filename it uses when downloading.)
+youtubeDlFileName :: URLString -> Annex (Either String FilePath)
+youtubeDlFileName url = flip catchIO (pure . Left . show) $ do
+ -- Sometimes youtube-dl will fail with an ugly backtrace
+ -- (eg, http://bugs.debian.org/874321)
+ -- so catch stderr as well as stdout to avoid the user seeing it.
+ -- --no-warnings avoids warning messages that are output to stdout.
+ opts <- youtubeDlOpts
+ [ Param url
+ , Param "--get-filename"
+ , Param "--no-warnings"
+ ]
+ (output, ok) <- liftIO $ processTranscript "youtube-dl" (toCommand opts) Nothing
+ return $ case (ok, lines output) of
+ (True, (f:_)) | not (null f) -> Right f
+ _ -> Left "no media in url"
+
+youtubeDlOpts :: [CommandParam] -> Annex [CommandParam]
+youtubeDlOpts addopts = do
opts <- map Param . annexYoutubeDlOptions <$> Annex.getGitConfig
- let opts' = opts ++ [ Param url, Param "--simulate" ]
- liftIO $ snd <$> processTranscript "youtube-dl" (toCommand opts') Nothing
+ return (opts ++ addopts)