[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     ! 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>