]> git.ktnx.net Git - mpd-feeder.git/blobdiff - bin/mpd-feeder
more docs
[mpd-feeder.git] / bin / mpd-feeder
index ffb7994e2db793f5a42a3daae7f4a1714044bbf2..15520e72c2bce71dc12827c5133a3c2090830163 100755 (executable)
@@ -8,6 +8,12 @@ use App::MPD::Feeder;
 use Log::Any qw($log);
 use Log::Any::Adapter Stderr => log_level => 'error';
 
+{   # autoflush without IO::Handle
+    my $fh = select STDERR;
+    $| = 1;
+    select $fh;
+}
+
 my $feeder = App::MPD::Feeder->new();
 
 if (@ARGV) {
@@ -18,3 +24,263 @@ if (@ARGV) {
 }
 
 $feeder->run_loop;
+
+__END__
+
+=encoding UTF-8
+
+=head1 NAME
+
+mpd-feeder -- MPD playlist manager with emphasys on diversity
+
+=head1 SYNOPSIS
+
+Engage daemon mode, keeping the MPD playlist full:
+
+    mpd-feeder [I<option>...]
+
+Perform a single command and return to the OS:
+
+    mpd-feeder [I<option>...] I<command>
+
+=head1 DESCRIPTION
+
+C<mpd-feeder> keeps the playlist of MPD full with songs, avoiding songs,
+artists and albums that have been queued recently. This can be used for
+listening to large song collections without repetitions that happen with random
+shuffling or when a given artist has many more songs that the rest.
+
+The song list is stored in a PostgreSQL database that is kept updated
+automatically as the MPD database is updated.
+
+The timespans for "recent" queueing are configurable.
+
+=head1 COMMANDS
+
+In daemon mode (with no command given), C<mpd-feeder> connects to MPD, updates
+its local copy of the song database (but see C<--skip-db-update> option below)
+and makes sure that the playlist is never left with fewer songs than the
+configured minimum. Playlist changes are detected when they happen.
+
+When a command is given, C<mpd-feeder> does not engage in daemon mode, but
+returns to the OS after execution.
+
+=head2 dump-config
+
+Prints configuration file contents on standard output. Can be used to create
+skeleton F<mpd-feeder.conf>. Makes no connection to MPD or PostgreSQL.
+
+=head2 add-unwanted-artist I<artist name>
+
+Adds one artist to toe list of unwanted artists. That list is consulted when a
+new song needs to be added to MPD's playlist and songs by artists in it are
+skipped.
+
+=head2 del-unwanted-artist I<artist name>
+
+The reverse of C<add-unwanted-artist>.
+
+=head2 list-unwanted-artists
+
+Prints the contents of the unwanted artist list, one per line.
+
+=head2 add-unwanted-album I<album name> by I<artist name>
+
+=head2 del-unwanted-album I<album name> by I<artist name>
+
+=head2 list-unwanted-albums
+
+Manupulate the list of unwanted albums. Useful when there is a specific album
+you don't want to listen to, but you don't mind other albums by the same
+artist.
+
+=head2 one-shot
+
+Connects to MPD, and if the playlist is below the configured minimum, adds some
+songs.
+
+=head2 single
+
+Adds one song to the playlist. Ignores the configured minimum playlist length.
+
+=head1 OPTIONS
+
+=over
+
+=item B<--config> I<file>
+
+=item B<--cfg> I<file>
+
+The configuration file to read at startup.
+
+B<Default>: C</etc/mpd-feeder/mpd-feeder.conf>.
+
+=item B<--log-level> I<trace|debug|info|notice|warning|error|critical|alert|emergency>
+
+Set log verbosity. C<trace> is most talkative, including all exchanges with MPD.
+
+=item B<--skip-db-update>
+
+Skips the startup sync of the song database from MPD.
+
+=item B<--tql> I<number>
+
+=item B<--target-queue-length> I<number>
+
+Sets the wanted playlist length.
+
+=item B<--mpd-host> I<hostname>
+
+=item B<--mpd-port> I<number>
+
+Parameters for connecting to MPD.
+
+=item B<--db-path> I<DSN>
+
+=item B<--db-user> I<username>
+
+Parameters for connecting to PostgreSQL.
+
+=item B<--min-album-interval> I<duration>
+
+=item B<--min-song-interval> I<duration>
+
+=item B<--min-artist-interval> I<duration>
+
+Tunes the minimum time between adding songs from the same album/artist and
+before re-adding the same song.
+
+I<duration> is a text duration, recognised by L<Time::Duration::Parse>.
+
+=back
+
+=head1 CONFIGURATION FILE
+
+Configuration file is an C<.ini> file with the following sections. You can get
+a skeleton configuration by executing C<mpd-feeder dump-config>. That will
+produce a configuration file filled with the default values.
+
+=head2 [mpd-feeder]
+
+=over
+
+=item B<log_level> = I<level>
+
+Determines the verboseness of the logging. See L</--log-level> option above.
+
+B<Default>: C<warn>.
+
+=back
+
+=head2 [mpd]
+
+=over
+
+=item B<host> = I<hostname>
+
+The host where MPD is running.
+
+B<Default>: none. However, L<Net::Async::MPD> defaults to the value of the
+C<MPD_HOST> environment variable, and if that is empty - C<localhost>.
+
+=item B<port> = I<number>
+
+The port number where MPD is listening.
+
+B<Default>: none. However, L<Net::Async::MPD> defaults to the value of the
+C<MPD_PORT> environment variable, and if that is empty - C<6600>.
+
+=item B<initial-reconnect-delay> = I<duration>
+
+=item B<max-reconnect-delay> = I<duration>
+
+When the connection to MPD is lost, a delay is inserted before a re-connection
+attempt is made. The duration of the delay is controlled with these two
+options. Each delay is a bit longer than the last, starting with the value of
+<initial-reconnect-delay>, and topped at the value of C<max-reconnect-delay>.
+
+When a connection is made, the delay before the next re-connection is reset to
+C<initial-reconnect-delay>.
+
+B<Default>: C<3 seconds> for C<initial-reconnect-delay> and C<2 minutes> for
+C<max-reconnect-delay>.
+
+=back
+
+=head2 [queue]
+
+=over
+
+=item B<target-length> = I<number>
+
+The number of songs to always have in the MPD's playlist.
+
+B<Default>: C<10>.
+
+=item B<min-song-interval> = I<duration>
+
+The minimum amount of time after a song is added to the playlist by
+B<mpd-feeder>, before it is considered again.
+
+B<Default>: C<13 days>
+
+=item B<min-album-interval> = I<duration>
+
+The minimum amount of time after a song is added to the playlist by
+B<mpd-feeder> before songs from the same album are considered for addition to
+the playlist.
+
+B<Default>: C<5 hours>.
+
+=item B<min-artist-interval> = I<duration>
+
+The minimum amount of time after a song is added to the playlist by
+B<mpd-feeder> before songs by the same artist are consideret for addition to
+the playlist.
+
+B<Default>: C<1 hour and 15 minutes>.
+
+=back
+
+=head2 [db]
+
+=over
+
+=item B<path> = I<DSN>
+
+PostgresQL database name to use for local storage.
+
+B<Default>: C<mpd-feeder>
+
+=item B<user> = I<name>
+
+PostgreSQL user name to connect as.
+
+B<Default>: none.
+
+=item B<password> = I<secret>
+
+Password to use when connecting to PostgreSQL.
+
+B<Default>: none.
+
+=back
+
+See F<init.sql> file in the distribution for commands to initializa the
+database.
+
+=head1 COPYRIGHT & LICENSE
+
+Copyright © 2021 Damyan Ivanov L<dam+mpdfeeder@ktnx.net>
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License version 2 as published by the Free
+Software Foundation.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
+Street, Fifth Floor, Boston, MA 02110-1301 USA.