#!/usr/bin/perl
#
# Build files.bbs of mp3 directory according to TAGs in mp3 files.
# Created by Stas Mishchenkov 2:460/58.0
# Idea and testing by Cheslav Osanadze 2:6078/80.0
#
# It is free software and license is the same as for Perl,
# see http://dev.perl.org/licenses/
#

##### There is nothing to change below this line #####

use strict;
use warnings;

use MP3::Tag;
use MP3::Info;
use Text::Wrap;
use Encode qw 'decode encode';
use POSIX;
use Getopt::Long;
use File::Copy;
use File::Spec::Functions;
use URI::Encode;
use MIME::Base64;

sub get_duration($) {

	my ($f) = @_;
	my ($info, $t);

	$info = get_mp3info($f);
	if ( !defined $info) {
		warn("No mp3info for `$f': $@\n");
		return '';
	}
	$t = $info->{SECS};
	return sprintf( "\[%02d:%02d:%02d\]",
		    int( $t/3600 ),
		    int( ($t % 3600)/60 ),
		    int( $t % 60 ) );	
}

sub get_descr($)
{
	my ($f) = @_;
	my ( $title, $artist, $album, $year, @tags );
	my $st = '';

	my $mp3 = MP3::Tag->new( $f );

	@tags = $mp3->get_tags;
	if (exists $mp3->{ID3v2}) {
		# read some information from the tag
		$title  = $mp3->{ID3v2}->title;
		$artist = $mp3->{ID3v2}->artist;
		$album  = $mp3->{ID3v2}->album;
		$year   = $mp3->{ID3v2}->year;
		$st .= "\""  . encode( 'cp866', $title ) . "\"" if defined $title;
		$st .= ", "   . encode( 'cp866', $artist )       if defined $artist;
		$st .= ", \"" . encode( 'cp866', $album ) . "\"" if defined $album;
		$st .= ", "   . encode( 'cp866', $year  )        if defined $year;
	}elsif (exists $mp3->{ID3v1}) {
		# not tested yet.
		$title  = $mp3->{ID3v1}->title;
		$artist = $mp3->{ID3v1}->artist;
		$st .= " \"" . encode( 'cp866', decode( 'cp1251', $title ) ) . "\"" if defined $title;
		$st .= ", " .  encode( 'cp866', decode( 'cp1251', $artist ) ) if defined $artist;
	}
return $st;
}

sub prety_size($)
{
	my ( $fs ) = @_;
	if ( $fs >= 1048576 ) {
		return sprintf( "%.3f Mb", $fs/1048576 );
	}elsif ($fs >= 1024) {
		return  sprintf( "%.3f kb", $fs/1024 );
	} else {
		return  sprintf( "%d b", $fs );
	}
}


my $leftspaces = 14;
my $width = 79;
my $sortorder = 0;
my $nonew = 0;
#my $line = 0;
my ( $help, $noback, $append, $line, $oneline, $totallist, $html );

GetOptions (
            "help"              => \$help,
            "append"            => \$append,
	    "build-html"        => \$html,
	    "do-not-new"        => \$nonew,
            "inline"            => \$line,
            "one-line"          => \$oneline,
            "left-margin=i"     => \$leftspaces,
            "sort=i"            => \$sortorder,
            "total-files-bbs=s" => \$totallist,
            "no-backup"         => \$noback,
            "width=i"           => \$width
           )
or die("Error in command line arguments\n");

#$sortorder = 0 if defined $append;

$Text::Wrap::columns = $width;

my $mp3dir = shift @ARGV;
if(!defined($mp3dir) || defined($help)){
	$0 =~ /([^\\\/]+)$/;
	print( "\nYou must define dir name with your mp3 files.\n\n".
		"Example: $1 d:\\mp3\n\n".
		"Also You may use foloving options:\n".
		"      -a\n".
		"     --append              - adds new files to the end of list instead\n".
		"                             creating a new one.\n".
#		"                             ATTENTION! Sort order will be forced to unsorted\n".
		"      -b\n".
		"     --build-html          - Create index.html file\n".
		"      -d\n".
		"     --do-not-new          - do not create new.bbs file\n".
		"      -i\n".
		"     --inline              - do not start a new line after the file name.\n".
		"                             Will be turned of if the file name longer\n".
		"                             then the left-margin.\n".
		"     --l number\n".
		"     --left-margin=number  - the number of spaces before description.\n".
		"                             Default is 14.\n".
		"      -n\n".
		"     --no-backup           - do not save old version of files.bbs\n".
		"                             By default it will be saved.\n".
		"      -o\n".
		"     --one-line            - do not wrap descriptions\n".
		"      -s number\n".
		"     --sort=number         - 0 sort unsorted (default)\n".
		"                             1 sort by filename\n".
		"                            -1 sort by filename revers order\n".
		"                             2 sort by duration\n".
		"                            -2 sort by duration revers order\n".
		"                             3 sort by file creation date\n".
		"                            -3 sort by file creation date revers order\n".
		"                             4 sort by file size\n".
		"                            -4 sort by file size revers order\n".
		"      -t filename\n".
		"     --total-files-bbs=filename - filename of total file list. If defined,\n".
		"                                  file list of the area will be appended to it\n".
		"      -w number\n".
		"     --width=number        - screen width.\n".
		"                             Default is 79.\n".
		"      -h\n".
		"     --help                - this text.\n"
             );
	exit;
}

my $filesbbs = catfile( $mp3dir, 'files.bbs' );
my $bbsnew = catfile( $mp3dir, 'new.bbs' );

my ( $string, @ftime, $filename, $fname, $fsize, %finfo, $ftext, $newfiles );

sub win2dos($)
{
	my ($str) = @_;
	my ( %win_cp866, $i, $ch, $c, $ostr );
	
	my @win2cp866 = ( "š", "ƒ", "\'", "£", "\"", "...", "\+", "\+", "\#", "\%", 
		"‹œ", "\<", "Hœ", "Š", "h", "–", "h", "\`", "\'", "\"", "\"",
		"ù", "\-", "\-", "\#", "\(TM\)", "«ì", "\>", "­ì", "ª", "h",
		"æ", "ÿ", "“", "ã", "J", "\$", "\ƒ", "\|", "\$", "ð", "\?", 
		"…", "\"", "\^", "\-", "\(R\)", "I", "ø", "\+", "I", "i", "£",
		"m", "\#", "ú", "ñ", "N", "¥", "\"", "j", "S", "s", "i", "€",
		"", "‚", "ƒ", "„", "…", "†", "‡", "ˆ", "‰", "Š", "‹", "Œ",
		"", "Ž", "", "", "‘", "’", "“", "”", "•", "–", "—", "˜",
		"™", "š", "›", "œ", "", "ž", "Ÿ", " ", "¡", "¢", "£", "¤",
		"¥", "¦", "§", "¨", "©", "ª", "«", "¬", "­", "®", "¯", "à",
		"á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì",
		"í", "î", "ï" );

	$i = 128;
	foreach $ch ( @win2cp866 ) {
		$c = chr( $i );
		$win_cp866{$c} = $ch;
		$i++;
	}

	for( $i = 0; $i < length($str); $i++ ) {
		$c = substr($str,$i,1);
		if( defined $win_cp866{$c}) {
			$ostr .= $win_cp866{$c};
		} else { $ostr .= $c; }
	}
return $ostr;
}

my $j = 0;
my $allsiznew = 0;

sub create_strings($)
{
	my ( $key ) = @_;

#	print STDERR "sortorder=$sortorder, $key\n";
	my $str = '';
	$fname = $key;
	$fname = win2dos($key) if $^O eq 'MSWin32';

	if ( defined( $line ) && defined($oneline) ) {
		$str = "$fname $finfo{$key}{duration} \( " .
			prety_size($finfo{$key}{size}) .
			" $finfo{$key}{creationtime} \) ".
			"$finfo{$key}{description}\n";
	} elsif ( defined( $line ) && length($fname) < $leftspaces ) {
		$str = wrap( sprintf( "% -". $leftspaces ."s", $fname ),
			sprintf( "% ".$leftspaces."s", ' ') ,
			"$finfo{$key}{duration} \( " .
			prety_size($finfo{$key}{size}) .
			" $finfo{$key}{creationtime} \) ".
			"$finfo{$key}{description}\n" );
	} else {
		if ( !defined($oneline) ) {
			$str = $fname . wrap( '', sprintf( "% ".$leftspaces."s", ' ') ,
			"\n$finfo{$key}{duration} \( " .
			prety_size($finfo{$key}{size}) .
			" $finfo{$key}{creationtime} \) ".
			"$finfo{$key}{description}\n" );
		} else {
			$str = "$fname\n" . sprintf( "% ".$leftspaces."s", ' ') .
			"$finfo{$key}{duration} \( " .
			prety_size($finfo{$key}{size}) .
			" $finfo{$key}{creationtime} \) ".
			"$finfo{$key}{description}\n";
		}
	}

	$string .= $str if !defined $append;

	if ( index( $ftext, $fname ) == -1 ) {
		$string .= $str if defined $append;
		$newfiles .= $str;
		$j++;
		$allsiznew += $finfo{$key}{size};
	}
}

my $F;

if ( open( $F, "<", $filesbbs ) ) {
	read( $F, $ftext, ( stat($F) )[7] );
	close($F);
	if ( defined $append ) {
		$string = $ftext;
		$string =~ s/Ä+[\r\n]+//g;
		$string =~ s/[ ]+Area:[ ]+[^\r\n]+[ ]+Files: \d+[ ]+Total Size:[ ]+[\d\.]+[ ]+[^\r\n]+[\r\n]+//g;
	}
} else {
	$ftext = '';
	print STDERR "Can't open $filesbbs for read! ($!).\n";
}

my $i = 0;
my $totalsize = 0;

if ( opendir(my $DH, $mp3dir) ) {
	print "Reading files from $mp3dir ...\n";
	while( readdir($DH) ) {
		if( $_ =~ /\.mp3$/i) {
			print '±';
			$i++;
			$fname = $_;
			$filename = catfile( $mp3dir, $_ );

			$finfo{$fname}{duration} = get_duration( $filename );
			$finfo{$fname}{description} = get_descr( $filename );
			$finfo{$fname}{size} = ( stat( $filename ) )[7];
			$totalsize += $finfo{$fname}{size};

			@ftime = localtime( ( stat( $filename ) )[9] );
			$finfo{$fname}{creationtime} = sprintf( "%04d-%02d-%02d", 1900+$ftime[5], 1+$ftime[4], $ftime[3] );
		} else { 
			print '°';
		}
	}

	close($DH);
	print "\n$i mp3 files found.\n" if $i > 0;

} else { print( STDERR "Can't open $mp3dir. \($!\)\n" ); }

print( "No mp3 files found!") && exit if !%finfo;

my $k;

if( $sortorder == 0 ) {
 print "Building unsorted list.\n";
 foreach $k ( keys %finfo) {
	print '±';
	create_strings($k);
 }
 print "\n";
}elsif ( $sortorder == 1 ) {
 print "Building sorted by file name list.\n";
 foreach $k ( sort keys %finfo) {
#	print STDERR "filename \'$k\'\n";
	print '±';
	create_strings($k);
 }
 print "\n";
}elsif ( $sortorder == -1 ) {
 print "Building sorted by file name revers order list.\n";
 foreach $k ( sort {$b cmp $a} keys %finfo) {
	print '±';
	create_strings($k);
 }
 print "\n";
}elsif ( $sortorder == 2 ) {
 print "Building sorted by duration list.\n";
 foreach $k ( sort { $finfo{$a}{duration} cmp $finfo{$b}{duration} || $a cmp $b } keys %finfo) {
	print '±';
	create_strings($k);
 }
 print "\n";
}elsif ( $sortorder == -2 ) {
 print "Building sorted by duration revers order list.\n";
 foreach $k ( sort { $finfo{$b}{duration} cmp $finfo{$a}{duration} || $a cmp $b } keys %finfo) {
	print '±';
	create_strings($k);
 }
 print "\n";
}elsif ( $sortorder == 3 ) {
 print "Building sorted by creation time list.\n";
 foreach $k ( sort { $finfo{$a}{creationtime} cmp $finfo{$b}{creationtime} || $a cmp $b } keys %finfo) {
	print '±';
	create_strings($k);
 }
 print "\n";
}elsif ( $sortorder == -3 ) {
 print "Building sorted by creation time revers order list.\n";
 foreach $k ( sort { $finfo{$b}{creationtime} cmp $finfo{$a}{creationtime} || $a cmp $b } keys %finfo) {
	print '±';
	create_strings($k);
 }
 print "\n";
}elsif ( $sortorder == 4 ) {
 print "Building sorted by file size list.\n";
 foreach $k ( sort { $finfo{$a}{size} <=> $finfo{$b}{size} || $a cmp $b } keys %finfo) {
	print '±';
	create_strings($k);
 }
 print "\n";
}elsif ( $sortorder == -4 ) {
 print "Building sorted by file size revers order list.\n";
 foreach $k ( sort { $finfo{$b}{size} <=> $finfo{$a}{size} || $a cmp $b } keys %finfo) {
	print '±';
	create_strings($k);
 }
 print "\n";
}

if ( -e $filesbbs && !defined($noback) ) {
	print ("Creating backup of $filesbbs\n");
	copy( $filesbbs, catfile( $mp3dir, 'files_bbs_' . time . '.backup' ) );
	print "Done.\n";
}

sub write_file($$)
{
	my ( $file_name, $buffer ) = @_;
	
	if ( open(my $filehanle, ">", $file_name) ) {
		binmode( $filehanle );
		print $filehanle $buffer;
		close( $filehanle );
	} else { print STDERR "Can't open $file_name ($!).\n";}
}

sub create_html()
{
 my ( $fi, $key );
 $mp3dir =~ /([^\\\/]+)[\\\/]?$/;
 my $htmlstring = "<!doctype html>\n<html>\n<head>\n\t<link rel=\"shortcut icon\" ".
		"href=\"favicon.ico\" type=\"image/x-icon\">\n".
		"\t<meta charset=\'CP866\'>\n".
		"\t<meta HTTP-EQUIV=\'Content-Type\' CONTENT=\'text/html\;".
		" charset=cp866\'/>\n\t<meta HTTP-EQUIV=\'Content-Language\' ".
		" content=\'ru\'/>\n<title>Area: \"$1\"" .
		"</title>\n</head>\n<body bgcolor=\"white\">\n" .
		"<h2>Area: $1</h2>\n".
		"<hr><TABLE><TR>\n".
		"<td VALIGN=center>\n".
		"<a href=\"../\"><img src=\"arrow_up.png\"\n".
		"\t onmouseout=\"this.src=\'arrow_up.png\'\"\n".
		"\t onmouseover=\"this.src=\'arrow_up_blue.png\'\"\n".
		"\t></a>\n".
		"</td>\n".
		"<TD VALIGN=center><FONT SIZE=2><B><FONT SIZE=3>Search</FONT></B></FONT></TD>\n".
		"<TD VALIGN=center><FONT SIZE=2><FORM ACTION=\"/\" METHOD=GET><INPUT NAME=\"search\" size=38 maxlength=200 VALUE=\"\">&nbsp;<INPUT TYPE=submit VALUE=\" Search \"></FORM></FONT></TD>\n".
		"</TR></TABLE>\n".
		"<hr>\n".
		"<table>\n".
		"<tr><td></td><td>Filename</td><td>Duration</td><td>Size</td>".
		"<td>Date</td><td>Description</td><tr>\n".
#		"<caption><h1>".
#		"Index of \"$1\" area</h1></caption>".
		"\n";

 my $icofile = catfile( $mp3dir, 'favicon.ico') ;
 unless ( -e $icofile ) {
	write_file( $icofile, decode_base64('AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABMLAAATCwAAAAAAAAAAAAD///////////////////////////////8AAwL/////////////////////////////////////////////////9/v5//////////////////f7+f/3+/n/AAQC///////////////////////3+/n/9/v5//f7+f/3+/n/9/v5//f7+f/////////////////3+/n/9/v5/wAEAv//////////////////////9/v5//////////////////f7+f/3+/n////////////3+/n/9/v5//////8ABAL////////////////////////////////////////////3+/n/AAMC/////////////////wADAv//////AAQC/wADAv8AAwL/////////////////AAIB/wADAv8AAwL/9/v5/wADAv////////////////8AAwL//////wAEAv///////////wADAv//////AAIB//r9/P///////////wADAv8AAwL//////wADAv/3+/n/AAMC//////8ABAL/9/v5//////8AAwL///////3+/v////////////f7+f8AAwL/AAQC//////8AAwL/9/v5/wAEAv//////AAQC//r9/P/6/fz/AAMC///////9/v7/9/v5//f7+f/3+/n/AAMC/wAEAv8AAwL/9/v5/wADAv8ABAL/9/v5/wAEAv///////////wADAv////////////f7+f/3+/n//////wADAv8ABAL/AAMC//f7+f8AAwL/AAQC//f7+f8ABAL///////////8AAwL/////////////////9/v5/wADAv//////AAQC///////3+/n//////wAEAv/3+/n/AAQC//v8/P//////AAMC////////////AAIB/wADAv//////9/v5/wAEAv//////9/v5//////8ABAL//////wAEAv8AAwL/AAMC//r9/P//////////////////////AAMC//r9/P/3+/n/9/v5///////3+/n/9/v5///////3+/n////////////3+/n///////3+/v////////////////8AAwL/9/v5//f7+f//////9/v5//f7+f//////9/v5//f7+f//////9/v5//////8AAgH////////////6/fz/AAMC//f7+f/////////////////3+/n///////f7+f//////9/v5////////////AAIB//r9/P/6/fz/+v38/wADAv////////////////////////////////////////////////////////////////8AAgH/AAMC/wADAv//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==') );
 }
 my ( $arrowfile, $arrowbluefile, $soundsico ) = 
    ( catfile( $mp3dir, 'arrow_up.png'), catfile( $mp3dir, 'arrow_up_blue.png'),
      catfile( $mp3dir, 'sounds.png') );
print "$soundsico\n";
 unless ( -e $arrowfile ) {
	write_file( $arrowfile, decode_base64( 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAA0UlEQVRIx83WUQ3DIBCA4UqYhJOw5DeEBCTUCRKQMAlIQUL3QpNLyta7wpqR3Etz8JUWOJblXxogQAQyUICtRWnPIiCjQFIDn0Vyg0AAqgPZowLBg2yDEWYg1Tjb8O2fVAPybGHJlR6ULIjKt2CpNxsz4sREd4hexIFFnZyvIEYs68RyFTFgRSf13uTl2enAo/U5jHUG9ZOPgL3vh083CyqWxTADytblPQpFz4YdgcR7BK2dVba6jiDHoeqtTfLLWjS1Jo0ht5byWy8nt163Zrc3Q6Je/KP/9tIAAAAASUVORK5CYII=' ) );
 }
 unless ( -e $arrowbluefile ) {
	write_file( $arrowbluefile, decode_base64( 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAACXBIWXMAAAsTAAALEwEAmpwYAAAF0WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTAxLTE1VDE0OjEyOjQ0KzAzOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0wMS0xNVQxNToyMDozMyswMzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMy0wMS0xNVQxNToyMDozMyswMzowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzUyZjU5OGYtYzQ4NS02ZjQwLWEyZDMtYmY5YjQwMTkyYjkzIiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6MWY3YzIwM2EtODVmZi1hMjQwLTlkM2MtYjc1NDA1NGIwY2RhIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ODVkZjdhZTAtZDRkZC05ZDQ3LWE2MDctNzg3NTcxYzM2NDFlIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4NWRmN2FlMC1kNGRkLTlkNDctYTYwNy03ODc1NzFjMzY0MWUiIHN0RXZ0OndoZW49IjIwMjMtMDEtMTVUMTQ6MTI6NDQrMDM6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NzUyZjU5OGYtYzQ4NS02ZjQwLWEyZDMtYmY5YjQwMTkyYjkzIiBzdEV2dDp3aGVuPSIyMDIzLTAxLTE1VDE1OjIwOjMzKzAzOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+weDIDwAAAP9JREFUSMfF1s0NwiAUB/COwg5EvLqHFxYwshEjECdgBK7ePXpoowMgL2JCDR/vtRWb/JumDfxKS3kdvPdDj7x3lY1zzkJUiAlxIT7GxXNwjdX6qEIR0EnHregSWIRCAxkyEpBPoI1EQRHxKyOrEBIZkaOVWSi+k2oH+wOfTndxhcAx4oZYDtIYRD2FhyAxPYPiaNAIEWMppKgIAVMpZJYgSMykkMu9TAySYoXJ5FIodyf2PIkbFlIPASOyub5a0CwlANO29ei2glxzMmwEGdT03gBS6A92JcRIS9DxsrPfswzOkZYg7KK6oDaxNWWCXJP+V/i6lvKuPyc/+93qkRcPHWKhXfubEgAAAABJRU5ErkJggg==' ) );
 }
 unless ( -e $soundsico ) {
	write_file( $soundsico, decode_base64('iVBORw0KGgoAAAANSUhEUgAAACsAAAArCAYAAADhXXHAAAABJmlDQ1BBZG9iZSBSR0IgKDE5
OTgpAAAoz2NgYDJwdHFyZRJgYMjNKykKcndSiIiMUmA/z8DGwMwABonJxQWOAQE+IHZefl4q
Awb4do2BEURf1gWZxUAa4EouKCoB0n+A2CgltTiZgYHRAMjOLi8pAIozzgGyRZKywewNIHZR
SJAzkH0EyOZLh7CvgNhJEPYTELsI6Akg+wtIfTqYzcQBNgfClgGxS1IrQPYyOOcXVBZlpmeU
KBhaWloqOKbkJ6UqBFcWl6TmFit45iXnFxXkFyWWpKYA1ULcBwaCEIWgENMAarTQZKAyAMUD
hPU5EBy+jGJnEGIIkFxaVAZlMjIZE+YjzJgjwcDgv5SBgeUPQsykl4FhgQ4DA/9UhJiaIQOD
gD4Dw745AMDGT/0ZOjZcAAAACXBIWXMAAAexAAAHsQEGxWGGAAAF0WlUWHRYTUw6Y29tLmFk
b2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6
TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0
az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQw
OjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5
OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0i
IiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJo
dHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRw
Oi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25z
LmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5j
b20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9i
ZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTAx
LTE1VDE5OjA1OjE4KzAzOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0wMS0xNVQyMDoyODox
MCswMzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMy0wMS0xNVQyMDoyODoxMCswMzowMCIg
ZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOklu
c3RhbmNlSUQ9InhtcC5paWQ6ZmE4OTM4NmEtZGU1Zi02NjQxLTg5ZjgtYTYyZTFjYmRmOWQ1
IiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6NzBiMWFkYjctMWZi
YS0zMDQ4LTliYzYtZjdjNDJlYjA0ZTJlIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9Inht
cC5kaWQ6NWYyZjUzY2EtNDI3Yy02ZDRkLWJlZTAtNWJkNWZmMzM1ZmI1Ij4gPHhtcE1NOkhp
c3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6
aW5zdGFuY2VJRD0ieG1wLmlpZDo1ZjJmNTNjYS00MjdjLTZkNGQtYmVlMC01YmQ1ZmYzMzVm
YjUiIHN0RXZ0OndoZW49IjIwMjMtMDEtMTVUMTk6MDU6MTgrMDM6MDAiIHN0RXZ0OnNvZnR3
YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIvPiA8cmRmOmxp
IHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ZmE4OTM4
NmEtZGU1Zi02NjQxLTg5ZjgtYTYyZTFjYmRmOWQ1IiBzdEV2dDp3aGVuPSIyMDIzLTAxLTE1
VDIwOjI4OjEwKzAzOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3Ag
Q0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3ht
cE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRh
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
o/AAAAAASUVORK5CYII=') );
 }


 print "Building html file...\n";
 foreach $key ( sort keys %finfo) {
	print '±';
	$fname = $key;
	$fname = win2dos($fname) if $^O eq 'MSWin32';
	my $uri = URI::Encode->new( { encode_reserved => 1 } );
#	$fname = $uri->encode($fname);
	$htmlstring .= "\<tr style=\"\" ".
                       "onmouseover=\"this.style.background=\'#e0e0f0\';\" ".
                       "onmouseout=\"this.style.background=\'\'\" \>".
			"<td><img width=\"25\" src=\"sounds.png\"></td>\n".
                       "\<td\>\<a href=\"".$uri->encode(decode('cp866',$fname)).
			"\"\>$fname\<\/a\>\<\/td\>".
			"\<td\>$finfo{$key}{duration}\<\/td\>" .
			"\<td align=\"right\"\>" . prety_size($finfo{$key}{size}) .
			"\<\/td\>\<td\>$finfo{$key}{creationtime}\<\/td\>" .
			"\<td\>$finfo{$key}{description}\<\/td\>\<\/tr\>\n" if $html == 1;
 }
 $htmlstring .= '</table><hr><center>'.
		"<a href=\"../\"><img src=\"arrow_up.png\"\n".
		"\t onmouseout=\"this.src=\'arrow_up.png\'\"\n".
		"\t onmouseover=\"this.src=\'arrow_up_blue.png\'\"\n".
		"\t></a>\n".
		'</center><hr>'.
		'<font size=-2><center>Created by '.
		'<a href="https://brorabbit.g0x.ru/files/perl/mp3bbs.pl">'.
		'mp3bbs.pl from Stas Mishchenkov 2:460/58</a></center></font>'.
		'</body></html>';
# print"\n";
 print "\nwriting index.html\n";
 my $tnphtml = catfile( $mp3dir , 'index.html'. time() );

 if ( open( $F, '>', $tnphtml ) ) {
 	print $F $htmlstring;
 	close($F);
	print "Done\n";
 } else {
 	print STDERR "Can't open $tnphtml for write! ($!).";
 }
 move( $tnphtml, catfile( $mp3dir , 'index.html' ) );
}

 $mp3dir =~ /([^\\\/]+)[\\\/]?$/;

if ( open( $F, ">", $filesbbs ) ) {
	print( $F "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n" .
		"    Area: " . uc($1) . "   Files: $i   Total Size: " .
		prety_size($totalsize) . 
		"\nÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n" . 
		$string );
	close($F);
	print "File \'$filesbbs\' created.\n";
} else {
	print STDERR "Can't open $filesbbs for write! ($!).";
}

if ( defined($newfiles) && $nonew == 0 ) {
	if ( open( $F, ">", $bbsnew ) ) {
		print( $F "ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n" .
		"    Area: " . uc($1) . "   New Files: $j   Total Size: " .
		prety_size( $allsiznew ) . 
		"\nÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n" . 
		$newfiles );
		close($F);
		print "File \'$bbsnew\' created.\n";
	} else {
		print STDERR "Can't open $bbsnew for write! ($!).";
	}

}

if ( defined( $totallist ) ) {
	print ("Creating backup of $totallist\n") && copy( $totallist, $totallist . time . '.backup') && print ("Done.\n") if -e $totallist && !defined($noback);
	print ("Reading $totallist\n");
	if ( open( $F, "<", $totallist ) ) {
		read( $F, $ftext, ( stat($F) )[7] );
#		$string = $ftext if defined $append;
		close($F);
		print ("Done.\n");
	} else {
		$ftext = '';
		print STDERR "Can't open $totallist for read! ($!).\n";
	}

	if ( open( $F, ">", $totallist ) ) {
		print( $F "$ftext\nÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n" .
			"    Area: " . uc($1) . "   Files: $i   Total Size: " .
			prety_size($totalsize) . 
			"\nÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ\n" . 
			$string );
		close($F);
		print "File \'$totallist\' created.\n";
	} else {
		print STDERR "Can't open $totallist for write! ($!).";
	}
}

create_html() if $html == 1;

exit;

