Browse Source

a bunch of shit to make it suck less

master
nisstyre56 9 years ago
parent
commit
8d5235ab6d
  1. 24
      Database.hs
  2. 6
      Search.hs
  3. 13
      Utils.hs
  4. 4
      youtube-mpd.cabal

24
Database.hs

@ -34,21 +34,19 @@ toValue = C.unsafeCoerce
fromId :: MP.Id -> Int fromId :: MP.Id -> Int
fromId = C.unsafeCoerce fromId = C.unsafeCoerce
changeTag :: MP.Metadata -> TIO.Text -> Maybe MP.Song -> IO (MP.Response [B.ByteString]) --changeTag :: MP.Metadata -> TIO.Text -> Either MP.Id -> IO (MP.Response [B.ByteString])
changeTag _ _ Nothing = error "empty playlist"
changeTag tag tagval' (Just song) = do changeTag tag tagval' (Right sid) = do
let tagval = encodeUtf8 tagval' let tagval = encodeUtf8 tagval'
case (MP.sgId song) of in addTagId sid tag (BC.unpack tagval)
Nothing -> error "tried to modify a non-existent track" changeTag _ _ (Left _) = error "error changing tag"
(Just sid) -> addTagId sid tag (BC.unpack tagval)
changeArtist = changeTag MP.Artist changeArtist = changeTag MP.Artist
changeTitle = changeTag MP.Title changeTitle = changeTag MP.Title
changeBoth track (artist, title) = changeBoth trackid (artist, title) =
changeArtist artist track >> changeArtist artist trackid >>
changeTitle title track changeTitle title trackid
addTagId :: MP.Id -> MP.Metadata -> String -> IO (Response [B.ByteString]) addTagId :: MP.Id -> MP.Metadata -> String -> IO (Response [B.ByteString])
addTagId sid tag tagVal = MP.withMPD $ addTagId sid tag tagVal = MP.withMPD $
@ -66,9 +64,7 @@ addSingle track = do
let trackUrl = url track let trackUrl = url track
let trackDesc = title track let trackDesc = title track
fullUrl <- readProcess "youtube-dl" ["-g", "-f", "bestaudio", (TIO.unpack trackUrl)] "" fullUrl <- readProcess "youtube-dl" ["-g", "-f", "bestaudio", (TIO.unpack trackUrl)] ""
MP.withMPD $ MP.add $ toPath fullUrl newId <- MP.withMPD $ MP.addId (toPath fullUrl) Nothing
(Right pl) <- (MP.withMPD $ MP.playlistInfo Nothing) either (const $ changeTitle trackDesc newId)
let lastTrack = listToMaybe $ reverse pl (changeBoth newId)
either (const $ changeTitle trackDesc lastTrack)
(changeBoth lastTrack)
(parseTrack trackDesc) (parseTrack trackDesc)

6
Search.hs

@ -17,6 +17,8 @@ import Control.Exception
import Network.HTTP.Base (urlEncode, urlDecode) import Network.HTTP.Base (urlEncode, urlDecode)
import Types import Types
maxResults = 10
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
@ -39,7 +41,9 @@ baseURI = "https://www.googleapis.com/youtube/v3/"
searchRequest :: String -> String -> String searchRequest :: String -> String -> String
searchRequest keyword accessTok = searchRequest keyword accessTok =
baseURI ++ baseURI ++
"search?part=snippet&q=" ++ "search?maxResults=" ++
(show maxResults) ++
"&part=snippet&q=" ++
keyword ++ keyword ++
"&type=video&access_token=" ++ "&type=video&access_token=" ++
accessTok accessTok

13
Utils.hs

@ -6,15 +6,20 @@ import qualified Data.Text as TIO
import Data.Text.Encoding import Data.Text.Encoding
import Data.Maybe import Data.Maybe
import Control.Applicative import Control.Applicative
import Control.Monad
import Data.Attoparsec.Text import Data.Attoparsec.Text
import qualified Data.Attoparsec.Text as AT
repeated xs = TIO.concat <$> (many1 $ string xs)
isSep = choice [string "by",
repeated "-",
repeated "|"]
isSep = string "by" <|>
string " - " <|>
string "- "
isTrack = do isTrack = do
artist <- manyTill anyChar isSep artist <- manyTill anyChar isSep
title <- many1 anyChar title <- many1 anyChar
return (TIO.pack artist, TIO.pack title) return (TIO.strip $ TIO.pack artist, TIO.strip $ TIO.pack title)
parseTrack = parseOnly isTrack parseTrack = parseOnly isTrack

4
youtube-mpd.cabal

@ -7,5 +7,7 @@ Synopsis: play youtube music easier
Build-Type: Simple Build-Type: Simple
Executable youtube-mpd Executable youtube-mpd
Build-Depends: base, handa-gdata, process, directory, http-conduit, bytestring, aeson, containers, text Build-Depends: base, HTTP, handa-gdata, process, directory, http-conduit, bytestring, aeson, containers, text, libmpd, MissingH, mtl, attoparsec
Main-Is: Main.hs Main-Is: Main.hs
Extensions: OverloadedStrings
GHC-Options: -fwarn-incomplete-patterns -Werror