mpv

package module
v0.0.0-...-80ea1a6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 30, 2019 License: MIT Imports: 14 Imported by: 0

README

mpv (remote) control library

This library provides everything needed to (remote) control the mpv media player.

It provides an easy api, a json api and rpc functionality.

Usecases: Remote control your mediaplayer running on a raspberry pi or laptop or build a http interface for mpv

Usage

$ go get github.com/blang/mpv

Note: Always vendor your dependencies or fix on a specific version tag.

Start mpv:

$ mpv --idle --input-ipc-server=/tmp/mpvsocket

Remote control:

import github.com/blang/mpv

ipcc := mpv.NewIPCClient("/tmp/mpvsocket") // Lowlevel client
c := mpv.NewClient(ipcc) // Highlevel client, can also use RPCClient

c.LoadFile("movie.mp4", mpv.LoadFileModeReplace)
c.SetPause(true)
c.Seek(600, mpv.SeekModeAbsolute)
c.SetFullscreen(true)
c.SetPause(false)

pos, err := c.Position()
fmt.Printf("Position in Seconds: %.0f", pos)

Also check the GoDocs.

Features

  • Low-Level and High-Level API
  • RPC Server and Client (fully transparent)
  • HTTP Handler exposing lowlevel API (json)

Contribution

Feel free to make a pull request. For bigger changes create a issue first to discuss about it.

License

See LICENSE file.

Documentation

Index

Constants

View Source
const (
	LoadFileModeReplace    = "replace"
	LoadFileModeAppend     = "append"
	LoadFileModeAppendPlay = "append-play" // Starts if nothing is playing
)

Mode options for Loadfile

View Source
const (
	SeekModeRelative = "relative"
	SeekModeAbsolute = "absolute"
)

Mode options for Seek

View Source
const (
	LoadListModeReplace = "replace"
	LoadListModeAppend  = "append"
)

Mode options for LoadList

Variables

View Source
var (
	ErrTimeoutSend = errors.New("Timeout while sending command")
	ErrTimeoutRecv = errors.New("Timeout while receiving response")
)

Timeout errors while communicating via IPC

View Source
var ChannelErr = errors.New("Response channel closed")

The client should be restarted

View Source
var ErrInvalidType = errors.New("Invalid type")

ErrInvalidType is returned if the response data does not match the methods return type. Use GetProperty or find matching type in mpv docs.

Functions

func HTTPServerHandler

func HTTPServerHandler(client LLClient) http.Handler

HTTPServerHandler returns a http.Handler to access a client via a lowlevel json-api. Register as route on your server:

http.Handle("/mpv", mpv.HTTPHandler(lowlevelclient)

Use api:

POST http://host/lowlevel Body: { "command": ["get_property", "fullscreen"] }

Result:

{"error":"success","data":false}

Types

type AudioTrack

type AudioTrack struct {
	Channels      int    `json:"audio-channels"`
	ChannelCount  int    `json:"demux-channel-count"`
	DemuxChannels string `json:"demux-channels"`
	SampleRate    int    `json:"demux-samplerate"`
}

type Client

type Client struct {
	LLClient
}

Client is a more comfortable higher level interface to LLClient. It can use any LLClient implementation.

func NewClient

func NewClient(llclient LLClient) *Client

NewClient creates a new highlevel client based on a lowlevel client.

func (*Client) Cycle

func (c *Client) Cycle(property string) error

property - e.g. pause

func (*Client) Duration

func (c *Client) Duration() (float64, error)

Duration returns the duration of the currently playing file.

func (*Client) Filename

func (c *Client) Filename() (string, error)

Filename returns the currently playing filename

func (*Client) Fullscreen

func (c *Client) Fullscreen() (bool, error)

Fullscreen returns true if the player is in fullscreen mode.

func (*Client) GetBoolProperty

func (c *Client) GetBoolProperty(name string) (bool, error)

GetBoolProperty reads a bool property and returns the data as a boolean.

func (*Client) GetFloatProperty

func (c *Client) GetFloatProperty(name string) (float64, error)

GetFloatProperty reads a float property and returns the data as a float64.

func (*Client) GetProperty

func (c *Client) GetProperty(name string) (string, error)

GetProperty reads a property by name and returns the data as a string.

func (*Client) Idle

func (c *Client) Idle() (bool, error)

Idle returns true if the player is idle

func (*Client) LoadList

func (c *Client) LoadList(path string, mode string) error

LoadList loads a playlist from path. It can either replace the current playlist (LoadListModeReplace) or append to the current playlist (LoadListModeAppend).

func (*Client) Loadfile

func (c *Client) Loadfile(path string, mode string) error

Loadfile loads a file, it either replaces the currently playing file (LoadFileModeReplace), appends to the current playlist (LoadFileModeAppend) or appends to playlist and plays if nothing is playing right now (LoadFileModeAppendPlay)

func (*Client) Mute

func (c *Client) Mute() (bool, error)

Mute returns true if the player is muted.

func (*Client) Path

func (c *Client) Path() (string, error)

Path returns the currently playing path

func (*Client) Pause

func (c *Client) Pause() (bool, error)

Pause returns true if the player is paused

func (*Client) PercentPosition

func (c *Client) PercentPosition() (float64, error)

PercentPosition returns the current playback position in percent.

func (*Client) PlaybackTime

func (c *Client) PlaybackTime() (float64, error)

func (*Client) PlaylistNext

func (c *Client) PlaylistNext() error

PlaylistNext plays the next playlistitem or NOP if no item is available.

func (*Client) PlaylistPrevious

func (c *Client) PlaylistPrevious() error

PlaylistPrevious plays the previous playlistitem or NOP if no item is available.

func (*Client) Position

func (c *Client) Position() (float64, error)

Position returns the current playback position in seconds.

func (*Client) Quit

func (c *Client) Quit(code int) error

Exit the player. If an argument is given, it's used as process exit code.

func (*Client) Seek

func (c *Client) Seek(n int, mode string) error

Seek seeks to a position in the current file. Use mode to seek relative to current position (SeekModeRelative) or absolute (SeekModeAbsolute).

func (*Client) SetAudioTrack

func (c *Client) SetAudioTrack(ID int) error

While playback is active, you can set existing tracks only. (The option allows setting any track ID, and which tracks to enable is chosen at loading time.)

func (*Client) SetFullscreen

func (c *Client) SetFullscreen(v bool) error

SetFullscreen activates/deactivates the fullscreen mode.

func (*Client) SetMute

func (c *Client) SetMute(mute bool) error

SetMute mutes or unmutes the player.

func (*Client) SetOSD

func (c *Client) SetOSD(ok bool) error

Display OSD menu

func (*Client) SetPause

func (c *Client) SetPause(pause bool) error

SetPause pauses or unpauses the player

func (*Client) SetProperty

func (c *Client) SetProperty(name string, value interface{}) error

SetProperty sets the value of a property.

func (*Client) SetTextTrack

func (c *Client) SetTextTrack(ID int) error

subtitle track

func (*Client) SetVideoTrack

func (c *Client) SetVideoTrack(ID int) error

func (*Client) SetVolume

func (c *Client) SetVolume(i int) error

func (*Client) SetVolumeGain

func (c *Client) SetVolumeGain(i int) error

1 increases the volume by 1 , -1 decreases the volume by 1

func (*Client) Speed

func (c *Client) Speed() (float64, error)

Speed returns the current playback speed.

func (*Client) Stop

func (c *Client) Stop() error

Stop playback and clear playlist. With default settings, this is essentially like quit. Useful for the client API: playback can be stopped without terminating the player.

func (*Client) SubAdd

func (c *Client) SubAdd(file string, flags ...SubFlag) error

Load the given subtitle file. It is selected as current subtitle after loading. The flags args is one of the following values:

func (*Client) SubRemove

func (c *Client) SubRemove(id string) error

Remove the given subtitle track. If the id argument is missing, remove the current track. (Works on external subtitle files only.)

func (*Client) TrackList

func (c *Client) TrackList() ([]Track, error)

List of audio/video/sub tracks, current entry marked. Currently, the raw property value is useless. This has a number of sub-properties.

func (*Client) Volume

func (c *Client) Volume() (float64, error)

Volume returns the current volume level.

type IPCClient

type IPCClient struct {
	// contains filtered or unexported fields
}

IPCClient is a low-level IPC client to communicate with the mpv player via socket.

func NewIPCClient

func NewIPCClient(cx context.Context, socket string) (*IPCClient, error)

NewIPCClient creates a new IPCClient connected to the given socket.

func (*IPCClient) Close

func (c *IPCClient) Close() error

func (*IPCClient) Exec

func (c *IPCClient) Exec(command ...interface{}) (*Response, error)

Exec executes a command via ipc and returns the response. A request can timeout while sending or while waiting for the response. An error is only returned if there was an error in the communication. The client has to check for `response.Error` in case the server returned an error.

type JSONRequest

type JSONRequest struct {
	Command []interface{} `json:"command"`
}

JSONRequest send to the server.

type JSONResponse

type JSONResponse struct {
	Err  string      `json:"error"`
	Data interface{} `json:"data"` // May contain float64, bool or string
}

JSONResponse send from the server.

type LLClient

type LLClient interface {
	Exec(command ...interface{}) (*Response, error)
	Close() error
}

LLClient is the most low level interface

type RPCClient

type RPCClient struct {
	// contains filtered or unexported fields
}

RPCClient represents a LLClient over RPC.

func NewRPCClient

func NewRPCClient(client *rpc.Client) *RPCClient

NewRPCClient creates a new RPCClient based on rpc.Client

func (*RPCClient) Exec

func (s *RPCClient) Exec(command ...interface{}) (*Response, error)

Exec executes a command over rpc.

type RPCServer

type RPCServer struct {
	// contains filtered or unexported fields
}

RPCServer publishes a LLClient over RPC.

func NewRPCServer

func NewRPCServer(client LLClient) *RPCServer

NewRPCServer creates a new RPCServer based on lowlevel client.

func (*RPCServer) Exec

func (s *RPCServer) Exec(args *[]interface{}, res *Response) error

Exec exposes llclient.Exec via RPC. Not intended to be used directly.

type Response

type Response struct {
	Err       string          `json:"error"`
	Data      json.RawMessage `json:"data"` // May contain float64, bool or string
	Event     string          `json:"event"`
	RequestID int             `json:"request_id"`
}

Response received from mpv. Can be an event or a user requested response.

type SubFlag

type SubFlag string
const (
	// Select the subtitle immediately.
	Select SubFlag = "select"
	// Don't select the subtitle.
	// (Or in some special situations,
	// let the default stream selection mechanism decide.)
	Auto SubFlag = "auto"
	// Select the subtitle. If a subtitle with the same filename was
	// already added, that one is selected, instead of loading a
	// duplicate entry. (In this case, title/language are ignored,
	// and if the was changed since it was loaded, these
	// changes won't be reflected.)
	Cached SubFlag = "cached"
	// The title argument sets the track title in the UI.
	Title SubFlag = "title"
	// The lang argument sets the track language, and
	// can also influence stream selection with flags set
	// to auto.
	Lang SubFlag = "lang"
)

type Track

type Track struct {
	ID          int    `json:"id"`   // unique wihtin Type
	Type        string `json:"type"` // e.g. audio , video, sub
	SrcID       int    `json:"src-id"`
	Title       string `json:"title"`
	Lang        string `json:"lang"`
	Albumart    bool   `json:"albumart"`
	Default     bool   `json:"default"`
	Forced      bool   `json:"forced"`
	External    bool   `json:"external"`
	Selected    bool   `json:"selected"`
	FFIndex     int    `json:"ff-index"`
	DecoderDesc string `json:"decoder-desc"`
	Codec       string `json:"codec"`
	Filename    string `json:"external-filename"`

	AudioTrack
	VideoTrack
}

type VideoTrack

type VideoTrack struct {
	DemuxW   int     `json:"demux-w"`
	DemuxH   int     `json:"demux-h"`
	DemuxFPS float64 `json:"demux-fps"`
}

Directories

Path Synopsis
examples
rpc

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL