[BACK]Return to playmp3s.pl CVS log [TXT][DIR] Up to [local] / mp3 / daemon

Annotation of mp3/daemon/playmp3s.pl, Revision 1.1.1.1

1.1       andrew      1: #!/usr/bin/perl
                      2: ########################################################################
                      3: # PlayMP3.pl *** play's MP3s off a playlist using mp3play
                      4: #
                      5: # 04-14-00
                      6: # Written by andrew fresh <andrew@mad-techies.org>
                      7: ########################################################################
                      8:
                      9: use strict;
                     10: use warnings;
                     11: use diagnostics;
                     12:
                     13: use vars qw/ %cfgs /;
                     14:
                     15: #use strict qw/ $cfgs{list} @playlist $cfgs{mp3play} $filename $cfgs{basedir} $cfgs{htmldir} /;
                     16: #use diagnostics;
                     17:
                     18: my $config_file = shift || "/etc/playmp3s.conf";
                     19:
                     20: my $err_log = $cfgs{errors} || "/var/log/playmp3s.log";
                     21:
                     22: my %cfgs = readconfig($config_file);
                     23:
                     24:
                     25: Print_PlayLog("Beginning playtime\n\n");
                     26:
                     27: my %Full_Playlist;
                     28: $Full_Playlist{last_mod} = 0;
                     29: my $playlist_last_mod = 0;
                     30:
                     31: my @playlist;
                     32:
                     33: for(;;) {
                     34: #   while(1) {
                     35:        my $save_playlist;
                     36:
                     37:         my ($last_mod) = (stat($cfgs{list}))[9];
                     38:        if ($playlist_last_mod != $last_mod) {
                     39:                @playlist = ();
                     40:                $playlist_last_mod = $last_mod;
                     41:        }
                     42:
                     43:        while (! @playlist) {
                     44:                Print_PlayLog("Getting Playlist . . .\n");
                     45: #              bail("getting playlist");
                     46:                @playlist = get_playlist($cfgs{list});
                     47:                        unless (@playlist) {
                     48: #                      bail("getting full playlist");
                     49:                                @playlist = get_full_playlist($cfgs{fulllist});
                     50:
                     51:
                     52:                                Print_PlayLog("Got full playlist\n");
                     53:                                $save_playlist = 0;
                     54:                        } else {
                     55:                                Print_PlayLog("Got normal playlist\n");
                     56:                                $save_playlist = 1;
                     57:                        }
                     58:                        unless (@playlist) { sleep 10; }
                     59:                }
                     60:                Print_PlayLog("Got playlist\n");
                     61:
                     62:                Print_PlayLog("getting song to play . . .\n");
                     63:                my $song = int rand(scalar(@playlist));
                     64:                my $filename = splice(@playlist,$song,1);
                     65:                Print_PlayLog("\tGot $song - filename is\n\t$filename\n");
                     66:
                     67:                Print_PlayLog("displaying file that is playing . . . ");
                     68:                DisplayPlaying($cfgs{htmldir},$filename);
                     69:                Print_PlayLog("done\n");
                     70:
                     71:                if ($save_playlist) {
                     72:                        Print_PlayLog("Saving Playlist. . .");
                     73:                        save_playlist($cfgs{list},@playlist) || bail("Unable to save playlist!: $!");
                     74:                        Print_PlayLog("done\n");
                     75:                }
                     76:
                     77:                Print_PlayLog("Playing: $filename . . .\n");
                     78:
                     79:                if (defined $filename && $filename =~ /\.mp3$/i) {
                     80:                        `$cfgs{mp3play} \"$cfgs{basedir}$filename\"`;
                     81:                } elsif ($filename =~ /\.ogg$/i) {
                     82:                        my $play = "$cfgs{basedir}$filename";
                     83:                        $play =~ s/(\(|\)|&|"|'| |-)/\\$1/g;
                     84:                        print "\n\n$play\n\n";
                     85:                        `$cfgs{oggplay} $play`;
                     86:                }
                     87:
                     88:
                     89: #      my $kid = 0;
                     90: #    while ($kid ne -1 && ContinueRun()) {
                     91: #     while ($kid ne -1) {
                     92: #      print "waiting to end . . . ";
                     93: #        my $kid = waitpid(-1,&WNOHANG);
                     94: #       print "done.\n";
                     95: #    }
                     96:
                     97:
                     98:                if ($song) {
                     99:                        Print_PlayLog("Adding Last. . .");
                    100:                        delete ${ $Full_Playlist{list} }{$song};
                    101:
                    102:                        AddLast($filename, $cfgs{playedlist}, $cfgs{numhistory}, $cfgs{htmldir}, $cfgs{addurl});
                    103:                        Print_PlayLog("done\n");
                    104:                }
                    105:
                    106:                Print_PlayLog("Displaying Nothing . . .");
                    107:                DisplayPlaying($cfgs{htmldir},"Nothing");
                    108:                Print_PlayLog("done\n");
                    109:
                    110:                #@playlist = ();
                    111:
                    112:                sleep 1;
                    113: }
                    114:
                    115:
                    116: sub Install {
                    117:     # add your additional install messages or functions here
                    118:     print "\nThank you for installing this file\n";
                    119: }
                    120:
                    121: sub Remove {
                    122:     # add your additional remove messages or functions here
                    123:     print "\nSorry you had to leave\n";
                    124: }
                    125:
                    126: sub Help {
                    127:     # add your additional help messages or functions here
                    128:     print "\nYou don't really need help do you??\n";
                    129: }
                    130:
                    131: #########################################################################
                    132: # GetTime
                    133: sub GetTime {
                    134:        my $hours = shift || 0;
                    135:        my ($sec,$min,$hour,$mday,$mon,$year,,,) = localtime(time - (3600 * $hours)); # 86400 seconds is one day
                    136:
                    137:        if ($min  < 10) { $min  = "0$min"}
                    138:        if ($sec  < 10) { $sec  = "0$sec"}
                    139:        if ($hour < 10) { $hour = "0$hour"}
                    140:        if ($mday < 10) { $mday = "0$mday"}
                    141:        if ($mon  < 10) { $mon  = "0$mon"}
                    142:
                    143:        my $time = ($year + 1900) . '-' . ++$mon . '-' . $mday  . ' ' . $hour . ':' . $min . ':' . $sec;
                    144:        return $time;
                    145: }
                    146: #########################################################################
                    147:
                    148:
                    149:
                    150:
                    151:
                    152: #######################################################################
                    153: # read in the Playlist
                    154: sub get_full_playlist {
                    155:        my $FILE = shift;
                    156:        my ($last_mod) = (stat($FILE))[9];
                    157:
                    158:        if ($Full_Playlist{last_mod} != $last_mod) {
                    159:                my @list;
                    160:                @list = get_playlist($FILE);
                    161:
                    162:                @list = grep !m#$cfgs{skipregex}#io, @list;
                    163:
                    164:                my @played_list = get_playlist($cfgs{playedlist});
                    165:
                    166:                my %played;
                    167:                @played{@played_list} = ();
                    168:
                    169:
                    170:                delete $Full_Playlist{list};
                    171:
                    172:                foreach my $song (@list) {
                    173:                        $Full_Playlist{list}{$song} = 1
                    174:                                unless (exists $played{$song});
                    175:                }
                    176:
                    177:                $Full_Playlist{last_mod} = $last_mod;
                    178:        }
                    179:
                    180:        return keys %{  $Full_Playlist{list} };
                    181: }
                    182: #######################################################################
                    183:
                    184: #######################################################################
                    185: # read in the Playlist
                    186: sub get_playlist {
                    187:        my $FILE = shift;
                    188:        my @lines;
                    189: #      open PLAYlistLOG, ">c:/ps/playlistlog.txt";
                    190:
                    191: #   print PLAYlistLOG "Getting Playlist from file: $FILE\n";
                    192:  #  close PLAYlistLOG;
                    193:        if (-e $FILE) {
                    194:                open (FILE, $FILE) || bail ("Couldn't open $FILE: $!");
                    195:                chomp (@lines = <FILE>);
                    196:                close (FILE) || bail ("Couldn't close $FILE: $!");
                    197:        } else {
                    198:                open (FILE, ">$FILE") || return @lines;
                    199:                close (FILE) || bail ("Couldn't close $FILE: $!");
                    200:                return @lines;
                    201:        }
                    202:        return @lines;
                    203: }
                    204:
                    205:
                    206:
                    207:
                    208: #######################################################################
                    209: # writes back the new playlist
                    210: sub save_playlist {
                    211:        my $FILE = shift;
                    212:        my @lines = @_;
                    213:        open (FILE, ">$FILE") || bail ("Couldn\'t open playlist to save $FILE: $!");
                    214:        foreach (@lines) {
                    215:                print FILE "$_\n";
                    216:        }
                    217:        close (FILE) || bail ("Couldn't close $FILE: $!");
                    218:        return 1;
                    219: }
                    220:
                    221:
                    222:
                    223:
                    224: #######################################################################
                    225: # Prints a webpage with the currently playing song
                    226: sub DisplayPlaying {
                    227:
                    228:        my $htmldir = shift;
                    229:        my $playing = shift;
                    230:
                    231:        open BLANK, ">$htmldir/current.htm" or bail("Unable to open current.htm: $!");
                    232:        print BLANK "<html>\n<head>\n\t<title>' . $playing . '</title>\n";
                    233:        print BLANK "<meta HTTP-EQUIV=\"REFRESH\" CONTENT=\"5\">\n";
                    234:        print BLANK "<meta HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n";
                    235:        print BLANK "</head>\n";
                    236:        print BLANK '<body leftmargin="0"  topmargin="0" ',
                    237:                           'marginwidth="0" marginheight="0">', "\n\n";
                    238:        print BLANK "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n";
                    239:        print BLANK "  <tr>\n";
                    240:        print BLANK "    <td align=\"left\"><b><i>Currently playing:</i> $playing</b></td>\n";
                    241:        print BLANK "    <td align=\"right\">Started at: " . GetTime() . "</td>\n";
                    242:        print BLANK "  </tr>\n";
                    243:        print BLANK "</table>\n";
                    244:
                    245: #      print BLANK "<center><b>Currently playing: $playing</b><br>\nStarted at: " . GetTime() . "</center>";
                    246:
                    247:        print BLANK "</body>\n</head>\n</html>\n";
                    248:        close BLANK || bail("Unable to close BLANK: $!");
                    249: }
                    250:
                    251:
                    252:
                    253: #######################################################################
                    254: # Prints a webpage with the previously played song
                    255: # AddLast($filename, $cfgs{playedlist}, $cfgs{numhistory}, $cfgs{htmldir}, $cfgs{addurl});
                    256: sub AddLast {
                    257:        my $lastsong = shift;
                    258:        my $lastlist = shift;
                    259:        my $history = shift;
                    260:        my $htmldir = shift;
                    261:        my $addurl = shift;
                    262:
                    263:        my @LIST = get_playlist($lastlist);
                    264:        unshift @LIST, $lastsong;
                    265:        splice (@LIST, $history);
                    266:        save_playlist($lastlist,@LIST);
                    267:        DisplayPrevious($htmldir, $addurl, @LIST);
                    268: }
                    269:
                    270:
                    271:
                    272:
                    273: #######################################################################
                    274: # Prints a webpage with the previously played song
                    275: sub DisplayPrevious {
                    276:
                    277:        my $htmldir = shift;
                    278:        my $addurl = shift;
                    279:        my $lastplay = shift;
                    280:        my @played = @_;
                    281:        open BLANK, ">$htmldir/played.htm" or bail("Unable to open $htmldir/played.htm: $!");
                    282:        print BLANK "<html>\n<head>\n\t<title>' . $lastplay . '</title>\n";
                    283:        print BLANK "<meta HTTP-EQUIV=\"REFRESH\" CONTENT=\"30\">\n";
                    284:        print BLANK "<meta HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n";
                    285:        print BLANK "<body>\n\n";
                    286:
                    287:        print BLANK "<p>[ <a href=\"bin/ShowFiles.pl\">Beginning</a> | \n";
                    288:        print BLANK "<a href=\"bin/ShowAll.pl\">All MP3's</a> |\n";
                    289:        print BLANK "<a href=\"bin/ShowPlaylist.pl\">Playlist</a> |\n";
                    290:        print BLANK "<a href=\"ShowPlaylist.pl?newlist.lst\">New Files</a> |\n";
                    291:        print BLANK "<a href=\"played.htm\">Previously played</a> ]<p>\n";
                    292:
                    293:
                    294:
                    295:
                    296:
                    297:        print BLANK "<center><b>Last played: <a href=\"$addurl\?" . EncodeURL("$lastplay") . "\" target=\"bottom\">$lastplay</a></b><br>\nStarted at: " . GetTime() . "</center><p>\n";
                    298:
                    299:        print BLANK "before that:<br>\n";
                    300:
                    301:        print BLANK "<UL>\n";
                    302:
                    303:        foreach my $song (@played) {
                    304:                print BLANK "\t<li>Song: <a href=\"$addurl\?" . EncodeURL("$song") . "\" target=\"bottom\">$song</a></li>\n";
                    305:        }
                    306:
                    307:        print BLANK "</UL>\n";
                    308:
                    309:
                    310:        print BLANK "</body>\n</head>\n</html>\n";
                    311:        close BLANK || bail("Unable to close played.htm: $!");
                    312: }
                    313:
                    314:
                    315:
                    316:
                    317: ########################################################################
                    318: # *** EncodeURL: %encodes the parameters of the URL
                    319: sub EncodeURL {
                    320:        my $strURL = shift;
                    321:        $strURL =~ s/(\W)/sprintf("%%%x", ord($1))/eg;
                    322:        return $strURL;
                    323: }
                    324:
                    325:
                    326:
                    327: ########################################################################
                    328: # read in config file.
                    329: sub readconfig {
                    330:        my $CONFIG = shift;
                    331:        my $delimter = shift || '=';
                    332:        my %configs;
                    333:                if (-e $CONFIG) {
                    334:                open (CONFIG, $CONFIG) or bail ("Couldn\'t open $CONFIG: $!");
                    335:                while (<CONFIG>) {
                    336:                        chomp;  # no newline
                    337:                        s/#.*//;        # no comments
                    338:                        s/^\s+//;       # no leading  white space
                    339:                        s/\s+$//;       # no trailing white space
                    340:                        next unless length;     # anything left?
                    341:                        my ($var, $value) = split(/\s*$delimter\s*/, $_, 2);
                    342: #                      $var   =~ tr/A-Za-z0-9_\.\,\/\\ / /cd;  # delete all the non alphanumerics
                    343: #                      $value =~ tr/A-Za-z0-9_\/\.\,\\ / /cd;  # delete all the non alphanumerics
                    344:                        $var   =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
                    345:                        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
                    346:                        $configs{$var}=$value;
                    347:                }
                    348:                close CONFIG or bail ("Couldn't close $CONFIG: $!");
                    349:        } else { print '<!-- No config file: ' . $CONFIG; print ' -->'; print "\n"; }
                    350:        return %configs;
                    351: }
                    352: ########################################################################
                    353:
                    354:
                    355: #sub ForkMP3Player { # This forks the MP3 player.
                    356: ##     KillPlaying(0);
                    357: #
                    358: #      my $player = shift;
                    359: #      my $song = shift;
                    360: #
                    361: #      $player =! s/%%f%%/\"$song\"/ig;
                    362: #
                    363: #
                    364: #      FORK: {
                    365: #              if ($Mp3Playerpid = fork) {
                    366: #                      # parent here
                    367: ##                     print "\nMp3Playerpid: ", $Mp3Playerpid;
                    368: #                      # child process pid is available in $pid
                    369: #                      print "Parent PID: $Mp3Playerpid\n";
                    370: #              } elsif (defined $Mp3Playerpid) { # $pid is zero here if defined
                    371: #                      # child here
                    372: #                      print "\nPlaying $song\n";
                    373: ##                     exec("$configs{mp3play} -b 16384 --reopen --aggressive -m \"$song\"");
                    374: #                      print "\n";
                    375: ##                     exec("$player \"$song\"");
                    376: #                      exec("$player");
                    377: #                      exit(0);
                    378: #                      # parent process pid is available with getppid
                    379: #              } elsif ($! =~ /No more process/) {
                    380: #                      # EAGAIN, supposedly recoverable fork error
                    381: #                      sleep 5;
                    382: #                      redo FORK;
                    383: #              } else {
                    384: #                      # weird fork error
                    385: #                      bail("\nCan't fork: $!");
                    386: #              }
                    387: #      }
                    388: #}
                    389:
                    390:
                    391:
                    392:
                    393: #######################################################################
                    394: # Bail: this subrouting dies and displays the error to the browser.
                    395: # gotten from the example in the O'Reilly
                    396: # _Learning_Perl_on_Win32_Systems_
                    397: sub bail {
                    398:        open ERR, '>>$err_log';
                    399: #      open ERR, ">>c:/ps/error.txt";
                    400:
                    401:        my $error = "@_";
                    402:        print "Unexpected Error: $error\n";
                    403:        print ERR "Unexpected Error: $error\n";
                    404:        close ERR;
                    405: #      exit;
                    406: }
                    407:
                    408: sub Print_PlayLog
                    409: {
                    410:        open PLAYLOG, ">>/tmp/playlog" or bail("Unable to open PLAYLOG");
                    411:        print GetTime(), "\t", @_;
                    412:        print PLAYLOG GetTime(), "\t", @_;
                    413:        close PLAYLOG;
                    414: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>