Browse Source

split stuff up so that it's better to work with multiple modules later

master
nisstyre56 9 years ago
parent
commit
79f30fb467
  1. 75
      Search.hs
  2. 65
      Types.hs

75
Main.hs → Search.hs

@ -1,3 +1,5 @@
module Search where
import Control.Monad (unless)
import System.Info (os)
import System.Process (system, rawSystem)
@ -7,68 +9,12 @@ import Network.Google.OAuth2 (formUrl, exchangeCode, refreshTokens,
OAuth2Client(..), OAuth2Tokens(..))
import Network.Google (makeRequest, doRequest)
import Network.HTTP.Conduit (simpleHttp, HttpException)
import Data.Aeson
import Data.Aeson (decode)
import qualified Data.ByteString.Lazy.Char8 as BL
import qualified Data.Text as T
import qualified Data.Map as M
import Control.Exception
data URL = URL { jurl :: T.Text }
deriving (Show, Eq)
data VideoID = VideoID { videoID :: T.Text }
deriving (Show, Eq)
data Thumbnail = Thumbnail { thumbnail :: URL }
deriving (Show, Eq)
data JSearchResult = JSearchResult {
jvideoID :: VideoID,
snippet :: Snippet
}
deriving (Show, Eq)
data Snippet = Snippet {
jtitle :: T.Text,
jdescription :: T.Text,
jthumbnails :: Thumbnail
}
deriving (Show, Eq)
data JItems = JItems [JSearchResult]
deriving (Show)
data SearchResult = SearchResult {
title :: T.Text,
description :: T.Text,
url :: T.Text,
thumb :: T.Text
}
deriving (Show, Eq)
instance FromJSON URL where
parseJSON (Object v) = URL <$> v .: "url"
instance FromJSON Thumbnail where
parseJSON (Object v) = Thumbnail <$> v .: "default"
instance FromJSON VideoID where
parseJSON (Object v) = VideoID <$>
v .: "videoId"
instance FromJSON Snippet where
parseJSON (Object v) = Snippet <$>
v .: "title" <*>
v .: "description" <*>
v .: "thumbnails"
instance FromJSON JSearchResult where
parseJSON (Object v) = JSearchResult <$>
(v .: "id") <*>
(v .: "snippet")
instance FromJSON JItems where
parseJSON (Object v) = JItems <$> v .: "items"
import Network.HTTP.Base (urlEncode)
import Types
makeURL :: T.Text -> T.Text
makeURL vid = "https://youtube.com/watch?v=" `T.append` vid
@ -97,9 +43,8 @@ searchRequest keyword accessTok =
"&type=video&access_token=" ++
accessTok
main = do
search :: String -> IO [SearchResult]
search term = do
let client = OAuth2Client { clientId = cid, clientSecret = secret }
permissionUrl = formUrl client ["https://www.googleapis.com/auth/youtube"]
b <- doesFileExist file
@ -111,8 +56,7 @@ main = do
putStrLn $ "Received access token: " ++ show (accessToken tokens)
writeFile file (show tokens)
accessTok <- fmap (accessToken . read) (readFile file)
tracks <- findTracks client accessTok "Foo+Fighters"
print tracks
findTracks client accessTok (urlEncode term)
getNewTokens :: OAuth2Client -> IO ()
getNewTokens client = do
@ -125,6 +69,3 @@ findTracks client accessTok term = do
case response of
(Left _) -> getNewTokens client >> findTracks client accessTok term
(Right resp) -> return $ getItems resp
search :: String -> [T.Text]
search term = undefined

65
Types.hs

@ -0,0 +1,65 @@
module Types where
import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as BL
import qualified Data.Text as T
import qualified Data.Map as M
data URL = URL { jurl :: T.Text }
deriving (Show, Eq)
data VideoID = VideoID { videoID :: T.Text }
deriving (Show, Eq)
data Thumbnail = Thumbnail { thumbnail :: URL }
deriving (Show, Eq)
data JSearchResult = JSearchResult {
jvideoID :: VideoID,
snippet :: Snippet
}
deriving (Show, Eq)
data Snippet = Snippet {
jtitle :: T.Text,
jdescription :: T.Text,
jthumbnails :: Thumbnail
}
deriving (Show, Eq)
data JItems = JItems [JSearchResult]
deriving (Show)
data SearchResult = SearchResult {
title :: T.Text,
description :: T.Text,
url :: T.Text,
thumb :: T.Text
}
deriving (Show, Eq)
instance FromJSON URL where
parseJSON (Object v) = URL <$> v .: "url"
instance FromJSON Thumbnail where
parseJSON (Object v) = Thumbnail <$> v .: "default"
instance FromJSON VideoID where
parseJSON (Object v) = VideoID <$>
v .: "videoId"
instance FromJSON Snippet where
parseJSON (Object v) = Snippet <$>
v .: "title" <*>
v .: "description" <*>
v .: "thumbnails"
instance FromJSON JSearchResult where
parseJSON (Object v) = JSearchResult <$>
(v .: "id") <*>
(v .: "snippet")
instance FromJSON JItems where
parseJSON (Object v) = JItems <$> v .: "items"