#!/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
-#!/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;
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();
#!/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/;
#!/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/;
--- /dev/null
+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
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;
--- /dev/null
+#!/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
-#!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 );
}
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;
-<!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
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(){
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
--- /dev/null
+#!/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
<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
}
}
</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>
<!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"> </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>
-PDFTOP="10mm"
-PDFBOTTOM="10mm"
-PDFLEFT="10mm"
+PDFTOP="40mm"
+PDFBOTTOM="20mm"
+PDFLEFT="20mm"
PDFRIGHT="10mm"
PDFSIZE="A4"
PDFORIENTATION="Portrait"
\ No newline at end of file
+++ /dev/null
-#!/usr/bin/env perl
-
-use strict;
-
-opendir
\ No newline at end of file
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);