Perl 6 module for controlling vlc media player via its Web interface
Switch branches/tags
Nothing to show
Clone or download
Latest commit f74c287 Sep 8, 2018

README.md

Build Status

NAME

WWW::vlc::Remote — Control vlc media player via its Web interface

TABLE OF CONTENTS

SYNOPSIS

use lib <lib>;
use WWW::vlc::Remote;

my $vlc := WWW::vlc::Remote.new;
say "Available songs are:";
.say for $vlc.playlist: :skip-meta;

my UInt:D $song := val prompt "\nEnter an ID of song to play: ";
with $vlc.playlist.first: *.id == $song {
    say "Playing $_";
    .play
}
else {
    say "Did not find any songs with ID `$song`";
}

EXAMPLES

See examples/ dir for some examples of module's use.

DESCRIPTION

Provides programmatic interface to VLC Media player using its Web remote interface.

ENABLE THE REMOTE

Open up your VLC player, go to ToolsPreferences"Show settings" (all) (bottom left) → InterfaceMain Interfaces and ensure "Web" is checked. It's possible "Remote control interface" needs to be checked as well and it happened to me that I had to restart my VLC a couple of times before the interface launched and the module was able to connect.

You can now use --http-password command line option to vlc to enable its Web remote. The password is required. It might be possible to set it in the preferences somewhere (Main InterfacesLua"Lua HTTP"Password maybe), but I was not able to successfully find where.

Along with --http-password you can set --http-port to adjust which port vlc will listen on (defaults to 8080). See vlc --help --advanced for more options.

WWW::vlc::Remote class

METHODS

.new

submethod BUILD (
    Str    :$pass = 'pass',
    Str:D  :$host = 'http://127.0.0.1',
    UInt:D :$port = 8080,
)

Constructs and returns a new WWW::vlc::Remote object. Takes three named arguments, all optional: the password for the vlc Web interface (that's the value you specified to --http-password), as well as the host and the port vlc is listening on.

.empty

method empty(--> WWW::vlc::Remote:D)

Empty the playlist. Returns the invocant.

.enqueue

method enqueue(Str:D $url --> WWW::vlc::Remote:D)

Add a media item to the playlist. Returns the invocant. The $url can be a URL to the file on the filesystem or to an online resource.

.enqueue-and-play

method enqueue-and-play(Str:D \url --> WWW::vlc::Remote:D)

Add a media item to the playlist and start playing it. Returns the invocant. The $url can be a URL to the file on the filesystem or to an online resource.

.delete

multi method delete (WWW::vlc::Remote::Track:D $track --> WWW::vlc::Remote::Track:D)
multi method delete (UInt:D $id --> WWW::vlc::Remote::Track:D)

Delete a track off the playlist. Takes either a WWW::vlc::Remote::Track instance (obtainable from .playlist method) or an Int numeric ID of the playlist track to delete. Returns the invocant.

.playlist

method playlist(Bool :$skip-meta --> Seq:D)

Returns a Seq of WWW::vlc::Remote::Track objects representing the currently loaded play list. Some of the potential items on the playlist aren't tracks but could be folders or artwork. Those are known as "meta" files and setting :$skip-meta to true will skip those items.

Some "meta" files, such as directories on the playlist may contain more playable files, however they need to be expanded for .playlist to see them. You can expand them by giving their IDs or WWW::vlc::Remote::Track objects to WWW::vlc::Remote.play method (or calling .play on that WWW::vlc::Remote::Track object directly)

Note: currently what is and isn't a "meta" file is decided by whether duration is a positive number. I don't know if that causes flagging of some playable type of media as meta files.

.play

multi method play (--> WWW::vlc::Remote::Track:D)
multi method play (WWW::vlc::Remote::Track:D $track --> WWW::vlc::Remote::Track:D)
multi method play (UInt:D $id --> WWW::vlc::Remote::Track:D)

Takes either a WWW::vlc::Remote::Track instance (obtainable from .playlist method) or an Int numeric ID of the playlist track to play. Causes vlc to immediately start playing that track. Returns the invocant.

Can be called without any arguments, in which case the currently active playlist item will be played (e.g. can be used after using .stop).

.seek

method seek ($val where Str:D|Numeric:D = '0%' --> ::?CLASS:D)

Seeks the current track based on the given $val. Per vlc's wiki:

 Allowed values are of the form:
   [+ or -][<int><H or h>:][<int><M or m or '>:][<int><nothing or S or s or ">]
   or [+ or -]<int>%
   (value between [ ] are optional, value between < > are mandatory)
 examples:
   1000 -> seek to the 1000th second
   +1H:2M -> seek 1 hour and 2 minutes forward
   -10% -> seek 10% back

Using too-large values (e.g. +220%) is perfectly acceptable.

.status

method status(--> DOM::Tiny:D)

Fetches the XML of a bunch of info of the current status and returns it as DOM::Tiny object

.stop

method stop(--> WWW::vlc::Remote::Track:D)

Causes vlc to stop playing. Returns the invocant.

.toggle-random

method toggle-random(--> WWW::vlc::Remote:D)

Toggles random playback. Returns the invocant.

.toggle-loop

method toggle-loop(--> WWW::vlc::Remote:D)

Toggles loop. Returns the invocant.

.toggle-repeat

method toggle-repeat(--> WWW::vlc::Remote:D)

Toggles repeat. Returns the invocant.

.toggle-fullscreen

method toggle-fullscreen(--> WWW::vlc::Remote:D)

Toggles fullscreen. Returns the invocant.

.toggle-service-discovery

method toggle-service-discovery(Str:D $val--> WWW::vlc::Remote:D)

Toggles service discovery. Returns the invocant. The $val argument is the service, which per vlc's wiki:

 Typical values are:
   sap
   shoutcast
   podcast
   hal

.volume

method volume($val where Str:D|Numeric:D --> ::?CLASS:D)

Sets the volume based on the $val. Per vlc's wiki:

 Allowed values are of the form:
   +<int>, -<int>, <int> or <int>%

Note: during my testing, the % values did not work.

WWW::vlc::Remote::Track class

This class isn't meant to be instantiatable directly and instead is returned from by some WWW::vlc::Remote methods, such as .playlist.

ATTRIBUTES

$.vlc

has WWW::vlc::Remote:D $.vlc

The WWW::vlc::Remote object that created this WWW::vlc::Remote::Track object.

$.uri

has Str:D $.uri

The URI of this track.

$.name

has Str:D $.name

The name of this track.

$.id

has UInt:D $.id

The ID of this track. This is the ID desired by some WWW::vlc::Remote methods, such as .play.

$.id

has Int:D $.duration

The duration of this track, in seconds. Can be zero or even negative if this track isn't a proper playable item, such as a directory or artwork.

METHODS

.play

method play(--> WWW::vlc::Remote:D)

Takes no arguments and causes vlc to play this track. The same as calling WWW::vlc::Remote.play with the ID of this track. Returns the WWW::vlc::Remote object that created this WWW::vlc::Remote::Track object.

.Str

method Str (--> Str:D)

Returns a string in the form of "$id $name ($dur)" where $id is the track's $.id, $name is $.name, and $dur is a string in the form of 2m45s calculated from the track's $.duration (no hours, only minutes and seconds). If $.duration is zero or negative, $dur is set to string N/A.

.gist

method gist (--> Str:D)

Calls .Str on the invocant and returns the result.


REPOSITORY

Fork this module on GitHub: https://github.com/zoffixznet/perl6-WWW-vlc-Remote

BUGS

To report bugs or request features, please use https://github.com/zoffixznet/perl6-WWW-vlc-Remote/issues

AUTHOR

Zoffix Znet (https://perl6.party/)

LICENSE

You can use and distribute this module under the terms of the The Artistic License 2.0. See the LICENSE file included in this distribution for complete details.