From d40c7ca41b64013c76ce33e516579dbeae35744f Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Thu, 22 Aug 2013 18:25:21 -0400 Subject: Youtube support! (And 53 other video hosts) When quvi is installed, git-annex addurl automatically uses it to detect when an page is a video, and downloads the video file. web special remote: Also support using quvi, for getting files, or checking if files exist in the web. This commit was sponsored by Mark Hepburn. Thanks! --- Utility/Quvi.hs | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 Utility/Quvi.hs (limited to 'Utility/Quvi.hs') diff --git a/Utility/Quvi.hs b/Utility/Quvi.hs new file mode 100644 index 000000000..68cc4a3f6 --- /dev/null +++ b/Utility/Quvi.hs @@ -0,0 +1,83 @@ +{- querying quvi (import qualified) + - + - Copyright 2013 Joey Hess + - + - Licensed under the GNU GPL version 3 or higher. + -} + +{-# LANGUAGE OverloadedStrings #-} + +module Utility.Quvi where + +import Common +import Utility.Url + +import Data.Aeson +import Data.ByteString.Lazy.UTF8 (fromString) + +data Page = Page + { pageTitle :: String + , pageLinks :: [Link] + } deriving (Show) + +data Link = Link + { linkSuffix :: String + , linkUrl :: URLString + } deriving (Show) + +instance FromJSON Page where + parseJSON (Object v) = Page + <$> v .: "page_title" + <*> v .: "link" + parseJSON _ = mzero + +instance FromJSON Link where + parseJSON (Object v) = Link + <$> v .: "file_suffix" + <*> v .: "url" + parseJSON _ = mzero + +type Query a = [CommandParam] -> URLString -> IO a + +{- Throws an error when quvi is not installed. -} +forceQuery :: Query (Maybe Page) +forceQuery ps url = flip catchNonAsync (const notinstalled) (query' ps url) + where + notinstalled = error "quvi failed, or is not installed" + +{- Returns Nothing if the page is not a video page, or quvi is not + - installed. -} +query :: Query (Maybe Page) +query ps url = flip catchNonAsync (const $ return Nothing) (query' ps url) + +query' :: Query (Maybe Page) +query' ps url = decode . fromString + <$> readProcess "quvi" (toCommand $ ps ++ [Param url]) + +queryLinks :: Query [URLString] +queryLinks ps url = maybe [] (map linkUrl . pageLinks) <$> query ps url + +{- Checks if quvi can still find a download link for an url. + - If quvi is not installed, returns False. -} +check :: Query Bool +check ps url = maybe False (not . null . pageLinks) <$> query ps url + +{- Checks if an url is supported by quvi, without hitting it, or outputting + - anything. Also returns False if quvi is not installed. -} +supported :: URLString -> IO Bool +supported url = boolSystem "quvi" [Params "-v mute --support", Param url] + +quiet :: CommandParam +quiet = Params "-v quiet" + +noredir :: CommandParam +noredir = Params "-e -resolve" + +{- Only return http results, not streaming protocols. -} +httponly :: CommandParam +httponly = Params "-c http" + +{- Avoids error messages being printed to stderr, instead they are + - put in the JSON. -} +hideerrors :: CommandParam +hideerrors = Params "-l +errors" -- cgit v1.2.3