manatee-mplayer 0.0.8 → 0.1.0
raw patch · 12 files changed
+184/−77 lines, 12 filesdep +binarydep +derivedep −gtk-serialized-eventdep ~manatee-coresetup-changedbinary-added
Dependencies added: binary, derive
Dependencies removed: gtk-serialized-event
Dependency ranges changed: manatee-core
Files
- Daemon.hs +1/−1
- Main.hs +1/−1
- Manatee/Extension/Mplayer.hs +1/−1
- Manatee/Extension/Mplayer/DBus.hs +1/−1
- Manatee/Extension/Mplayer/Daemon.hs +1/−1
- Manatee/Extension/Mplayer/PageMode.hs +1/−1
- Manatee/Extension/Mplayer/PlaylistBuffer.hs +35/−4
- Manatee/Extension/Mplayer/PlaylistView.hs +121/−59
- Setup.hs +12/−2
- data/welcome/Fireflies.mp3 too large to diff
- data/welcome/snapshot.png binary
- manatee-mplayer.cabal +10/−6
Daemon.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Main.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/Mplayer.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/Mplayer/DBus.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/Mplayer/Daemon.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/Mplayer/PageMode.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by
Manatee/Extension/Mplayer/PlaylistBuffer.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by@@ -18,6 +18,7 @@ {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable #-}+{-# LANGUAGE TemplateHaskell #-} module Manatee.Extension.Mplayer.PlaylistBuffer where import Audio.TagLib.TagLib@@ -25,22 +26,25 @@ import Control.Concurrent.STM import Control.Monad (liftM, unless) import DBus.Client hiding (Signal)+import Data.Binary import Data.ByteString.UTF8+import Data.DeriveTH import Data.Maybe (maybeToList) import Data.Ord (comparing) import Data.Time import Data.Typeable-import Graphics.UI.Gtk.General.Enums-import Graphics.UI.Gtk.ModelView.TreeSortable+import Graphics.UI.Gtk hiding (get)+import Manatee.Core.Config import Manatee.Core.DBus import Manatee.Core.Types-import Manatee.Extension.Mplayer.PageMode import Manatee.Extension.Mplayer.DBus+import Manatee.Extension.Mplayer.PageMode import Manatee.Toolkit.General.Basic import Manatee.Toolkit.General.DBus import Manatee.Toolkit.General.List import Manatee.Toolkit.General.Maybe import Manatee.Toolkit.General.Process+import Manatee.Toolkit.General.STM import Manatee.Toolkit.Gio.Gio import System.FilePath import System.GIO.File.File @@ -56,9 +60,15 @@ ,playlistBufferInfos :: TVar [MultimediaInfo] ,playlistBufferOptions :: [(MultimediaOption, SortColumnId)] ,playlistBufferSortStatus :: TVar (MultimediaOption, SortType)+ ,playlistBufferState :: TVar PlaylistState } deriving Typeable +data PlaylistState =+ PlaylistState {playlistStateSelectedPath :: (Maybe TreePath)+ ,playlistStateScrolledPosition :: (Double, Double)+ }+ data MultimediaInfo = MultimediaInfo {miFilePath :: ByteString ,miArtist :: String@@ -157,6 +167,11 @@ | MOComment deriving (Eq, Show, Read) +-- | Init state.+playlistInitState :: PlaylistState +playlistInitState = + PlaylistState Nothing (0, 0)+ -- | New playlist buffer. -- If path is directory, will search multimedia files with given directory. -- If path is multimedia file, then add to play list.@@ -193,6 +208,7 @@ <*> newTVarIO infos <*> pure (pairPred [MOTitle, MOAlbum, MOArtist, MOYear, MOTrack, MOBitRate, MODuration]) <*> newTVarIO (MOAlbum, SortAscending)+ <*> newTVarIO playlistInitState -- | Generate multimedia infos. playlistBufferGenerateInfos :: FilePath -> IO [MultimediaInfo]@@ -275,3 +291,18 @@ mTrack2 = miTrack row2 mTitle1 = miTitle row1 mTitle2 = miTitle row2++-- | Write state.+playlistBufferWriteState :: PlaylistBuffer -> FilePath -> IO ()+playlistBufferWriteState buffer path = do+ state <- readTVarIO $ playlistBufferState buffer+ writeConfigPath path state++-- | Read state.+playlistBufferReadState :: PlaylistBuffer -> FilePath -> IO () +playlistBufferReadState buffer path = do+ state <- readConfigPath path playlistInitState+ writeTVarIO (playlistBufferState buffer) state+ +$(derive makeBinary ''PlaylistState)+
Manatee/Extension/Mplayer/PlaylistView.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by@@ -28,7 +28,7 @@ import Data.Text.Lazy (Text) import Data.Typeable import Graphics.UI.Gtk hiding (Statusbar, statusbarNew, get)-import Graphics.UI.Gtk.Gdk.SerializedEvent+import Manatee.Core.Config import Manatee.Core.PageFrame import Manatee.Core.PageView import Manatee.Core.Types@@ -39,13 +39,13 @@ import Manatee.Toolkit.General.Maybe import Manatee.Toolkit.General.STM import Manatee.Toolkit.Gio.Gio-import Manatee.Toolkit.Gtk.Gtk import Manatee.Toolkit.Gtk.ModelView+import Manatee.Toolkit.Gtk.ScrolledWindow import Paths_manatee_mplayer+import System.FilePath import System.GIO.File.ContentType import System.Posix.Process import System.Random-import System.FilePath import qualified Data.Map as M @@ -69,16 +69,21 @@ pageBufferPackageName _ = fmap takeFileName getDataDir instance PageView PlaylistView where- pageViewBuffer = PageBufferWrap . playlistViewBuffer- pageViewPlugId = playlistViewPlugId- pageViewBox = pageFrameBox . playlistViewFrame- pageViewScrolledWindow = playlistViewScrolledWindow- pageViewFocus = treeViewFocus . playlistViewTreeView- pageViewHandleKeyAction = playlistViewHandleKeyAction- pageViewScrollToTop = playlistViewScrollToTop- pageViewScrollToBottom = playlistViewScrollToBottom- pageViewScrollVerticalPage = playlistViewScrollVerticalPage- pageViewScrollVerticalStep = playlistViewScrollVerticalStep+ pageViewBuffer = PageBufferWrap . playlistViewBuffer+ pageViewPlugId = playlistViewPlugId+ pageViewFrame = playlistViewFrame+ pageViewLocalKeymap _ = playlistViewLocalKeymap+ pageViewLocalCommandMap _ = playlistViewLocalCommandMap+ pageViewFocus = treeViewFocus . playlistViewTreeView+ pageViewPropagateWidget = castToWidget . playlistViewTreeView+ pageViewSaveState view = playlistViewSaveState view Nothing+ pageViewRestoreState view = playlistViewRestoreState view Nothing+ pageViewWriteState view path = playlistViewSaveState view (Just path)+ pageViewReadState view path = playlistViewRestoreState view (Just path)+ pageViewScrollToTop = playlistViewScrollToTop+ pageViewScrollToBottom = playlistViewScrollToBottom+ pageViewScrollVerticalPage = playlistViewScrollVerticalPage+ pageViewScrollVerticalStep = playlistViewScrollVerticalStep data PlayMode = SingleMode | ListMode@@ -144,7 +149,7 @@ ListMode -> RandomMode RandomMode -> SingleMode writeTVarIO (playlistViewPlayMode view) newMode- pageFrameUpdateStatusbar (playlistViewFrame view) "PlayMode" (" PlayMode (" ++ show newMode ++ ")")+ pageViewUpdateStatusbar view "PlayMode" (" PlayMode (" ++ show newMode ++ ")") -- | Play current track. playlistViewPlayCurrent :: PlaylistView -> IO ()@@ -277,44 +282,74 @@ playlistViewPrevNode = treeViewFocusPrevToplevelNode . playlistViewTreeView -- | Keymap.-playlistViewKeymap :: Map Text (PlaylistView -> IO ())-playlistViewKeymap = +playlistViewLocalKeymap :: Map Text Text+playlistViewLocalKeymap = M.fromList- [("j", playlistViewNextNode)- ,("k", playlistViewPrevNode)- ,("Down", playlistViewNextNode)- ,("Up", playlistViewPrevNode) - ,("J", playlistViewScrollToBottom)- ,("K", playlistViewScrollToTop)- ,(" ", playlistViewScrollVerticalPage True)- ,("b", playlistViewScrollVerticalPage False)- ,("PageDown", playlistViewScrollVerticalPage True)- ,("PageUp", playlistViewScrollVerticalPage False)- ,("m", playlistViewPlay)- ,("Return", playlistViewPlay)- ,("M", playlistViewPause)- ,("z", playlistViewStop)- ,("h", playlistViewBackward)- ,("l", playlistViewForward)- ,("Right", playlistViewBackward)- ,("Left", playlistViewForward)- ,(",", playlistViewVolumeDec)- ,(".", playlistViewVolumeInc)- ,("-", playlistViewVolumeDec)- ,("=", playlistViewVolumeInc)- ,("n", playlistViewPlayNext)- ,("p", playlistViewPlayPrev)- ,("N", playlistViewPlayRandom)- ,("P", playlistViewSwitchPlayMode)- ,("1", playlistViewSortByTitle)- ,("2", playlistViewSortByAlbum)- ,("3", playlistViewSortByArtist)- ,("4", playlistViewSortByYear)- ,("5", playlistViewSortByTrack)- ,("6", playlistViewSortByBitRate)- ,("7", playlistViewSortByDuration)+ [("j", "Next")+ ,("k", "Previous")+ ,("Down", "Next")+ ,("Up", "Previous") + ,("J", "Scroll to bottom")+ ,("K", "Scroll to top")+ ,(" ", "Scroll page up")+ ,("b", "Scroll page down")+ ,("PageDown", "Scroll page up")+ ,("PageUp", "Scroll page down")+ ,("m", "Play")+ ,("Return", "Play")+ ,("M", "Pause")+ ,("z", "Stop")+ ,("h", "Backward")+ ,("l", "Forward")+ ,("Right", "Backward")+ ,("Left", "Forward")+ ,(",", "Decrease volume")+ ,(".", "Increase volume")+ ,("-", "Decrease volume")+ ,("=", "Increase volume")+ ,("n", "Play next")+ ,("p", "Play previous")+ ,("N", "Play random")+ ,("P", "Switch play mode")+ ,("1", "Sort by title")+ ,("2", "Sort by album")+ ,("3", "Sort by artist")+ ,("4", "Sort by year")+ ,("5", "Sort by track")+ ,("6", "Sort by bit rate")+ ,("7", "Sort by duration") ] +-- | Keymap.+playlistViewLocalCommandMap :: Map Text (PlaylistView -> IO ())+playlistViewLocalCommandMap = + M.fromList+ [("Next", playlistViewNextNode)+ ,("Previous", playlistViewPrevNode)+ ,("Scroll to bottom", playlistViewScrollToBottom)+ ,("Scroll to top", playlistViewScrollToTop)+ ,("Scroll page up", playlistViewScrollVerticalPage True)+ ,("Scroll page down", playlistViewScrollVerticalPage False)+ ,("Play", playlistViewPlay)+ ,("Pause", playlistViewPause)+ ,("Stop", playlistViewStop)+ ,("Backward", playlistViewBackward)+ ,("Forward", playlistViewForward)+ ,("Decrease volume", playlistViewVolumeDec)+ ,("Increase volume", playlistViewVolumeInc)+ ,("Play next", playlistViewPlayNext)+ ,("Play previous", playlistViewPlayPrev)+ ,("Play random", playlistViewPlayRandom)+ ,("Switch play mode", playlistViewSwitchPlayMode)+ ,("Sort by title", playlistViewSortByTitle)+ ,("Sort by album", playlistViewSortByAlbum)+ ,("Sort by artist", playlistViewSortByArtist)+ ,("Sort by year", playlistViewSortByYear)+ ,("Sort by track", playlistViewSortByTrack)+ ,("Sort by bit rate", playlistViewSortByBitRate)+ ,("Sort by duration", playlistViewSortByDuration)+ ]+ -- | Sort by title. playlistViewSortByTitle :: PlaylistView -> IO () playlistViewSortByTitle view = playlistViewSort view MOTitle@@ -414,10 +449,10 @@ -- Update play mode status. mode <- readTVarIO (playlistViewPlayMode view)- pageFrameUpdateStatusbar (playlistViewFrame view) "PlayMode" (" PlayMode (" ++ show mode ++ ")")+ pageViewUpdateStatusbar view "PlayMode" (" PlayMode (" ++ show mode ++ ")") -- Update playing status.- pageFrameUpdateStatusbar (playlistViewFrame view) "Playing" (" Playing : " ++ displayPath)+ pageViewUpdateStatusbar view "Playing" (" Playing : " ++ displayPath) -- Send daemon signal to play. processId <- fmap show getProcessID@@ -479,14 +514,41 @@ stepInc <- (<<<=) i2d treeViewGetSelectedCellHeight tv treeViewScrollVertical tv sw (if isDown then stepInc else (- stepInc)) --- | Handle key action.-playlistViewHandleKeyAction :: PlaylistView -> Text -> SerializedEvent -> IO () -playlistViewHandleKeyAction view keystoke sEvent = - case M.lookup keystoke playlistViewKeymap of- Just action -> action view- Nothing -> widgetPropagateEvent (playlistViewTreeView view) sEvent- -- | Scrolled window. playlistViewScrolledWindow :: PlaylistView -> ScrolledWindow playlistViewScrolledWindow = pageFrameScrolledWindow . playlistViewFrame++-- | Save state.+playlistViewSaveState :: PlaylistView -> Maybe FilePath -> IO ()+playlistViewSaveState view@(PlaylistView {playlistViewBuffer = buffer+ ,playlistViewTreeView = treeView}) + statePath = do+ -- Get selected path.+ selectedPath <- treeViewGetSelectedPath treeView++ -- Get scroll position.+ scrolledWindowPosition <- scrolledWindowGetValue (playlistViewScrolledWindow view)++ -- Save state.+ let state = PlaylistState selectedPath scrolledWindowPosition+ case statePath of+ Nothing -> writeTVarIO (playlistBufferState buffer) state+ Just path -> writeConfigPath path state++-- | Restore state.+playlistViewRestoreState :: PlaylistView -> Maybe FilePath -> IO ()+playlistViewRestoreState view@(PlaylistView {playlistViewBuffer = buffer+ ,playlistViewTreeView= treeView})+ statePath = do+ bufferState <- readTVarIO (playlistBufferState buffer)+ (PlaylistState selectedPath scrolledWindowPosition) <- + case statePath of+ Just path -> readConfigPath path bufferState+ Nothing -> return bufferState++ -- Restore selected path.+ selectedPath ?>= \path -> treeViewSetCursor treeView path Nothing++ -- Restore scroll position.+ scrolledWindowSetValue (playlistViewScrolledWindow view) scrolledWindowPosition
Setup.hs view
@@ -1,7 +1,7 @@ -- Author: Andy Stewart <lazycat.manatee@gmail.com> -- Maintainer: Andy Stewart <lazycat.manatee@gmail.com> -- --- Copyright (C) 2010 Andy Stewart, all rights reserved.+-- Copyright (C) 2010 ~ 2011 Andy Stewart, all rights reserved. -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by@@ -19,6 +19,7 @@ import Distribution.Simple import Manatee.Core.Config import Manatee.Core.Types+import Manatee.Toolkit.Cabal.Utils import Manatee.Toolkit.General.List import Manatee.Toolkit.General.Map import Manatee.Extension.Mplayer.PageMode@@ -29,7 +30,7 @@ -- Update Rule after install successful. simpleUserHooks { -- Update PageTypeRule.- postInst = \ _ _ _ _ -> do+ postInst = \ _ _ pack_des lbi -> do (PageTypeRule rule) <- readConfig pageTypeRulePath (PageTypeRule M.empty) writeConfig pageTypeRulePath (PageTypeRule (M.insert "PagePlayer" "manatee-mplayer" rule)) -- Update FileOpenRule.@@ -46,4 +47,13 @@ (PageModeRule modeRule) <- readConfig pageModeRulePath (PageModeRule M.empty) writeConfig pageModeRulePath (PageModeRule (M.insert "PagePlayer" (Left $ pageModeName mplayerMode) modeRule))+ -- Update Application info.+ let snapshotPath = getDataFilePath pack_des lbi "data/welcome/snapshot.png"+ welcomeFile = getDataFilePath pack_des lbi "data/welcome/Fireflies.mp3"+ (WelcomeApplication apps) <- readConfig welcomeApplicationPath (WelcomeApplication M.empty)+ writeConfig welcomeApplicationPath (WelcomeApplication+ (M.insert + ("Multimedia Player", snapshotPath)+ ("PagePlayer", welcomeFile, [])+ apps)) }
+ data/welcome/Fireflies.mp3 view
file too large to diff
+ data/welcome/snapshot.png view
binary file changed (absent → 138631 bytes)
manatee-mplayer.cabal view
@@ -1,13 +1,13 @@ name: manatee-mplayer-version: 0.0.8+version: 0.1.0 Cabal-Version: >= 1.6 license: GPL-3 license-file: LICENSE-copyright: (c) 2009 ~ 2010 Andy Stewart+copyright: (c) 2010 ~ 2011 Andy Stewart synopsis: Mplayer client extension for Manatee. description: manatee-mplayer is mplayer client extension for Manatee (Haskell/Gtk+ Integrated Live Environment) .- Video at (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://www.youtube.com/watch?v=A3DgKDVkyeM> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html>+ Video (Select 720p HD) at : <http://www.youtube.com/watch?v=weS6zys3U8k> <http://www.youtube.com/watch?v=A3DgKDVkyeM> <http://v.youku.com/v_show/id_XMjI2MDMzODI4.html> . Screenshots at : <http://goo.gl/MkVw> .@@ -22,16 +22,20 @@ stability: provisional category: Manatee, Multimedia Player, Multimedia -tested-with: GHC==6.12.3+tested-with: GHC==7.0.2 build-type: Custom +data-dir: ""+data-files: data/welcome/snapshot.png+ data/welcome/Fireflies.mp3+ Source-Repository head type: darcs location: http://patch-tag.com/r/AndyStewart/manatee-mplayer Library- build-depends: base >= 4 && < 5, manatee-core >= 0.0.8, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,- containers >= 0.3.0.0, gtk-serialized-event >= 0.12.0, gtk >= 0.12.0, + build-depends: base >= 4 && < 5, manatee-core >= 0.1.0, dbus-client >= 0.3 && < 0.4, stm >= 2.1.2.0,+ containers >= 0.3.0.0, gtk >= 0.12.0, derive, binary, text >= 0.7.1.0, bytestring >= 0.9.1.5, libtagc >= 0.12.0, regex-tdfa >= 1.1.2, filepath >= 1.1.0.3, utf8-string >= 0.3.4, time, dbus-core, gio >= 0.12.0, random >= 1.0.0.2, unix >= 2.4.0.0, process