ONO::FW::Edu::Apps::Modules::AudioRecorder

package ONO::FW::Edu::Apps::Modules::AudioRecorder;
################################################################################
# COPYRIGHT / LICENSE #
################################################################################
#
# This file is part of the ONO Software Project.
#
# Copyright (C) 2022-2026 Jos Kirps and The Joopita Project [ASBL]
# Copyright (C) 2011-2022 Jos Kirps and Joopita Research ASBL
# Copyright (C) 2006-2011 Jos Kirps and The Joopita Project
# Copyright (C) 2001-2006 Jos Kirps and The WobbleWolf Project
#
# This file, as well as many other parts of the ONO Software Project or
# related elements, are FREE SOFTWARE available under the ARTISTIC LICENSE 2.0.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# For the full license, see /ono/osr/license/LICENSE.txt, or write to
# jos_AT_kirps_DOT_com or contact_AT_joopita_DOT_com.
#
################################################################################
# END OF COPYRIGHT / LICENSE, HERE COMES THE CODE ... #
################################################################################

#: This module is a front end application module wrapper that has been
#: created for the Morzino Project (morzino.com) and that has been released
#: as Open Source software.
#:
#: Note that this is NOT a self-contained application, it is only a wrapper
#: that makes heavy use of the ONO Perl Framework application engine.

use strict;

use ONO::Render;

use ONO::ToolBox::Auth;
use ONO::Lib::Lang::LangKitEdu;

use ONO::Lib::DateTime::ToolBox;

use ONO::FW::Apps::Core;
use ONO::FW::Apps::Core::Graphics;

use ONO::FW::Edu::Apps::ToolBox;
use ONO::FW::User::Init;

use ONO::IO;
use ONO::DB;
use ONO::Lib::Basic;
use ONO::Lib::UI::MSG;

use ONO::Lib::Parser;

use ONO::Lib::Audio::Object;
use ONO::Lib::Audio::Recorder;

sub run {

my (
$self,
$option,
$vars_ref,
$HTTP,
$BASE,
) = @_;

################################################################
# INIT - BEGIN
################################################################

my (
$db,
$community,
$action_url,
$form,
$format,
$canvas,
$pdfkey,
$sec,$min,$hour,
$mday,$mon,$year,
$wday,$yday,$timestamp,
$lang,
$BLK_ref,
$vars_ref,
) = ONO::FW::Apps::Core->init($vars_ref);

my %vars = %$vars_ref;
my %BLK = %$BLK_ref;

my $WEB;

my (
$vpath,
$lang,$domain,$community,
$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$timestamp,
$script_url,$action_url,$form
) = ONO::FW::User::Init->getvar(\%vars);

ONO::FW::Apps::Core->now("","audio_recorder",$vars{'app_lang'});

my $action_url = qq~$ENV{'SCRIPT_NAME'}?app_lang=$vars{'app_lang'}&~;

my @txt = (
"My recordings",
"Recordings will be deleted after one week, unless you will save them in your personal media folder!",
"Recordings will be saved in your personal media folder",
"Recording saved",
"Your recording has been successfully saved in your personal media folder!",
);

if ($lang eq "de") {
@txt = (
"Meine Aufnahmen",
"Aufnahmen werden nach einer Woche gelöscht, es sei denn du speicherst sie in deinem persönlichen Medienordner!",
"Aufnahmen werden in deinem persönlichen Medienordner gespeichert",
"Aufnahme gespeichert",
"Deine Aufnahme wurde erfolgreich in deinem persönlichen Medienordner gespeichert!",
);
}

if ($lang eq "lu") {
@txt = (
"Meng Opnamen",
"Opname gi no enger Woch geläscht, ausser du späichers se an dengem perséinleche Mediendossier!",
"Opname ginn an dengem perséinleche Mediendopper gespäichert",
"Opnam gespäichert",
"Deng Opnam gouf erfollegräich an dengem perséinleche Mediendopper gespäichert!",
);
}

if ($lang eq "fr") {
@txt = (
"Mes enregistrements",
"Les enregistrements seront supprimés au bout d'une semaine, à moins que vous ne les sauvegardiez dans votre dossier multimédia personnel!",
"Les enregistrements seront sauvegardés dans votre dossier multimédia personnel",
"Enregistrement sauvegardé",
"Votre enregistrement a été enregistré avec succès dans votre dossier multimédia personnel!",
);
}

# garbage collector, remove files older than 7 days

ONO::Lib::Audio::Recorder->tmp_garbage("$year$mon$mday");

# save file to tmp

if ($vars{'username'} && $vars{'ono_recorder_rec_data'}) {

$WEB .= ONO::Lib::UI::MSG->saving($lang);

$vars{'file'} = ONO::Lib::Audio::Recorder->save(
ONO::Lib::Audio::Recorder->tmp_file("$year$mon$mday$hour$min$sec",$vars_ref),
$vars{'ono_recorder_rec_data'},
);

}

# display the recorder

my $switches;
if (!$vars{'username'}) {
$switches .= "LS";
}

$WEB .= qq~<$form>~;

$WEB .= ONO::Lib::Audio::Recorder->recorder("rec",$BLK_ref,"fs$switches",$vars{'filename'});
$WEB .= ONO::Lib::Audio::Recorder->script("rec");

$WEB .= qq~</form>~;

if ($vars{'username'} && $vars{'audio_recorder_option'} eq "save" && $vars{'audio_recorder_file'} =~ /\.mp3/ && $vars{'audio_recorder_target'}) {

my $SOURCE = "media/tmp/audiorecorder/$vars{'username'}/$vars{'audio_recorder_file'}";

if (ONO::IO->exists($SOURCE)) {

my ($BASEDIR,$TARGET);

if ($vars{'audio_recorder_target'} =~ s~^user:~~) {

$vars{'audio_recorder_filename'} =~ s~[^A-Za-z0-9\-\_]~~g;
if (!$vars{'audio_recorder_filename'}) {
$vars{'audio_recorder_filename'} = $BLK{'untitled'};
}
$BASEDIR = "media/users/".ONO::IO->deepdir($vars{'username'})."/$vars{'username'}/$vars{'audio_recorder_target'}";
$TARGET = "$BASEDIR/$vars{'audio_recorder_filename'}.mp3";

my $whilecounter;
while ($whilecounter < 1000 && ONO::IO->exists($TARGET)) {
$whilecounter++;
$TARGET = "$BASEDIR/$vars{'audio_recorder_filename'}_$whilecounter.mp3";
}
}

if ($BASEDIR && $TARGET) {

ONO::IO->mkpath($BASEDIR);
ONO::IO->mv($SOURCE,$TARGET);
$WEB .= qq~<div id="audio_recorder_done_msg" class="box_green w50 abs" style="top:32px;left:32px">
<a href="javascript:void(0);" onclick="onojs_hide('audio_recorder_done_msg');"><img class="close" alt="close_button"></a>
<h3 class="green">$txt[3]</h3>
<div class="box_paper">
<table class="wide_table">
<tr class="vtop">
<td><img class="block32 mr5" src="/ono/osr/images/icons/crystal/32x32/actions/agt_action_success.png" alt="ok"></td>
<td class="w100 large col6">$txt[4]</td>
</tr>
<tr>
<td></td>
<td><a href="javascript:void(0);" onclick="onojs_hide('audio_recorder_done_msg');" class="button_green mt10">$BLK{'Ok'}</a></td>
</tr>
</table>
</div>
</div>
~;

}
}
}

if ($vars{'username'}) {

if ($vars{'audio_tmp_option'} eq "delete" && $vars{'audio_tmp_file'} =~ /\.mp3/) {

$vars{'audio_tmp_file'} =~ s~[^A-Za-z0-9\-\.]~~g;

ONO::IO->rm("media/tmp/audiorecorder/$vars{'username'}/$vars{'audio_tmp_file'}");

}

my ($FILES,$count);

foreach my $file (reverse ONO::Lib::Audio::Recorder->tmp_files($vars{'username'})) {
$count++;
my $AUDIO = ONO::Lib::Audio::Object->player(
"player_$count",
"/media/tmp/audiorecorder/$vars{'username'}/$file",
"BCInNsUX",
"sd",
"$action_url&audio_tmp_file=$file&audio_tmp_option",
$BLK_ref,
);
$FILES .= qq~<div class="fl mr10 mb10">$AUDIO</div>~;
}

if ($FILES) {
$WEB .= qq~<div class="box_paper rel" style="top:50px;height:300px;overflow:hidden">
<h3 class="m0">$txt[0]</h3>
<div class="mb10">$txt[1]</div>
<div class="inline w100">$FILES</div>
</div>
~;
}

}

if ($vars{'username'} && $vars{'audio_tmp_option'} eq "save" && $vars{'audio_tmp_file'} =~ /\.mp3/) {

my $filename = $vars{'audio_tmp_file'};
$filename =~ s~^(.*?)-~~;
$filename =~ s~\.mp3$~~;

my $AUDIO = ONO::Lib::Audio::Object->player(
"player_1",
"/media/tmp/audiorecorder/$vars{'username'}/$vars{'audio_tmp_file'}",
"BInNsUX",
);

my ($TARGET,%last);

my $DIR = "media/users/".ONO::IO->deepdir($vars{'username'})."/$vars{'username'}";

my @DIRS = ("public/audio:public","documents/audio:protected");

foreach my $area (ONO::IO->dir($DIR)) {
if ($area =~ /(documents|public|shared)/) {
foreach my $dir (ONO::IO->dir("$DIR/$area")) {
if ($dir =~ m~[A-Za-z0-9]~ && $dir !~ /\./) {
if ($area ne $last{$area}) {
$last{$area} = $area;
@DIRS = (@DIRS,"-");
}
@DIRS = (@DIRS,"$area/$dir");
}
}
}
}

foreach my $target (@DIRS) {
if ($target eq "-") {
$TARGET .= qq~<option value="$DIR/public/audio">----</option>~;
} else {
my $target_name = $target;
my $target_info;
if ($target =~ /^(.*):(.*?)$/) {
$target_name = $1;
$target_info = " ($2)";
}
$target_name =~ s~^$DIR/~~;
$TARGET .= qq~<option value="user:$target_name">$target_name$target_info</option>~;
}
}

$WEB = qq~<div class="box_green" style="max-width:480px">
<a href="$action_url"><img class="close" alt="close_button"></a>
<h3 class="green">$BLK{'Save'}</h3>
<div class="box_paper">
$AUDIO
<$form>
<input type="hidden" name="audio_recorder_option" value="save">
<input type="hidden" name="audio_recorder_file" value="$vars{'audio_tmp_file'}">
<table class="wide_table mt20">
<tr>
<td class="tar">$BLK{'filename'}:</td>
<td class="p0">
<table class="wide_table">
<tr>
<td class="w100"><input type="text" name="audio_recorder_filename" value="$filename" class="w95"></td>
<td>.mp3</td>
</tr>
</table>
</td>
</tr>
<tr>
<td></td>
<td class="p5"></td>
</tr>
<tr>
<td><img class="block24 mt5 mb5 fr" src="/ono/osr/images/icons/crystal/32x32/ono/help.png" alt="info"></td>
<td>$txt[2]:</td>
</tr>
<tr>
<td class="tar">$BLK{'target'}:</td>
<td><div class="select"><select name="audio_recorder_target">$TARGET</select></div></td>
</tr>
<tr>
<td></td>
<td class="w100"><div class="mt10">$BLK{'submit_save'}</div></td>
</tr>
</table>
</form>
</div>
</div>
~;

}

$WEB .= ONO::Lib::Audio::Object->player_script("");

my ($status,$WEB) = ONO::Lib::Parser->parse($WEB,$vars_ref);

$WEB .= ONO::FW::Apps::Core->vardump($vars_ref);

$WEB = ONO::FW::Edu::Apps::ToolBox->apps_gate($WEB,$vars_ref);

return $WEB;

}

###################################################################
#### THAT'S IT :-D
###################################################################

1;

__END__