Sei sulla pagina 1di 9

Pr

oget
toperRet
idiCal
col
ator
iLuc
aTes
toni

L'
intentodi questodocument oe' quell
odi s
piegarel'a
rchit
ett
uraei lfunzi
onamentodiunsi
stema
cli
ent/serveringradodi f
orni
r eall'
utent
eun'inter
facci
awebperl 'uploaddiilemulti
medi
al
i,difor
nir
e
unapi a
t taf
or madiconversi
onedeli l
eorigi
nalein3f ormatis
tandard( AVI
,Mp3eMp4)di stri
buit
asu2
serverdi conversi
oneedi ri
-sinc
r oni
zzareiileottenutinel
lacar
tell
awebdi par
tenzainmododa
permett ereildownloadall
'utente.

Architettura
L'
archit
etturas ibasas upiu'pr
ot ocoll
iel i
nguaggidiprogr ammaz i
onenonc hés uunpr ogramma
denominatobr okerperl ages t
ionedi mes saggi(Rabbi
tMq)eunpr ogrammadi c onver
sionedeiile
chi
amat ofmpeg.
Iprotocol
liutil
izzatisono:
HTTP,perl 'i
nterfacc
iawebs ulserverweb( SW)mes s
aadi spos
izi
onedel l
'ut
ent eperildownloade
l'
uploaddei il
emul timediali
;
AMQP( Advanc edMes sageQueui ngPr otocol)
,perlos ca
mbi odi mes s
aggifrailSW ei serverdi
conversi
one( SC) ;
RSSperper mettereall'
utentedi accorgersiquandoi i
lec onvert
itisonodisponibil
iperildownload.
Ili
nguaggi diprogrammaz ioneut i
li
zz a
tisonoi lphpel'htmlment reilbrokere'sc r
it
toinEr l
ang.

Funzi onament o
Lapagi nadi upl oade' protet tadauns is
t emadi l
oginbas atos ucredenz ialisalvateinunat abel las uun
DBMS.Perr ender eHTTPs tat efullequi ndi mant ener ememor i
adei l
oginefet tuatidagl iutent i,si e'
sceltodi ut
ili
z zar eanc heunc ooki ec hememor izzalas es si
onedi l
ogindi ogni utenteperundet ermi nato
per i
odo.
Dopoav erefet tuat oi llogin,l 'utent es iritrovanel lapagi nac ontenent elaf or m diuploadi nc ui gli viene
chiestoi lnomedeli leel adat a.Unavol tac ompi l
a t
i icampi ,a l
l'
ut ente vienec hi
es t
odi scegl i
er ei li l
eda
car i
caredals uodi spos i
ti
vo.Cl iccandos u“ Upl oad”avvi enel 'uploadver oepr oprio.
Ilnomeel adat avengonos a lvat ii
nduev ariabil
iphpc onduec hiamat ePOST,i lilevienes alva toc onil
nomec ompos toda ll
adat a_nomei nunac artellasulSW c onun’ ulteriorec hiamat aPOST.
Aques topunt oi lnomeel adat aei lpat hdeli l
evengonoi nc apsulati i
nunmes s
aggi oinsiemea llac hiave
di exchangec hei dent i
i caaqua l
es erverdev ees seres peditoi lmes saggio( SC1oSC2)ei lmes saggi o
vienei nviat
oalbr okerl ocale( 127. 0. 0.1)c hes ioc cupadel l'
inviover oepr oprios upr otocolloAMQPal
SCi na s col
toes ol oal ui
.
Quandol '
SCr i
cev eilmes saggi oc ont enent ei da t
i dellevar i
abi l
i,vienea ttivataunaf unz i
onephpc he
leggei lpathdeli leinr emot o;di cons eguenz a,si atti
vaunas essioner syncdaSCaSW c hec opi ai li l
e
i
nunadi rectoryl oc aledi SC,vengonoat t i
va telec onver si
onideli lenei 3f ormat ievengonol etti il
nomeel ada tac hec ompor r annoi nomi dei i l
edi out putc on3es tens i
oni diverse( .
avi .mp3e. mp4) .
Quandol econver si
onis onot er minat es i attivaunas ec ondas essioner syncc heri-si
nc ronizzal ac ar t
ella
localec onl ac art ellar emot a,c ari
c andoqui ndi difa t
t oi 3i l
edi out puts ulSW.
Aques topunt ol 'RSSa vvi
ser àl '
utent edel lac ompar s adei trei leepot ràc ollegarsia l
lapagi nawebper
sca r
icarli
.

Appl i
cazione
L'
appl i
cazi
onepr i
nci
pa l
ediquestos i
stemae' attual
ment equel l
adi converti
relezi
oniregistra
tedi cor
si
universi
tari
,i
nf ormatist
andardchegli st
udent i
pos sonos c
aricare,perpoteres s
erevis t
isiasupcc hesu
dis
pos i
tivimobil
i.
Laf or
m di i
nseri
mentopr ev
edeunpr imoc ampodata modi icabi
lepergar anti
reall'
operatoreches ta
efet t
uandol '
uploadlapossibi
li
tàdicaric
arev ecchi
el ez
ioni
;s eilcampodata nonvi eneva l
orizz
atousa
didefaultladatael '
oraincuisist
aefet tuandol '
upload.Vienequi ndiri
chi
estol'i
nserimentodi un
secondoc ampomateria s elezi
onabiledaunal ist
adi nomi separatipercorsodi i
nsegna mento.
L'i
nsi
emedi ques t
i duec ampi f
ormai lnomedeli lec hever r
a'passatoals i
stemaeut li
zzatod'orainpoi
peridentiic
a r
ei lile.I
lf ormatodelnomes ara' quindiYYMMDD_materia.estensione.
Ilsi
stemae' coni guratoperges t
ir
elel ezioni suddividendoleindirect
ory,unaperogni materia.
All'
i
nternodel l
adi rectorydellama t
er i
at r
ov eremoa ltre3di r
ectory(audio,video,mobil
e)c he
conterr
annoal orovol tai il
emul ti
medi al
ipr odot tidall
ac onversi
oneeuni lephpc hegener agliRSS.L
a
sincr
onizzazi
onec ompr endel '
i
nteradirectorydel lama teri
aspostandos oloi il
enuovi.
Unavol taterminatal ac onversi
oneel as i
nc ronizzaz i
onedel l
acartel
lacont eneteiileprodotti,l
'
RSS
avvisal
'utentedel lapres enzadinuovel ezioni disponibili
perildownload.

Per chéAMQP
Ilvantaggiodiusar
eunbr okerdi i
nviomessaggiba s
a t
os uAMQPs t
atuttanelfattoc hee' unprot
oc ol
lo
diges ti
onedicodedi messaggiasi
ncrono.I
lbr okermanti
eneunac odadei messaggidai nviar
eagliSC
siaquandoques tis
onoof- li
ne,s i
aquandos onooc cupat
inell
ac onversi
onedi alt
riile.Lac adut
adi un
SCi nfatt
inoncompor tal
aper di
tadelmes s
aggi oaluidesti
nato:ilmessaggioresteràqui ndii
ncoda
pressoilbrokerintantoc
hei lbrokernonri
us cir
àas pedi
reilmes saggi
o.

Di
agr
ammadilus
sodels
ist
ema

WS
HTTPUpl
oad/
RSS

Cart
ell
aWSperl '
upl
oadei
ldownl
oaddei
il
emultimedi
al
i

E.
g./
var
/www/

Rabbi
tMQ
Server

fmpeg_exc
hange1 fmpeg_exc
hange2

SC1 SC2

RabbitMQ RabbitMQ
cl
ient cl
ient

RSYNC RSYNC

fmpeg fmpeg
Codi
ce
WS
La
tos erveravr
emounaf unzi
onecheri
ceveivaloridal
laf
orm ecost
ruis
ceilmessaggi
ocompost
odal
pat
h,da lnomedelile(c
ompos t
oas uavol
tada lnomeedalladatascel
tadal
l'
utentenel
laf
orm)e
dal
l'
exchangecheident
iicaSCac ui
deveesserespeditoi
lmessaggi
o.

I
ndex.
php(
logi
nef
orm diupl
oad)

<?php if(!isset($_COOKIE['magicookie'])){
header("location:login/");
} else if($_COOKIE['magicookie']=='no'){
header("location:login/");
} else {?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>Ce@ Ajax File Upload Form</title>

<!-- Google web fonts -->


<link href="http://fonts.googleapis.com/css?family=PT+Sans+Narrow:400,700"
rel='stylesheet' />

<!-- The main CSS file -->


<link href="assets/css/style.css" rel="stylesheet" />
</head>
<body>
<form id="date-form"
method="post"
action="index.php">
<h4>1- (OPTIONAL) Puoi settare la data/ora se stai caricando una lezione
vecchia, se non metti nulla prendera' automaticamente la data/ora corrente'</h4><p>
<?php echo 'Esempio: 110413-13:00 significa 13 Aprile 2011 ore
13:00'; ?>
<input type="text" name="date">
<input type="submit" id="date" value="Set Date/Time">
<?php
$date=$_POST['date'];
if($date!=NULL){echo'<h5>Hai settato data e ora in: ';
echo $date.'</h5>';} ?>
</form>

<form id="upload" method="post" action="upload.php" enctype="multipart/form-


data">
<?php include("function.php"); corso($array,$date);?>
<div id="drop">
Drop Here

<a>Browse</a>
<input type="file" name="upl" multiple />
</div>
<ul>
<!-- The file uploads will be shown here -->
</ul>

</form>

<!-- JavaScript Includes -->


<script
src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="assets/js/jquery.knob.js"></script>

<!-- jQuery File Upload Dependencies -->


<script src="assets/js/jquery.ui.widget.js"></script>
<script src="assets/js/jquery.iframe-transport.js"></script>
<script src="assets/js/jquery.fileupload.js"></script>

<!-- Our main JS file -->


<script src="assets/js/script.js"></script>

<?php } ?>
</body>
</html>
f
unc
tion.
php(
ilec
onl
efunzi
onidis
ist
ema)

Funzi
oneperlaconnessi
onealDB
function mysql_connection($host, $myuser, $mypass){
$myconnection = mysql_connect($host, $myuser, $mypass);
if (!$myconnection) {
die('Could not connect: ' . mysql_error());
}
return $myconnection;
}

QueryalDBperilc
onfront
odell
ecredenz
ial
i
function login($user, $pass){
$pass=md5($pass);
$link=mysql_connection('127.0.0.1', 'user', 'password');
mysql_select_db('magicboxes');
$query = sprintf("SELECT name, pass FROM mb_users WHERE user='$user' AND
pass='$pass'");
$result = mysql_query($query);
if (mysql_num_rows($result) == 0) {
setcookie('magicookie', 'no', time() + 5, '/');
header('Location: ./index.php');
exit;
}
while ($row = mysql_fetch_assoc($result)) {
if ($row['pass']===$pass){
return true;
}
}
}

For
m dil
ogini
nHTML
function form_login(){

echo'<div id="Login-form"></div>
<form id="login"
method="post"
action="login.php">
<h4>Login</h4><p>
<h4>User
<input type="text" name="user"></h4><p>
<h4>Password
<input type="password" name="pass"></h4>
<input type="submit" id="login" value="Login">
</form> ';
}

Funzi
onesender
function sender($text, $rk, $exchange, $ip){

$connection=amqp_connection('user', 'password', $ip);

$ex = new AMQPExchange($connection);


$ex->declare($exchange, AMQP_EX_TYPE_DIRECT, AMQP_DURABLE |
AMQP_AUTODELETE);

$msg=$ex->publish($text, $rk);
if (!$msg){echo "error";}echo 'Sended '.$msg.'<br>';

if (!$connection->disconnect()) {
throw new Exception('Could not disconnect');
} else {
echo "disconnected";
}
}
upl
oad.
php

//Se abbiamo un errore nell'upload, segnalalo

if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {

//costruiamo il path

$file = pathinfo($_FILES['file']['name']);
list($path, $url) = explode(' ', urldecode());
$path = $path.'.'.$file['extension'];
if(file_exists($url)){
move_uploaded_file($_FILES['file']['tmp_name'], "$url/$path");
} else {
mkdir("$url", 0755, true);
move_uploaded_file($_FILES['file']['tmp_name'], "$url/$path");
}

//costruiamo il testo del messaggio che dovra' essere spedito

$text=$path.' '.$url;

//generiamo l'exchange basato su un numero random da 0 a 3


$i=rand(0,3);
if($i<2){
$exchange='ffmpeg_exchange1';
} else {
$exchange='ffmpeg_exchange2';
}
sender($text, 'encode.key', $exchange, '127.0.0.1');
}
SC
LatoCl i
enta vremounaf unz
ioneches iconnetteràalbrokerpercomunicargl
i c
hee' disponibil
ea d
accettaremes saggi.Lafunzi
onee' att
ivata/dis
atti
vatadaunos cri
pti
nbas hc heviener i
chiama t
oadogni
i
nitdel l
amac chinainmododaes sereattivatonelmoment odelboot
.Essendoi nserit
onel l
'
inite'
possibil
eat ti
vare,disa
tti
vareor i
avvi
areilc li
entusandol'apposi
toscr
iptseguitodas tart,stopor es
tart.
Avremoi noltrelafunzionerecei
verinvoca t
aperr i
cevereilmessaggi
odalbr oker,lanci
areledues es
sioni
dirsync( andataer i
torno)
Bas
hsc
ripti
nser
it
onel
lac
art
ell
a/et
c/i
ni
t.
d/
#!/bin/sh

PIDDIR=/var/log/rabbit/
FILE=/var/daemon.php
CONFIGFILE=/etc/php5/apache2/php.ini
DAEMON=/usr/bin/php
DESC=amqp-daemon
NAME=amqp-daemon
USERID=root
GROUPID=root

test -x $DAEMON || exit 0

case "$1" in
start)

echo -n "Starting $DESC: "


start-stop-daemon --start --quiet --chuid $USERID:
$GRFILE1OUPID -p $PIDDIR/$DAEMON.pid\
--exec $DAEMON -- -c $CONFIGFILE $FILE &2> /dev/null

echo AMQP Daemon Started


;;

stop)
echo -n "Stopping $DESC: "
# Send TERM after 5 seconds, wait at most 30 seconds.
start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet
--exec $DAEMON
echo Stoppped
;;

restart)
echo -n "Restarting $DESC: "
# Send TERM after 5 seconds, wait at most 30 seconds.
start-stop-daemon --stop --oknodo --retry TERM/5/0/30 --quiet
--exec $DAEMON
echo Stopped

echo -n "Starting $DESC: "


start-stop-daemon --start --quiet --chuid $USERID:
$GROUPID -p $PIDDIR/$DAEMON.pid\
--exec $DAEMON -- -c $CONFIGFILE $FILE &2> /dev/null
echo AMQP Daemon Started
;;

*)
echo "Usage: $0 {start|stop|restart}" >&2
exit 1
;;

esac
exit 0
Laf
unz
ioner
ecei
verc
ont
enut
aneli
ledaemon.
phper
ichi
ama
tada
llos
cri
ptdi
ini
t

/
/Imposta l'ip del broker AMQP

$ip = '';

//Imposta l'identificativo dell SC

$SC = 'SC1';

//Imposta l'exchange che identifica la macchina exchange1 per SC1, exchange2 per
SC2

$exch = 'ffmpeg_exchange1';

receiver('$exch', 'encode.key', $SC, $ip);

function receiver($exchange, $rk, $queuename, $ip) {

$lpath='path locale in cui lavorare';


$connection=amqp_connection('guest', 'guest', $ip);

$queue = new AMQPQueue($connection);


$queue->declare($queuename);
$queue->bind($exchange, $rk);

while(true){
$msg=$queue->get();
list($path, $url) = explode(' ',$msg['msg']);
if ($msg['count'] > -1){
sync($lpath, $url, $path, $ip);
encoder($lpath, $url, $path);
rsync($lpath, $url, $path, $ip);
} else {
sleep(1);
}
}
if (!$connection->disconnect()) {
throw new Exception('Could not disconnect');
}
}

function sync($cpath, $url, $path, $ip) {

if(!file_exists($cpath.'/'.$url)) mkdir($cpath.'/'.$url, 0755, true);


if($url==''){return;}
exec('sudo -S rsync -az user@'.$ip.':'.$cpath.'/'.$url.'/ '.$cpath.'/'.
$url.'/');
}
function rsync($cpath, $url, $path, $ip) {

if(!file_exists($cpath.'/'.$url)) mkdir($cpath.'/'.$url, 0755, true);


if($url==''){return;}
exec('sudo -S rsync -az '.$cpath.'/'.$url.'/ user@'.$ip.':'.$cpath.'/'.
$url.'/');
}
Funz
ionedi
codi
icadeli
lemul
ti
medi
al
eor
igi
nal
ein3f
orma
tis
tandar
d

function encoder($cpath, $url, $path) {

$date = date('y-m-d');
$log=new Logger($cpath.'/log/ffmpeg-calls_'.$date.'.log','a+');
$log->log(date('Y-m-d H:i:s').' > file syncronized for '.$path);
$log->log(date('Y-m-d H:i:s').' > process_start for '.$path);
$info=pathinfo($path);
$input=$cpath.'/'.$url.'/'.$path;
$audio_dir= $cpath.'/'.$url.'/audio/';
$video_dir= $cpath.'/'.$url.'/video/';
$mobile_dir= $cpath.'/'.$url.'/mobile/';
$audio_file= $audio_dir.'AU_'.basename($path,'.'.
$info['extension']).'.mp3';
$video_file= $video_dir.'HD_'.basename($path,'.'.
$info['extension']).'.avi';
$mobile_file= $mobile_dir.'MOB_'.basename($path,'.'.
$info['extension']).'.mp4';
$feed_audio=$cpath.'/rss_audio.php';
$feed_video=$cpath.'/rss_hd.php';
$feed_mobile=$cpath.'/rss_mobile.php';

//Processo audio

$log->log(date('Y-m-d H:i:s').' > process_audio_start for '.$path);


if(!file_exists($audio_dir)) mkdir($audio_dir, 0755, true);
exec('ffmpeg -y -i '.$input.' -acodec libmp3lame -apre audio-fad '.
$audio_file.' 2> '.$cpath.'/log/log'.$path.'audio.txt');
copy($feed_audio, $audio_dir.'rss_audio.php');
$log->log(date('Y-m-d H:i:s').' > process_audio_end for '.$path);

//Processo video

$log->log(date('Y-m-d H:i:s').' > process_video_start for '.$path);


if(!file_exists($video_dir)) mkdir($video_dir, 0755, true);
exec('ffmpeg -threads 4 -y -i '.$input.' -acodec libmp3lame -ab 64k -ar
44100 -vcodec libx264 -dct 4 -bf 2 -g 30 -r 5 -b 336k -s 720x406 -aspect 16:9 -f
avi '.$video_file.' 2> '.$cpath.'/log/log'.$path.'video.txt');
copy($feed_video, $video_dir.'rss_hd.php');
$log->log(date('Y-m-d H:i:s').' > process_video_end for '.$path);

//Processo mobile

$log->log(date('Y-m-d H:i:s').' > process_mobile_start for '.$path);


if(!file_exists($mobile_dir)) mkdir($mobile_dir, 0755, true);
exec('ffmpeg -threads 2 -y -i '.$input.' -acodec libfaac -ar 44100 -ab 64k
-ac 2 -vcodec libx264 -vpre ipod320-fad -crf 1 -r 25 -s 640x360 -aspect 16:9 -f
ipod -vsync 2 '.$mobile_file.' 2> '.$cpath.'/log/log'.$path.'mobile.txt');
copy($feed_mobile, $mobile_dir.'rss_mobile.php');
$log->log(date('Y-m-d H:i:s').' > process_mobile_end for '.$path);
//break;
$log->log(date('Y-m-d H:i:s').' > process_end for '.$path);
$log->log();
}
I
ninel
afunz
ioneperl
aconnes
sionealbr
okerAMQPc
ont
enut
asi
anelc
li
entc
henels
erver
function amqp_connection($login, $pass, $ip) {

$connection = new AMQPConnection();


$connection->setLogin($login);
$connection->setPassword($pass);
$connection->setHost($ip);
$connection->connect();

if (!$connection->isConnected()) {
echo "Cannot connect to the broker";
}
return $connection;
}

Perveri
icar
equanti
cli
entsonoconnes
sials
erver
/br
okerequant
imess
aggisonoincodapront
iper
esser
espedit
ibas
tacoll
egarsi
all
amacchi
nacheospi
tailbr
okeri
nss
hel anc
iar
eilcomando:

pi
ppo@pl
uto#wat
ch-
n1r
abbi
tmqc
tll
is
t_queues

i
lcuiout
putcont
err
àinomedell
ecodeident
iic
atedalnomedelc
li
entc
onnes
soei
lnumer
odei
mess
aggiinc
odapront
iperes
serespedi
ti
.

Li
s t
ingqueues.
..
SC1 3
SC2 4
..
.done.

Potrebbero piacerti anche