v20191223
authorkilian (ksmachome) <ksaffran@dks.lu>
Tue, 24 Dec 2019 07:00:38 +0000 (08:00 +0100)
committerkilian (ksmachome) <ksaffran@dks.lu>
Tue, 24 Dec 2019 07:00:38 +0000 (08:00 +0100)
23 files changed:
CGI/api/app.cgi [changed mode: 0644->0755]
CGI/api/audio.cgi [changed mode: 0644->0755]
CGI/api/createpdf.cgi [changed mode: 0644->0755]
CGI/api/db.cgi [changed mode: 0644->0755]
CGI/api/download.cgi [changed mode: 0644->0755]
CGI/api/lib/playlistcreator.pm [new file with mode: 0644]
CGI/api/parsestatement.cgi [changed mode: 0644->0755]
CGI/api/playlist.cgi [changed mode: 0644->0755]
CGI/api/playlistcreator.cgi [new file with mode: 0755]
CGI/api/upload.cgi [changed mode: 0644->0755]
CGI/index.cgi [changed mode: 0644->0755]
CGI/tmpl/app/coloradio/module/audio/index.tt
bin/clr_generateplaylist.pl [moved from bin/playlist_creator/clr_generateplaylist.pl with 52% similarity, mode: 0755]
bin/newplc.pl [new file with mode: 0755]
bin/ranglescht.pl [new file with mode: 0644]
bin/wkhtmltopdf/testdoc.pdf
bin/wkhtmltopdf/testdoc/content.html
bin/wkhtmltopdf/testdoc/dks_500.png [new file with mode: 0644]
bin/wkhtmltopdf/testdoc/footer.html
bin/wkhtmltopdf/testdoc/header.html
bin/wkhtmltopdf/testdoc/pdfconfig.conf
dev/setvendor.pl [deleted file]
dksnas.pl

old mode 100644 (file)
new mode 100755 (executable)
index 8dfde54..2326284
@@ -1,9 +1,11 @@
 #!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl
 use strict;
-use FindBin qw($Bin);
+use FindBin qw($Bin $RealBin);
 # use lib ('CGI/api/lib/perl5');
 # use lib ('CGI/api/lib');
 use lib ($Bin.'/CGI/api/lib/perl5');
 use lib ($Bin.'/CGI/api/lib');
+use lib ($RealBin.'/api/lib/perl5');
+use lib ($RealBin.'/api/lib');
 use CGI;
 use CGI::Cookie;
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 4ee104e..f22b09e
@@ -1,6 +1,6 @@
-#!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl
+#!/usr/bin/env perl
 use strict;
-use FindBin qw($Bin);
+use FindBin qw($RealBin $Bin);
 
 use CGI;
 use CGI::Cookie;
@@ -13,6 +13,8 @@ use JSON::PP;
 
 use lib ($Bin.'/CGI/api/lib/perl5');
 use lib ($Bin.'/CGI/api/lib');
+use lib ($RealBin.'/lib/perl5');
+use lib ($RealBin.'/lib');
 use audio;
 
 my $cgi = new CGI();
old mode 100644 (file)
new mode 100755 (executable)
index 0336b95..71bb1d9
@@ -1,8 +1,10 @@
 #!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl
 use strict;
-use FindBin qw($Bin);
+use FindBin qw($RealBin $Bin);
 use lib ($Bin.'/CGI/api/lib/perl5');
 use lib ($Bin.'/CGI/api/lib');
+use lib ($RealBin.'/api/lib/perl5');
+use lib ($RealBin.'/api/lib');
 use CGI;
 use CGI::Cookie;
 # use CGI::Carp qw/fatalsToBrowser/;
old mode 100644 (file)
new mode 100755 (executable)
index 17ed817..40afbb8
@@ -1,10 +1,12 @@
 #!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl
 use strict;
-use FindBin qw($Bin);
+use FindBin qw($RealBin $Bin);
 # use lib ('CGI/api/lib/perl5');
 # use lib ('CGI/api/lib');
 use lib ($Bin.'/CGI/api/lib/perl5');
 use lib ($Bin.'/CGI/api/lib');
+use lib ($RealBin.'/lib/perl5');
+use lib ($RealBin.'/lib');
 use CGI;
 use CGI::Cookie;
 # use CGI::Carp qw/fatalsToBrowser/;
old mode 100644 (file)
new mode 100755 (executable)
diff --git a/CGI/api/lib/playlistcreator.pm b/CGI/api/lib/playlistcreator.pm
new file mode 100644 (file)
index 0000000..f5cc38e
--- /dev/null
@@ -0,0 +1,85 @@
+package dksdb;
+
+use strict;
+use FindBin qw($Bin);
+use lib ('./lib/perl5');
+use lib ('./lib');
+use lib ('./');
+use dksdb;
+
+sub new {
+    my $class = shift;
+    my $param = shift;
+    my $self = bless {}, $class;
+    foreach my $p (keys %{$param}){
+       $self->{$p} = $param->{$p};
+    }
+    if ($p->{db} ne ""){
+      $self->{db} = dksdb->new({dsn => "DBI:SQLite:dbname=".$sitecfg->{datapath}.'/'.$p->{db}.'.sqlite'}); 
+    } else {
+      $self->{db} = dksdb->new(); 
+    }
+       
+    return $self;
+}
+
+sub createplaylist(){
+  my $self = shift;
+  my $date = shift;
+  my $limit = shift;
+  my $idschedule = shift;
+  my $timetofill = shift;
+  if ($timetofill == undef){
+    $timetofill = 84600;
+  }
+       my $ctime = 0;
+       my $cpos = 0;
+  my $rdef=$self->getrotation($cschedule);
+  #print Dumper($ref);
+  my $musiclists = $self->getallmusiclists();
+  #print Dumper($musiclists);
+  while ($ctime < $timetofill){
+    foreach my $vfid (sort {$a <=> $b} keys(%{$rdef})){
+      my $data =  shift($musiclists->{$vfid});
+      
+    }
+  }
+  
+}
+
+sub getrotation(){
+  my $self = shift;
+       my $idschedule = shift;
+       my $rotdef = ();
+       my $cnt = 0;
+       # do we have a schedule?
+       my $sql = "select id_vfolder from rotations where id_schedule='".$idschedule."' order by rpos;";
+       my $rot = &dbquerysorted($sql);
+       return $rot;
+}
+
+sub getallmusiclists(){
+  my $self = shift;
+       my $idschedule = shift;
+       my $ldate = shift;
+       my $limit = shift;
+       my $vfolders = "select distinct(id_vfolder) as id_vfolder from rotations;";
+       my $mcats = ();
+       my @mxcats = &dbqueryarray($msql);
+       foreach my $cat (@mxcats){
+               $mcats->{$cat} = &getmusiclist($cat,$ldate,$limit);
+       }
+       return $mcats;
+}
+
+sub getmusiclist(){
+  my $self = shift;
+       my $idvfolder = shift;
+       my $ldate = shift;
+       my $limit = shift;
+       my $msql = "select random() as rand,id,title,artist,filepath,seconds from music where id_vfolder=".$idvfolder." and id not in
+(select id_music from playlists pl join music mu on (pl.id_music=mu.id) where mu.id_vfolder=".$idvfolder." and pl.playdate <= date('".$ldate."') order by pl.id DESC LIMIT ".$limit.") order by rand";
+       my @mxdata = &dbqueryarray($msql);
+       return \@mxdata;
+}
+1;
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
index 3b0d0ae..7ba5728
@@ -5,11 +5,13 @@ use CGI::Carp qw/fatalsToBrowser/;
 use File::Path qw/make_path/;
 use File::Basename;
 use JSON::PP;
-use FindBin qw($Bin);
+use FindBin qw($RealBin $Bin);
 # use lib ('CGI/api/lib/perl5');
 # use lib ('CGI/api/lib');
 use lib ($Bin.'/CGI/api/lib/perl5');
 use lib ($Bin.'/CGI/api/lib');
+use lib ($RealBin.'/api/lib/perl5');
+use lib ($RealBin.'/api/lib');
 use dksconfig qw/$sitecfg/;
 use dksdb;
 
old mode 100644 (file)
new mode 100755 (executable)
diff --git a/CGI/api/playlistcreator.cgi b/CGI/api/playlistcreator.cgi
new file mode 100755 (executable)
index 0000000..5e11be9
--- /dev/null
@@ -0,0 +1,34 @@
+#!/Users/kilian/perl5/perlbrew/perls/perl-5.24.1/bin/perl
+use strict;
+use FindBin qw($Bin);
+
+use CGI;
+use CGI::Cookie;
+use CGI::Carp qw/fatalsToBrowser/;
+use File::Basename;
+use Data::Dumper;
+use File::Basename;
+
+use lib ($Bin.'/CGI/api/lib/perl5');
+use lib ($Bin.'/CGI/api/lib');
+use lib ($Bin.'/lib/perl5');
+use lib ($Bin.'/lib');
+use dksconfig qw/$sitecfg/;
+use dksdb;
+
+my $cgi = new CGI();
+my $scriptpath = $cgi->url(-absolute => 1); 
+my $p = ();
+my @params = $cgi->param();
+foreach my $pe (@params){
+  $p->{$pe} = $cgi->param($pe);
+}
+my $html->{result} = ();
+$html->{params} = $p;
+print $cgi->header(-type=> 'text/html', -charset=>"UTF-8");
+print Dumper($html);
+#print $cgi->header(-type=> 'application/json', -charset=>"UTF-8");
+# my $js = JSON::PP->new();
+# $js->allow_blessed(1);
+# $js->convert_blessed(1);
+# print $js->utf8->encode($html);
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
old mode 100644 (file)
new mode 100755 (executable)
index ff00aa5..6c2828b
@@ -1,13 +1,13 @@
-#!C:\Strawberry\perl\bin\perl.exe
+#!/usr/bin/env perl
 
 use strict;
-use FindBin qw($Bin);
+use FindBin qw($RealBin $Bin);
 # use lib ('CGI/api/lib/perl5');
 # use lib ('CGI/api/lib');
 use lib ($Bin.'/CGI/api/lib/perl5');
 use lib ($Bin.'/CGI/api/lib');
-# use lib ('./api/lib/perl5');
-# use lib ('./api/lib');
+use lib ($RealBin.'/api/lib/perl5');
+use lib ($RealBin.'/api/lib');
 use File::Basename qw/dirname basename/;
 use Template;
 # use Template::Constants qw( :debug );
@@ -62,8 +62,13 @@ if ($vars->{suffix} eq ".js"){
 }
 print $cgi->header(-type=>$ctype, -charset=>"utf-8");
 
-
-my $template = Template->new({INCLUDE_PATH => [$Bin.'/CGI/tmpl']});
+my $tmplincpath = $RealBin.'/CGI/tmpl';
+if (basename($RealBin) eq "CGI" ){
+  $tmplincpath = $RealBin.'/tmpl';
+}
+#print $Bin.'<br/>';
+#print $tmplincpath.'<br/>';
+my $template = Template->new({INCLUDE_PATH => [$tmplincpath]});
 
 my @lv = split(/\//,$vars->{filepath});
 my $absnum = scalar(@lv)-1;
index 829c478..686bdea 100644 (file)
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
-    
-    <link rel="stylesheet" href="vendors/tabulator/css/tabulator_site.min.css">
-    <link rel="stylesheet" href="css/w3pro.css">
-  </head>
-  <body>
-      <div class="w3-display-container" >
-          <div class="w3-sidebar w3-bar-block w3-grey" style="width:300px;" id="mySidebar">
-              
-              <div id="tbl_cat" class="w3-border">
-
-              </div>
-              
+[% PROCESS macro/fields.tt %]
+<div class="w3-top">
+    <div class="w3-bar w3-grey">
+        <a href="index.html" class="w3-bar-item w3-button">Audio-List</a>
+        <div id="tlb_audiolist">
+            <div class="w3-dropdown-hover">
+                <button class="w3-button">Import</button>
+                <div class="w3-dropdown-content w3-bar-block w3-card-4">
+                    <a href="#" class="w3-bar-item w3-button">From Folder</a>
+                    <a href="#" class="w3-bar-item w3-button">Files</a>
+                    <a href="#" class="w3-bar-item w3-button">Get WebInfo</a>
+                </div>
             </div>
-          <div class="w3-bar w3-top w3-grey">
-              <a href="index.html" class="w3-bar-item w3-button w3-border">Home</a>
-              <select class="w3-bar-item w3-select" id="sel_category" onchange="changecategory();">
-                  
-              </select>
-              <button class="w3-bar-item w3-button w3-boder" onclick="addfolder();">Add Folder</button>
-              <button class="w3-bar-item w3-button w3-boder" onclick="addfiles();">Add Files</button>
-              <button class="w3-bar-item w3-button w3-boder" onclick="getwebinfo();">Get Webinfo</button>
-              <button class="w3-bar-item w3-button w3-boder" onclick="convertaudio();">Convert Audio</button>
-              <button class="w3-bar-item w3-button w3-boder" onclick="AddToVFolder();">Add To Virtual Folder</button>
+            
+            <div class="w3-dropdown-hover">
+                <button class="w3-button">Gruppieren Nach</button>
+                <div class="w3-dropdown-content w3-bar-block w3-card-4">
+                    <a href="#" class="w3-bar-item w3-button">Gruppierung aufheben</a>
+                    <a href="#" class="w3-bar-item w3-button">Ordner</a>
+                    <a href="#" class="w3-bar-item w3-button">Artist</a>
+                    <a href="#" class="w3-bar-item w3-button">Category</a>
+                    <a href="#" class="w3-bar-item w3-button">Stimmung</a>
+                    <a href="#" class="w3-bar-item w3-button">Tempo</a>
+                    <a href="#" class="w3-bar-item w3-button">Genre</a>
+                    <a href="#" class="w3-bar-item w3-button">Jahr</a>
+                    <a href="#" class="w3-bar-item w3-button">Jahrzehnt</a>
+                </div>
+            </div>
+            <a href="javascript:edit();" class="w3-bar-item w3-right w3-button">Bearbeiten</a>
+            <a href="javascript:remove();" class="w3-bar-item w3-right w3-button">Löschen</a>
+        </div>
+        <div id="tlb_audiodata" style="display: none;">
+            <button class="w3-bar-item w3-right w3-button" onclick="saveform('audio');">speichern</button>
+            <button class="w3-bar-item w3-right w3-button" onclick="replaceaudio();">ersetzen</button>
+            <button class="w3-bar-item w3-right w3-button" onclick="renamefile();">umbennen</button>
+            <button class="w3-bar-item w3-right w3-button" onclick="movefile();">verschieben</button>
+        </div>
+        <!--<button class="w3-bar-item w3-button w3-boder" onclick="convertaudio();">Convert Audio</button>
+        <button class="w3-bar-item w3-button w3-boder" onclick="AddToVFolder();">Add To Virtual Folder</button>-->
+
+    </div>
+</div>
+<div class="w3-display-container" id="pnl_audiolist">
+
 
-          </div>
+    <div class="w3-container" style="margin-top: 40px;">
+        <div id="tbl_audio"></div>
+    </div>
+</div>
+<div class="w3-display-container" id="pnl_audiodata" style="display: hidden;">
+    <!-- <div class="w3-top">
+        <div class="w3-bar w3-grey">
+            <a href="index.html" class="w3-bar-item w3-button">Audio-List</a>
           
-          <div class="w3-container" style="margin-left: 300px; margin-top: 40px;">
-            <div class="w3-row">
-                <div class="w3-light-grey" style="height: 50vh; overflow-y: scroll;">
-                    <div id="tbl_audio"></div>
-                </div>
-                <div class="w3-row" id="audiodata" style="height: 45vh; overflow-y: scroll;">
-                    <div id="frm_audio">
-                    <div class="w3-container">
-                        <label class="w3-label">Original File</label>
-                        <input type="text" class="w3-input" value="" id="music_filename" name="music_filename" />
-                        
-                      </div>
-                      <div class="w3-container">
-                          <label class="w3-label">Converted File</label>
-                          <input type="text" class="w3-input" value="" id="music_convertedfile" name="music_convertedfile" />
-                          
-                        </div>
-                    <div class="w3-container">
-                        <label class="w3-label">Title</label>
-                      <input type="text" class="w3-input" value="" id="music_title" name="music_title" />
-                      
-                    </div>
-                    <div class="w3-container">
-                        <label class="w3-label">Artist</label>
-                      <input type="text" class="w3-input" value="" id="music_artist" name="music_artist" />
-                      
-                    </div>
-                    <div class="w3-cell-row">
-                          
-                          
-                          <div class="w3-container w3-cell">
-                              <label class="w3-label">Duration</label>
-                              <input type="text" class="w3-input" value="" id="music_duration" name="music_duration" />
-                              
-                          </div>
-                          <div class="w3-container w3-cell">
-                              <label class="w3-label">Bitrate</label>
-                              <input type="text" class="w3-input" value="" id="music_bitrate" name="music_bitrate" />
-                              
-                          </div>
-                          <div class="w3-container w3-cell">
-                              <label class="w3-label">Samplerate</label>
-                              <input type="text" class="w3-input" value="" id="music_samplerate" name="music_samplerate" />
-                              
-                          </div>
-                          
+        </div>
+    </div> -->
+    <div class="w3-container" style="margin-top: 40px">
+        <div class="w3-row" id="audiodata">
+            <form id="frm_audio">
+                [% fieldhidden('id','music','ident','') %]
+                <div class="w3-row">
+                    <div class="w3-col w3-container m8">
+                        [% fieldeditbox('title','music','Title','','','','') %][% fieldeditbox('artist','music','Artist','','','','') %] [% fieldtagbox('vfolder','music','categories','','','') %][% fieldtagbox('genre','music','Genre','','','') %] [% fieldtagbox('tempo','music','Tempo','','','')
+                        %] [% fieldtagbox('mood','music','Stimmung','','','') %] [% fieldnumberbox('myear','music','Jahr','w3-third','','') %][% fieldtagbox('language','music','Sprache(n)','w3-twothird','','') %] [% fieldtextarea('comment','music','Kommentar','','','50px','')
+                        %]
                     </div>
-                    <div class="w3-cell-row">
-                        <div class="w3-container w3-cell">
-                            <label class="w3-label">Type</label>
-                            <input type="text" class="w3-input" value="" id="music_filetype" name="music_filetype" />
-                            
-                        </div>
-                        
-                        <div class="w3-container w3-cell">
-                            <label class="w3-label">Date</label>
-                            <input type="text" class="w3-input" value="" id="music_mdate" name="music_mdate" />
-                            
-                        </div>
-                        <div class="w3-container w3-cell">
-                            <label class="w3-label">Size</label>
-                            <input type="text" class="w3-input" value="" id="music_samplerate" name="music_filesize" />
-                            
-                        </div>
+                    <div class="w3-col w3-container m4">
+                        [% fieldeditbox('folder','music','Ordner','','readonly','','') %] [% fieldeditbox('filename','music','Datei-Name','','readonly','') %]
+                        <div class="w3-cell-row">
+                            [% fieldtimebox('duration','music','Dauer','w3-half','readonly','') %] [% fieldeditbox('filetype','music','Audio-Format','w3-half','readonly','') %]
+                        </div> [% fieldnumberbox('bitrate','music','Bitrate','w3-half','readonly','') %] [% fieldnumberbox('samplerate','music','Samplerate','w3-half','readonly','') %] [% fieldnumberbox('filesize','music','Größe','w3-half','readonly','')
+                        %] [% fielddatebox('modified','music','Datum','w3-half','readonly','') %]
                     </div>
-                    <div class="w3-cell-row">
-                        <div class="w3-container w3-cell">
-                            <label class="w3-label">Category</label>
-                            <input type="text" class="w3-input" value="" id="music_category" name="music_category" />
-                            
-                        </div>
-                        <div class="w3-container w3-cell">
-                            <label class="w3-label">Year</label>
-                            <input type="text" class="w3-input" value="" id="music_year" name="music_year" />
-                            
-                        </div>
-                        <div class="w3-container w3-cell">
-                            <label class="w3-label">Language</label>
-                            <input type="text" class="w3-input" value="" id="music_language" name="music_language" />
-                            
-                        </div>
-                    </div>
-                    <div class="w3-container">
-                        <label class="w3-label">Moods</label>
-                        <input type="text" class="w3-input multiinput" value="" id="mood_moodname" name="mood_moodname" />
-                        
-                      </div>
-                      <div class="w3-container">
-                          <label class="w3-label">Tempo</label>
-                          <input type="text" class="w3-input multiinput" value="" id="tempo_temponame" name="tempo_temponame" />
-                          
-                        </div>
-                        <div class="w3-container">
-                            <label class="w3-label">Genre</label>
-                          <input type="text" class="w3-input multiinput" value="" id="genre_genrename" name="genre_genrename" />
-                          
-                        </div>
-                        <div class="w3-container">
-                            <label class="w3-label">Comment</label>
-                            <textarea class="w3-input" id="music_comment" name="music_comment" /></textarea>
-                            
-                          </div>
                 </div>
-              </div>
-            </div>  
-            
-          </div>
-          
-      </div>
-  </body>
-<script src="vendors/tabulator/js/tabulator.min.js"></script>
-<script src="js/app.js"></script>
-<!-- <script src="vendors/choices/choices.min.js"></script> -->
-<script src="js/request.js"></script>
-<!-- <script src="renderer.js"></script> -->
-<script src="js/category_sql.js"></script>
-<script src="js/audio.js"></script>
-</body>
-</html>
\ No newline at end of file
+            </form>
+        </div>
+    </div>
+</div>
\ No newline at end of file
old mode 100644 (file)
new mode 100755 (executable)
similarity index 52%
rename from bin/playlist_creator/clr_generateplaylist.pl
rename to bin/clr_generateplaylist.pl
index e677ca2..1038a28
@@ -16,60 +16,57 @@ use Encode;
 my $dbfile = "/Users/kilian/Workspace/dksnas/data/coloradio/aral.sqlite";
 my $datefrom = "2020-01-01";
 my $dateto = "2020-12-31";
-my $cschedule="Default";
-my $musiclistlimit=100;
+my $cschedule="2";
+my $limit = 100;
 my $udf = &getunixdatetime($datefrom." 00:00:00");
 my $udt = &getunixdatetime($dateto." 00:00:00");
 my $cdt = $udf;
-my $musiclists= {};
+#my $musiclists= {};
 my $dbh = DBI->connect('DBI:SQLite:dbname='.$dbfile,"","",{PrintError=>1,AutoCommit=>1})  or die "Connection Error!".$!."\n";
 &writelog("Generate ".basename($dbfile)." Playlist from ".$datefrom." to  ".$dateto);
-&dbexec("DELETE from playlist where plistname >='".substr(&getdatetime($cdt),0,10)."' and plistname <= '".substr(&getdatetime($udt),0,10)."' and streamname = '".$cschedule."';");
-while ($cdt <= $udt){
-       my $shortdate = substr(&getdatetime($cdt),0,10);
-       &writelog("Create Playlist for DATE ".$shortdate);
-       my $rotationdef = &getdayrotationdef($shortdate,$cschedule);
-       my $mids = ();
-       foreach my $e (sort {$a <=> $b} keys(%{$rotationdef})){
-                       my $crot = $rotationdef->{$e};
-                       my @cats = @{$crot->{categories}};
-                       #print localtime.": Start at ".$crot->{timefrom}."\n";
-                       #get first cat
-                       my $timetofill = &getunixdatetime($shortdate." ".$crot->{timeend}.':00')-&getunixdatetime($shortdate." ".$crot->{timebegin}.':00');
-                       if ($crot->{timeend} <= $crot->{timefrom}){
-                               $timetofill += 86400;
-                       }
-                       my $ctime = 0;
-                       my $cpos = 0;
-                       my @audiolist = ();
-                       while ($ctime < $timetofill){
-                               for (my $c=0;$c<scalar(@cats);$c++){
-                               #print $c."->".$cats[$c]."\n";
-                                       if (!exists($musiclists->{$cats[$c]}) || scalar(@{$musiclists->{$cats[$c]}}) == 0){
-                                               if (scalar(@audiolist) > 0){
-                                                       &dbexec("INSERT INTO playlist (plistname,plposition,streamname,idmusic) VALUES ".join(",",@audiolist));
-                                                       @audiolist=();
-                                               }
-                                               #print "get next music category data ".$cats[$c]."\n";
-                                               &getmusiclist($cats[$c],$shortdate,$musiclistlimit);
-                                       }
-                                       my $data = shift(@{$musiclists->{$cats[$c]}});
-                                       #my $checksql = "select idmusic from playlist where idmusic='".$data->{idmusic}."' and plistname='".$shortdate."' and streamname='".$schedulename."';";
-                                       #my $rxx = $db->dbquerysorted($checksql);
-                                       if (!exists($mids->{$data->{idmusic}})){
-                                               push(@audiolist,"('".$shortdate."',".$cpos.",'".$cschedule."','".$data->{idmusic}."')");
-                                               $cpos++;
-                                               $ctime += $data->{duration}; 
-                                               $mids->{$data->{idmusic}} = "";
-                                       }
-                               }
-                       }
-                       &dbexec("INSERT INTO playlist (plistname,plposition,streamname,idmusic) VALUES ".join(",",@audiolist));
-               }
-               $cdt = $cdt+86400;
-       }
-$dbh->disconnect();
 
+&dbexec("DELETE from playlists where playdate >= date('".substr(&getdatetime($cdt),0,10)."') and id_schedule='".$cschedule."';");
+my $rdef=&getrotation($cschedule);
+#print Dumper($rdef);
+my $musiclists = &getallmusiclists($cschedule,$datefrom,$limit);
+#print Dumper($musiclists);
+#print Dumper(keys(%{$musiclists}));
+
+ while ($cdt <= $udt){
+       my $shortdate = substr(&getdatetime($cdt),0,10);
+       &writelog("Create Playlist for DATE ".$shortdate);
+       my $timetofill = 86400;
+               my $ctime = 0;
+       my $cpos = 0;
+       my @audiolist = ();
+       while ($ctime < $timetofill){
+                       foreach my $r (sort {$a <=> $b } keys(%{$rdef})){
+                                       #print "$r :".Dumper($rdef->{$r}->{id_vfolder})."\n";
+                                       my $aufile = shift(@{$musiclists->{$rdef->{$r}->{id_vfolder}}});
+                                       #print Dumper($aufile);
+                                       #print " ";
+                                       push(@audiolist,"(date('".$shortdate."'), '".$cpos."', '".$cschedule."', ".$aufile->{id}.")");
+                                       $ctime += $aufile->{seconds};
+                                       $cpos++;
+                                       if (scalar(@{$musiclists->{$rdef->{$r}->{id_vfolder}}}) == 0){
+                                               if (scalar(@audiolist) > 0 ){
+                                                       &dbexec("INSERT INTO playlists (playdate, playposition, id_schedule, id_music) VALUES ".join(",",@audiolist));
+                                                       @audiolist = ();
+                                               }
+                                               
+                                               $musiclists->{$rdef->{$r}->{id_vfolder}} = &getmusiclist($rdef->{$r}->{id_vfolder},$shortdate,$limit);
+                                       }
+                       }
+                       #print Dumper(scalar(@audiolist));
+                       if (scalar(@audiolist) > 0 ){
+                               &dbexec("INSERT INTO playlists (playdate, playposition, id_schedule, id_music) VALUES ".join(",",@audiolist));
+                               @audiolist = ();
+                       }
+       }
+       $cdt = $cdt+86400;
+}
+$dbh->disconnect();
+&writelog("End Creation!");
 
 
 sub getunixdatetime(){
@@ -181,40 +178,37 @@ sub writelog(){
        print $logrow;
 }
 
-sub getdayrotationdef(){
-       my $strdate = shift;
-       my $schedulename = shift;
+sub getrotation(){
+       my $idschedule = shift;
        my $rotdef = ();
        my $cnt = 0;
        # do we have a schedule?
-       my $sql = "select * from schedule where weekday = '".&getweekday($strdate)."';";
-       my $dayrot = &dbquerysorted($sql);
-       if (keys(%{$dayrot}) > 0){
-               foreach my $i (sort {$a<=>$b} keys(%{$dayrot})){
-                       $sql = "select * from rotation where rotation='".$dayrot->{$i}->{rotation}."' order by position;";
-                       my $hrot = &dbquerysorted($sql);
-                       my $trange ={"timefrom" => $dayrot->{$i}->{start}, "timeto" => $dayrot->{$i}->{end}};
-                       my @rot = ();
-                       foreach my $p (sort {$a<=>$b} keys(%{$hrot})){
-                               push(@rot,$hrot->{$p}->{owncategory});
-                       }
-                       $trange->{categories} = \@rot;
-                       $rotdef->{$cnt} = $trange;
-                       $cnt++;
-               }
-       }
+       my $sql = "select id_vfolder from rotations where id_schedule='".$idschedule."' order by rpos;";
+       my $rot = &dbquerysorted($sql);
+       return $rot;
+}
 
-       return $rotdef;
+sub getallmusiclists(){
+       my $idschedule = shift;
+       my $ldate = shift;
+       my $limit = shift;
+       my $sql = "select distinct(id_vfolder) as id_vfolder from rotations;";
+       my $mcats = ();
+       my @mxcats = &dbqueryarray($sql);
+       foreach my $cat (@mxcats){
+       #       print "CAT:\n";
+       #       print Dumper($cat);
+               $mcats->{$cat->{id_vfolder}} = &getmusiclist($cat->{id_vfolder},$ldate,$limit);
+       }
+       return $mcats;
 }
 
 sub getmusiclist(){
-       my $owncat = shift;
-       my $date = shift;
+       my $idvfolder = shift;
+       my $ldate = shift;
        my $limit = shift;
-       my $msql = "select rrm.idmusic,rrm.duration from ( select mc.idmusic,bb.lastplayed,random() as rand 
-       from music mc left join (select max(maxxx) as lastplayed,idmusic from (select pl.plistname || '_' || pl.plposition as maxxx,pl.idmusic from playlist pl left join music rm on (rm.idmusic=pl.idmusic) where pl.idmusic in (select idmusic from music where owncategory='".$owncat."') and plistname <'".$date."') aa group by idmusic) bb on (mc.idmusic=bb.idmusic) where mc.owncategory='".$owncat."' order by bb.lastplayed ASC LIMIT 100) cc left join music rrm on (rrm.idmusic=cc.idmusic) order by cc.rand;";
+       my $msql = "select random() as rand,id,title,artist,filepath,seconds from music where id_vfolder=".$idvfolder." and id not in
+(select id_music from playlists pl join music mu on (pl.id_music=mu.id) where mu.id_vfolder=".$idvfolder." and pl.playdate <= date('".$ldate."') order by pl.id DESC LIMIT ".$limit.") order by rand";
        my @mxdata = &dbqueryarray($msql);
-       $musiclists->{$owncat} = \@mxdata;
-       #
-       #return @data;
+       return \@mxdata;
 }
\ No newline at end of file
diff --git a/bin/newplc.pl b/bin/newplc.pl
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/bin/ranglescht.pl b/bin/ranglescht.pl
new file mode 100644 (file)
index 0000000..f8527c3
--- /dev/null
@@ -0,0 +1,90 @@
+#!/usr/bin/env perl
+use strict;
+use Spreadsheet::XLSX;
+use Encode;
+use Getopt::Long;
+use Data::Dumper;
+my $xlsxfile = "";
+GetOptions("xlsx|x=s" => \$xlsxfile);
+
+my $excel = Spreadsheet::XLSX -> new ($xlsxfile);
+my $points = (); 
+my $cols = ();
+my $startrow = 0;
+foreach my $sheet (@{$excel -> {Worksheet}}) {
+    $sheet -> {MaxRow} ||= $sheet -> {MinRow};
+    foreach my $row ($sheet -> {MinRow} .. $sheet -> {MaxRow}) {
+      $sheet -> {MaxCol} ||= $sheet -> {MinCol};
+      foreach my $col ($sheet -> {MinCol} ..  $sheet -> {MaxCol}) {
+        my $cell = $sheet -> {Cells} [$row] [$col];
+        if ($cell) {
+          if ($cell -> {Val} eq "Nom"){
+            $cols->{$col} = "name";
+            $startrow = $row +1;
+          }
+          if (($cell -> {Val} =~ /OLR/) && ($row == $startrow-1)){
+            my ($n) = $cell -> {Val} =~ m/.*(\d+).*/;
+            $cols->{$col} = "rl".$n;
+          }
+          if ((exists($cols->{$col}) ) && ($row > $startrow) && ($startrow != 0)){
+            if ($cell -> {Val} ne "0"){
+              $points->{$row}->{$cols->{$col}} = $cell->{Val};
+            } 
+          }
+        }
+      }
+    }
+  }
+  #print Dumper($points);
+  foreach my $p (keys(%{$points})){
+    
+    if (keys(%{$points->{$p}}) > 1){
+      my ($surname,$prename) = $points->{$p}->{"name"} =~ m/^(.+)\s(.+)$/;
+      $points->{$p}->{surname} = $surname;
+      $points->{$p}->{prename} = $prename;
+      print Dumper($points->{$p});
+    }
+    
+  }
+# my $xlsx = parsexlsx->new();
+#     my @data = $xlsx->sheetdata($p->{file},"Tabelle1");
+#     my $dataok = 0;
+#     my @datax = ();
+#     my $colnames = ();
+#     foreach my $c (@data){
+      
+#       if ($dataok == 1){
+#         my $nc = ();
+#         foreach my $r (sort {$a <=> $b} keys(%{$c})){
+          
+#           if ($c->{$r} ne "0"){
+#             $nc->{$colnames->{$r}} = $c->{$r};
+#             if ($colnames->{$r} eq "Nom"){
+#               my ($surname,$prename) = $c->{$r} =~ m/^(.+)\s(.+)$/;  
+#               $nc->{prename} = $prename;
+#               $nc->{surname} = $surname;  
+#             }
+#             if ($colnames->{$r} eq "Place"){
+#               $nc->{$colnames->{$r}} =~ s/\.//;
+#             }
+#           }
+#         }
+#         push(@datax,$nc);
+#       }
+#       if (exists($c->{3}) && $c->{3} eq "Nom"){
+        
+#         # print $c;
+#         $dataok = 1;
+#         foreach my $n (keys(%{$c})){
+#           $colnames->{$n} = $c->{$n};
+#         }
+#         #$html->{colnames} = $colnames;
+#       }
+      
+#     }
+#     foreach my $dx (@datax){
+#       if (exists($dx->{"OLR ".$p->{rl}})){
+#         print encode("utf-8","select * from rankingdata('".$p->{listname}."','".$p->{season}."',".$p->{rl}.",'".$dx->{surname}."','".$dx->{prename}."',".$dx->{"OLR ".$p->{rl}}.",".$dx->{"Total"}.",".$dx->{"Place"}.");")."\n"; 
+#         #print "select rl2=".$dx->{"OLR ".$p->{rl}}.", WHERE surname='".$dx->{surname}."' and prename='".$dx->{prename}."';"
+#       }
+#     }
\ No newline at end of file
index df1ec41..d491d3f 100644 (file)
Binary files a/bin/wkhtmltopdf/testdoc.pdf and b/bin/wkhtmltopdf/testdoc.pdf differ
index dd8f286..f3327fa 100644 (file)
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   <title>Document</title>
+  <style>
+
+    div {
+      font-size: 18pt;
+    }
+    table {
+      font-size: 18pt;
+      border-spacing: unset;
+      border-collapse: unset;
+    }
+    td.invdatalbl {
+      font-weight: bold;
+      margin: 1mm; 
+      padding: 2mm;
+      border-collapse:collapse;;
+      width: 30mm;
+      background-color: #c6c6c6;
+    }
+    td.invdataval {
+      font-weight: normal; 
+      margin: 1mm; 
+      padding: 2mm;
+    }
+    .right{
+      text-align: right;
+    }
+    table#tbl_products {
+      border-spacing: 0;
+      border-collapse: 0;
+      margin-top: 10mm;
+      width: 100%;
+    }
+    table#tbl_products td {
+      padding: 2mm;
+      border-bottom: 1px solid black;
+    }
+    
+    table#tbl_products th {
+      margin: 1mm; 
+      border: 1px solid #fff;
+      border-bottom: 0px;
+      padding: 2mm;
+      background-color: #c6c6c6;
+    }
+    
+    th.footer {
+      margin: 1mm; 
+      border: 1px solid #fff;
+      background-color: unset;
+      border-bottom: 0px;
+      padding: 2mm;
+      text-align: right;
+    }
+  </style>
 </head>
 <body>
-  <h1>TEST DOCUMENT</h1>
-  <table>
-    <thead><tr><th>TEST</th></tr></thead>
+  
+  <table style="width: 100%;">
+    <tr>
+      <td style="width: 60%;"></td>
+      <td style="width: 40%;font-size: 30pt; font-weight: bold;">Rechnung</td>
+    </tr>
+    <tr>
+      <td style="vertical-align: top; font-size: 25pt;">
+        Firma<br/>1, rue Principale<br>L-1234 Ville<br/><br/>
+      </td>
+      <td >
+        <table style="border: 1px solid black; width: 100%; font-size: 18pt;">
+          <tr> <td class="invdatalbl">Rechnungs-Nr.</td><td class="invdataval">YYYYMMDD-XXXX</td></tr>
+          <tr> <td class="invdatalbl">Datum</td><td class="invdataval">DD.MM.YYYY</td> </tr>
+          <tr> <td class="invdatalbl">Fälligkeit</td><td class="invdataval">DD.MM.YYYY</td> </tr>
+          <tr> <td class="invdatalbl">Kundennummer</td><td class="invdataval">00000000</td> </tr>
+        </table>
+      </td>
+    </tr>
+    
+  </table>
+  <table id="tbl_products" >
+    <thead><tr><th style="width: 15mm;">#</th><th>Produkt / Dienstleistung</th><th style="width: 25mm;" colspan="2">Anz.</th><th style="width: 25mm;">Einzel-Preis</th><th style="width: 25mm;">Netto-Summe</th></tr></thead>
     <tbody>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
-      <tr><td>row</td></tr>
+      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right" style="width: 10mm;">0</td><td style="width: 15mm;">Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
+      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
+      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
+      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
+      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
+      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
+      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
+      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
+      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>
+      <tr><td style="width: 15mm;">AB12</td><td>Lange Beschreibung</td><td class="right">0</td><td>Stunden</td><td class="right">0,00 €</td><td class="right">0,00 €</td></tr>      
     </tbody>
+    <tfoot>
+      <tr>
+        <th colspan="4" class="footer right">Total Netto</td>
+        <td colspan="2" class="right" >0000,00 €</td>
+      </tr>
+      <tr>
+          <th colspan="4" class="footer right">MwSt. (17%)</td>
+          <td colspan="2" class="right" style="font-style: italic;">0000,00 €</td>
+        </tr>
+        <tr>
+            <th colspan="4" class="footer right">Gesamt zu bezahlen:</td>
+            <td colspan="2" class="right" style="font-weight: bold;">0000,00 €</td>
+          </tr>
+    </tfoot>
   </table>
+  <div style="width: 100%; padding-left: 100mm;margin-top: 10mm;">Nous vous prions de virer le montant ci-dessus au compte<br>
+      <b>LU25 0020 1100 2783 8700 (BILLLULL)</b></div>
 </body>
 </html>
\ No newline at end of file
diff --git a/bin/wkhtmltopdf/testdoc/dks_500.png b/bin/wkhtmltopdf/testdoc/dks_500.png
new file mode 100644 (file)
index 0000000..35c6adb
Binary files /dev/null and b/bin/wkhtmltopdf/testdoc/dks_500.png differ
index 724a6e3..9ed52d3 100644 (file)
@@ -20,11 +20,13 @@ function subst() {
     }
 }
 </script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="border-top: 1px solid black; width: 100%">
+<table style="width: 100%;" >
+  <tr><td colspan="2" style="text-align: center;"><b>DKS</b>, Société à responsabilité limitée, <b>RC</b> B168572 - <b>TVA:</b> LU 25375617 - <b>No. Aut:</b> 10024550 / 0<br/>
+    <b>IBAN:</b> LU25 0020 1100 2783 8700; <b>BIC:</b> BILLLULL</td></tr>
   <tr>
-    <td class="section"></td>
+    <td></td>
     <td style="text-align:right">
-      Page <span class="page"></span> of <span class="topage"></span>
+      Seite <span class="page"></span>/<span class="topage"></span>
     </td>
   </tr>
 </table>
index fcdb882..b5596a1 100644 (file)
@@ -1,31 +1,21 @@
 <!DOCTYPE html>
-<html><head><script>
-function subst() {
-    var vars = {};
-    var query_strings_from_url = document.location.search.substring(1).split('&');
-    for (var query_string in query_strings_from_url) {
-        if (query_strings_from_url.hasOwnProperty(query_string)) {
-            var temp_var = query_strings_from_url[query_string].split('=', 2);
-            vars[temp_var[0]] = decodeURI(temp_var[1]);
-        }
-    }
-    var css_selector_classes = ['page', 'frompage', 'topage', 'webpage', 'section', 'subsection', 'date', 'isodate', 'time', 'title', 'doctitle', 'sitepage', 'sitepages'];
-    for (var css_class in css_selector_classes) {
-        if (css_selector_classes.hasOwnProperty(css_class)) {
-            var element = document.getElementsByClassName(css_selector_classes[css_class]);
-            for (var j = 0; j < element.length; ++j) {
-                element[j].textContent = vars[css_selector_classes[css_class]];
-            }
-        }
-    }
-}
-</script></head><body style="border:0; margin: 0;" onload="subst()">
-<table style="border-bottom: 1px solid black; width: 100%">
+<html><head>
+
+</head><body style="border:0; margin: 0;" o>
+<table style="width: 100%;">
   <tr>
-    <td class="section"></td>
-    <td style="text-align:right">
-      Page <span class="page"></span> of <span class="topage"></span>
+    <td style="width: 100mm; margin-top:5mm;"><img src="dks_500.png" style="height: 35mm;"/></td>
+    <td style="width: 60mm">&nbsp;</td>
+    <td style="width: 50mm;text-align: right;">
+      <div style="text-align: left;width: 50mm; font-size: 12pt;font: sans;">
+          <b>DKS s.à r.l.</b><br/>
+          8b, rue du Moulin<br/>
+          L-6914 Roodt-sur-Syre<br/><br/>
+          Tel: +352 691 504 574<br/>
+          info@dks.lu / www.dks.lu<br/>
+      </div>
     </td>
+    <tr><td style="text-align: left;">Database knowledge Solutions - <b>Simplify IT</b></td><td></td><td></td></tr>
   </tr>
 </table>
 </body></html>
index 5ba2615..0ebe01d 100644 (file)
@@ -1,6 +1,6 @@
-PDFTOP="10mm"
-PDFBOTTOM="10mm"
-PDFLEFT="10mm"
+PDFTOP="40mm"
+PDFBOTTOM="20mm"
+PDFLEFT="20mm"
 PDFRIGHT="10mm"
 PDFSIZE="A4"
 PDFORIENTATION="Portrait"
\ No newline at end of file
diff --git a/dev/setvendor.pl b/dev/setvendor.pl
deleted file mode 100644 (file)
index ef11ca7..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/usr/bin/env perl
-
-use strict;
-
-opendir
\ No newline at end of file
index 9b097cf..095ff06 100644 (file)
--- a/dksnas.pl
+++ b/dksnas.pl
@@ -45,12 +45,12 @@ print $cfgpath."\n";
 
 my $allapp = builder {
   enable "DirIndex", dir_index => 'index.html';
-  mount "/" => Plack::App::WrapCGI->new(script => $RealBin."/CGI/index.cgi")->to_app;
+  mount "/" => Plack::App::WrapCGI->new(script => $RealBin."/CGI/index.cgi" , execute => 1)->to_app;
   
   opendir(API,dirname($0)."/CGI/api");
    while (my $s = readdir(API)){
      if ($s =~ /\.cgi$/){
-       mount "/api/".$s => Plack::App::WrapCGI->new(script => $RealBin."/CGI/api/".$s)->to_app;
+       mount "/api/".$s => Plack::App::WrapCGI->new(script => $RealBin."/CGI/api/".$s,execute => 1)->to_app;
      }
    }
    closedir(API);