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 Control.Monad (unless)
import System.Info (os) import System.Info (os)
import System.Process (system, rawSystem) import System.Process (system, rawSystem)
@ -7,68 +9,12 @@ import Network.Google.OAuth2 (formUrl, exchangeCode, refreshTokens,
OAuth2Client(..), OAuth2Tokens(..)) OAuth2Client(..), OAuth2Tokens(..))
import Network.Google (makeRequest, doRequest) import Network.Google (makeRequest, doRequest)
import Network.HTTP.Conduit (simpleHttp, HttpException) import Network.HTTP.Conduit (simpleHttp, HttpException)
import Data.Aeson import Data.Aeson (decode)
import qualified Data.ByteString.Lazy.Char8 as BL import qualified Data.ByteString.Lazy.Char8 as BL
import qualified Data.Text as T import qualified Data.Text as T
import qualified Data.Map as M
import Control.Exception import Control.Exception
import Network.HTTP.Base (urlEncode)
data URL = URL { jurl :: T.Text } import Types
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"
makeURL :: T.Text -> T.Text makeURL :: T.Text -> T.Text
makeURL vid = "https://youtube.com/watch?v=" `T.append` vid makeURL vid = "https://youtube.com/watch?v=" `T.append` vid
@ -97,9 +43,8 @@ searchRequest keyword accessTok =
"&type=video&access_token=" ++ "&type=video&access_token=" ++
accessTok accessTok
search :: String -> IO [SearchResult]
search term = do
main = do
let client = OAuth2Client { clientId = cid, clientSecret = secret } let client = OAuth2Client { clientId = cid, clientSecret = secret }
permissionUrl = formUrl client ["https://www.googleapis.com/auth/youtube"] permissionUrl = formUrl client ["https://www.googleapis.com/auth/youtube"]
b <- doesFileExist file b <- doesFileExist file
@ -111,8 +56,7 @@ main = do
putStrLn $ "Received access token: " ++ show (accessToken tokens) putStrLn $ "Received access token: " ++ show (accessToken tokens)
writeFile file (show tokens) writeFile file (show tokens)
accessTok <- fmap (accessToken . read) (readFile file) accessTok <- fmap (accessToken . read) (readFile file)
tracks <- findTracks client accessTok "Foo+Fighters" findTracks client accessTok (urlEncode term)
print tracks
getNewTokens :: OAuth2Client -> IO () getNewTokens :: OAuth2Client -> IO ()
getNewTokens client = do getNewTokens client = do
@ -125,6 +69,3 @@ findTracks client accessTok term = do
case response of case response of
(Left _) -> getNewTokens client >> findTracks client accessTok term (Left _) -> getNewTokens client >> findTracks client accessTok term
(Right resp) -> return $ getItems resp (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"