module Network.XMMS.Playlist(
retrieveChange,
Change (..),
currentPos,
currentActive,
list,
create,
shuffle,
sort,
clear,
remove,
listEntries,
insertID,
insertURL,
rInsert,
rInsertEncoded,
insertEncoded,
addID,
addURL,
rAdd,
rAddEncoded,
addEncoded,
moveEntry,
removeEntry,
broadcastChanged,
broadcastCurrentPos,
setNext,
setNextRel,
load
)where
import Foreign
import Foreign.Ptr
import Foreign.C.Types
import Network.XMMS.UTF8Strings
import Foreign.ForeignPtr
import Foreign.Marshal.Alloc
import Network.XMMS.Utilities
import Network.XMMS.Constants
import Network.XMMS.Types
import Network.XMMS.Result
import Network.XMMS.Value
import Data.Map (Map)
import qualified Data.Map as Map
data Change = Add { position :: Int, name :: String, id :: Int }
| Insert { position :: Int, name :: String, id :: Int }
| Remove { position :: Int, name :: String}
| Clear { name :: String }
| Move { position :: Int, newPosition :: Int, name :: String, id :: Int }
| Sort { name :: String }
| Shuffle { name :: String }
| Update { name :: String }
| NoChange
retrieveChange :: XMMSCV -> Change
retrieveChange (XMMSDict dict)
|changeType == playlistChangedAdd = Add position name id
|changeType == playlistChangedInsert = Insert position name id
|changeType == playlistChangedRemove = Remove position name
|changeType == playlistChangedClear = Clear name
|changeType == playlistChangedMove = Move position newPosition name id
|changeType == playlistChangedSort = Sort name
|changeType == playlistChangedShuffle = Shuffle name
|changeType == playlistChangedUpdate = Update name
|otherwise = NoChange
where convFromJust (Just x) = x
convFromJust _ = error $ "Failed on getting playlist change from dict: " ++ (show dict)
name = xmmsString $ convFromJust $ Map.lookup "name" dict
position = xmmsInt $ convFromJust $ Map.lookup "position" dict
newPosition = xmmsInt $ convFromJust $ Map.lookup "newposition" dict
id = xmmsInt $ convFromJust $ Map.lookup "id" dict
changeType = fromIntegral $ xmmsInt $ convFromJust $ Map.lookup "type" dict
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_current_pos"
xmmsc_playlist_current_pos :: Ptr C_xmmsc_connection -> CString -> IO (Ptr C_xmmsc_result)
currentPos :: Connection -> String -> IO Result
currentPos connection name =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_current_pos c c_name) connection)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_current_active"
xmmsc_playlist_current_active :: Ptr C_xmmsc_connection -> IO (Ptr C_xmmsc_result)
currentActive :: Connection -> IO Result
currentActive = wrapCallResult xmmsc_playlist_current_active
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_list"
xmmsc_playlist_list :: Ptr C_xmmsc_connection -> IO (Ptr C_xmmsc_result)
list :: Connection -> IO Result
list = wrapCallResult xmmsc_playlist_list
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_create"
xmmsc_playlist_create :: Ptr C_xmmsc_connection -> CString -> IO (Ptr C_xmmsc_result)
create :: Connection -> String -> IO Result
create connection name =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_create c c_name) connection)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_shuffle"
xmmsc_playlist_shuffle :: Ptr C_xmmsc_connection -> CString -> IO (Ptr C_xmmsc_result)
shuffle :: Connection -> String -> IO Result
shuffle connection name =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_shuffle c c_name) connection)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_sort"
xmmsc_playlist_sort :: Ptr C_xmmsc_connection -> CString -> Ptr C_xmmsc_value -> IO (Ptr C_xmmsc_result)
sort :: Connection -> String -> [String] -> IO Result
sort connection name properties =
withString name (\ c_name -> do
let xmmsProperties = XMMSList $ map XMMSString properties
c_properties <- convertValueHstoC xmmsProperties
withForeignPtr c_properties (\c_properties_ptr ->
wrapCallResult (\c -> xmmsc_playlist_sort c c_name c_properties_ptr) connection))
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_clear"
xmmsc_playlist_clear :: Ptr C_xmmsc_connection -> CString -> IO (Ptr C_xmmsc_result)
clear :: Connection -> String -> IO Result
clear connection name =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_clear c c_name) connection)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_remove"
xmmsc_playlist_remove :: Ptr C_xmmsc_connection -> CString -> IO (Ptr C_xmmsc_result)
remove :: Connection -> String -> IO Result
remove connection name =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_remove c c_name) connection)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_list_entries"
xmmsc_playlist_list_entries :: Ptr C_xmmsc_connection -> CString -> IO (Ptr C_xmmsc_result)
listEntries :: Connection -> String -> IO Result
listEntries connection name =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_list_entries c c_name) connection)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_insert_id"
xmmsc_playlist_insert_id :: Ptr C_xmmsc_connection -> CString -> CInt -> CInt -> IO (Ptr C_xmmsc_result)
insertID :: Connection -> String -> Int -> Int -> IO Result
insertID connection name pos id =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_insert_id c c_name (fromIntegral pos) (fromIntegral pos)) connection)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_insert_url"
xmmsc_playlist_insert_url :: Ptr C_xmmsc_connection -> CString -> Int -> CString -> IO (Ptr C_xmmsc_result)
insertURL :: Connection -> String -> Int -> String -> IO Result
insertURL connection name pos url =
withString name (\ c_name -> do
c_url <- newCString url
res <- wrapCallResult (\c -> xmmsc_playlist_insert_url c c_name (fromIntegral pos) c_url) connection
free c_url
return res)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_rinsert"
xmmsc_playlist_rinsert :: Ptr C_xmmsc_connection -> CString -> Int -> CString -> IO (Ptr C_xmmsc_result)
rInsert :: Connection -> String -> Int -> String -> IO Result
rInsert connection name pos url =
withString name (\ c_name -> do
c_url <- newCString url
res <- wrapCallResult (\c -> xmmsc_playlist_rinsert c c_name (fromIntegral pos) c_url) connection
free c_url
return res)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_rinsert_encoded"
xmmsc_playlist_rinsert_encoded :: Ptr C_xmmsc_connection -> CString -> Int -> CString -> IO (Ptr C_xmmsc_result)
rInsertEncoded :: Connection -> String -> Int -> String -> IO Result
rInsertEncoded connection name pos url = do
withString name (\ c_name -> do
c_url <- newCString url
res <- wrapCallResult (\c -> xmmsc_playlist_rinsert_encoded c c_name (fromIntegral pos) c_url) connection
free c_url
return res)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_insert_encoded"
xmmsc_playlist_insert_encoded :: Ptr C_xmmsc_connection -> CString -> Int -> CString -> IO (Ptr C_xmmsc_result)
insertEncoded :: Connection -> String -> Int -> String -> IO Result
insertEncoded connection name pos url =
withString name (\ c_name -> do
c_url <- newCString url
res <- wrapCallResult (\c -> xmmsc_playlist_insert_encoded c c_name (fromIntegral pos) c_url) connection
free c_url
return res)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_add_id"
xmmsc_playlist_add_id :: Ptr C_xmmsc_connection -> CString -> Int -> IO (Ptr C_xmmsc_result)
addID :: Connection -> String -> Int -> IO Result
addID connection name id =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_add_id c c_name (fromIntegral id)) connection)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_add_url"
xmmsc_playlist_add_url :: Ptr C_xmmsc_connection -> CString -> CString -> IO (Ptr C_xmmsc_result)
addURL :: Connection -> String -> String -> IO Result
addURL connection name url =
withString name (\ c_name -> do
c_url <- newCString url
res <- wrapCallResult (\c -> xmmsc_playlist_add_url c c_name c_url) connection
free c_url
return res)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_radd"
xmmsc_playlist_radd :: Ptr C_xmmsc_connection -> CString -> CString -> IO (Ptr C_xmmsc_result)
rAdd :: Connection -> String -> String -> IO Result
rAdd connection name url =
withString name (\ c_name -> do
c_url <- newCString url
res <- wrapCallResult (\c -> xmmsc_playlist_radd c c_name c_url) connection
free c_url
return res)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_radd_encoded"
xmmsc_playlist_radd_encoded :: Ptr C_xmmsc_connection -> CString -> CString -> IO (Ptr C_xmmsc_result)
rAddEncoded :: Connection -> String -> String -> IO Result
rAddEncoded connection name url =
withString name (\ c_name -> do
c_url <- newCString url
res <- wrapCallResult (\c -> xmmsc_playlist_radd_encoded c c_name c_url) connection
free c_url
return res)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_add_encoded"
xmmsc_playlist_add_encoded :: Ptr C_xmmsc_connection -> CString -> CString -> IO (Ptr C_xmmsc_result)
addEncoded :: Connection -> String -> String -> IO Result
addEncoded connection name url =
withString name (\ c_name -> do
c_url <- newCString url
res <- wrapCallResult (\c -> xmmsc_playlist_add_encoded c c_name c_url) connection
free c_url
return res)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_move_entry"
xmmsc_playlist_move_entry :: Ptr C_xmmsc_connection -> CString -> CInt -> CInt -> IO (Ptr C_xmmsc_result)
moveEntry :: Connection -> String -> Int -> Int -> IO Result
moveEntry connection name curPos newPos =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_move_entry c c_name (fromIntegral curPos) (fromIntegral newPos)) connection)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_remove_entry"
xmmsc_playlist_remove_entry :: Ptr C_xmmsc_connection -> CString -> CInt -> IO (Ptr C_xmmsc_result)
removeEntry :: Connection -> String -> Int -> IO Result
removeEntry connection name pos =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_remove_entry c c_name (fromIntegral pos)) connection)
foreign import ccall safe "xmmsclient/xmmsclient.h xmmsc_broadcast_playlist_changed"
xmmsc_broadcast_playlist_changed :: Ptr C_xmmsc_connection -> IO (Ptr C_xmmsc_result)
broadcastChanged :: Connection -> IO Result
broadcastChanged = wrapCallResult xmmsc_broadcast_playlist_changed
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_broadcast_playlist_current_pos"
xmmsc_broadcast_playlist_current_pos :: Ptr C_xmmsc_connection -> IO (Ptr C_xmmsc_result)
broadcastCurrentPos :: Connection -> IO Result
broadcastCurrentPos = wrapCallResult xmmsc_broadcast_playlist_current_pos
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_set_next"
xmmsc_playlist_set_next :: Ptr C_xmmsc_connection -> CInt -> IO (Ptr C_xmmsc_result)
setNext :: Connection -> Int -> IO Result
setNext connection pos = do
wrapCallResult (\c -> xmmsc_playlist_set_next c (fromIntegral pos)) connection
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_set_next_rel"
xmmsc_playlist_set_next_rel :: Ptr C_xmmsc_connection -> CInt -> IO (Ptr C_xmmsc_result)
setNextRel :: Connection -> Int -> IO Result
setNextRel connection pos = do
wrapCallResult (\c -> xmmsc_playlist_set_next_rel c (fromIntegral pos)) connection
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_playlist_load"
xmmsc_playlist_load :: Ptr C_xmmsc_connection -> CString -> IO (Ptr C_xmmsc_result)
load :: Connection -> String -> IO Result
load connection name =
withString name (\ c_name ->
wrapCallResult (\c -> xmmsc_playlist_load c c_name) connection)
foreign import ccall unsafe "xmmsclient/xmmsclient.h xmmsc_broadcast_playlist_loaded"
xmmsc_broadcast_playlist_loaded :: Ptr C_xmmsc_connection -> IO (Ptr C_xmmsc_result)
broadcastLoaded :: Connection -> IO Result
broadcastLoaded = wrapCallResult xmmsc_broadcast_playlist_loaded