PDA

View Full Version : [JAVA] Player di video YouTube


fbcyborg
20-04-2010, 09:00
Salve a tutti,

volevo realizzare un player di video YouTube in un JPanel, ma vedo che ci sono pochissime risorse in giro.
Sto usando Google Data Protocol (http://code.google.com/intl/it/apis/youtube/2.0/developers_guide_java.html) per reperire informazioni su un certo video, ma per il play niente da fare fin'ora, o meglio, la cosa sembrerebbe abbastanza ardua.
Gli unici due documenti che ho trovato fin'ora sono i seguenti:

Swing Youtube Player (http://blogs.sun.com/geertjan/entry/swing_youtube_player)
How to build a Java Swing You Tube Player (http://codes4java.blogspot.com/2009/11/how-to-build-java-swing-you-tube-player.html)

Il primo utilizza una soluzione commerciale, quindi lo scarto.
Il secondo invece fa riferimento proprio alle API della SUN che sembrerebbero avere già la soluzione. Ho provato a compilare la classe FlashPlayer che dicono, ma è un po' un casino per quanto riguarda le librerie da usare, perché non si trovano.

Qualcuno mi può dare un aiuto?

Grazie

lupoxxx87
20-04-2010, 10:06
perchè vuoi incapsulare un video flash in java ?

fbcyborg
20-04-2010, 11:08
Perché vuoi saperlo? È importante per te? :)
Non voglio fare nulla di illegale tranquillo! :)

banryu79
20-04-2010, 11:22
Il secondo invece fa riferimento proprio alle API della SUN che sembrerebbero avere già la soluzione. Ho provato a compilare la classe FlashPlayer che dicono, ma è un po' un casino per quanto riguarda le librerie da usare, perché non si trovano.

Alur :O

Basta che segui passo passo le indicazioni nel blog del tizio che spiega come compilare FlashPalyer.java.

Le librerie che devi aggiungere sono:
* JDICplus.jar
* beansbinding-1.2.1.jar
* JDICplus_native_applet.jar

che trovi nel file zip che contiene i binary, non i sorgenti, nella cartella "lib".

fbcyborg
20-04-2010, 11:30
Ooh! Alleluja, grazie!

Il fatto è che sto su Linux e il mio cervello si rifiutava di scaricare un file contenente la stringa "win32" :D.
Ora me lo compila!

Grazie davvero.

banryu79
20-04-2010, 11:54
Ooh! Alleluja, grazie!

Il fatto è che sto su Linux e il mio cervello si rifiutava di scaricare un file contenente la stringa "win32" :D.
Ora me lo compila!

Grazie davvero.
Prego.
Per curiosità, quando lanci la demo e premi il bottone "sample game (SWF)" il gioco flash ti funziona?

fbcyborg
20-04-2010, 21:33
Scusa il ritardo nella risposta.
Mi ci sono rimesso adesso. Dunque sto avendo un problema a runtime:
Exception in thread "main" java.lang.NoClassDefFoundError: sun/awt/windows/WToolkit
at org.jdic.web.PeerClassFactory.createBrComponentPeer(PeerClassFactory.java:35)
at org.jdic.web.BrComponent.init(BrComponent.java:341)
at org.jdic.web.BrComponent.<init>(BrComponent.java:352)
at org.jdic.web.BrComponent.<init>(BrComponent.java:361)
at FlashPlayer.<init>(FlashPlayer.java:91)
at FlashPlayer.main(FlashPlayer.java:181)
Caused by: java.lang.ClassNotFoundException: sun.awt.windows.WToolkit
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
... 6 more


Mi sa che manca qualche altra libreria.
Che jar manca secondo te?

PGI-Bis
20-04-2010, 22:23
E' una classe del jre di windows (che dipende da una libreria nativa di windows).

A prescindere, l'esempio di quella pagina non è un player di video youtube ma semplicemente un wrapper per il browser web.

Se scarichi JDIC (non plus, quello normale) crei un browser (WebBrowser) lo infili in un JFrame e carichi la pagina web del video (setURL) ottieni lo stesso risultato.

JDIC lo trovi qui:

https://jdic.dev.java.net/servlets/ProjectDocumentList?folderID=9354&expandFolder=9354&folderID=5497

banryu79
21-04-2010, 12:44
A prescindere, l'esempio di quella pagina non è un player di video youtube ma semplicemente un wrapper per il browser web.

Se non sbaglio è un wrapper specifico per IE, giusto?

PGI-Bis
21-04-2010, 12:51
Funziona anche su linux/solaris/osx, non so se si agganci a firefox o mozilla, credo mozilla.

In teoria: non ho mai provato.

banryu79
21-04-2010, 13:02
Funziona anche su linux/solaris/osx, non so se si agganci a firefox o mozilla, credo mozilla.

In teoria: non ho mai provato.
Mi rispondo da solo: (mi riferivo comunque a JDICplus, non a JDIC)

Currently the JDICplus is a Java Win32-extension development kit, enabling developers to use extended Microsoft Windows API functionality. Mainly the project implements the semi-lightweight wrapper component around Microsoft Internet Explorer (IE).

The ideas that were used in embedded IE are very easy:

1. Replace standard paint event handler to synthetic that does nothing, but notifies Java about invalidated area (in WIN32 the subclassing is a good choice).
2. Implement Java repainting procedure for invalidated area based on native browser render. (for IE it is ViewObject->Draw)
3. Implement all DOM/events processing/binding in JavaScript code that is executing in browser engine. That makes functionality of application independent from instance of embedded browser (like SQL hides the differences of relational DB engines).
4. Make callbacks from JavaScript to Java synchronous and easy. The easiest way to do it - change some cross browser string-type property that is not affect the render and has property-change API callback notifier. Window status property (window.status) is a perfect candidate. String type of property makes it easy to transfer as many typified parameters as you like based on XML.


E forse è per questo che a fbcyborg non funzia: non ha Windows sotto i piedi :fagiano:

fbcyborg
21-04-2010, 13:44
E forse è per questo che a fbcyborg non funzia: non ha Windows sotto i piedi :fagiano:

Dannazione! Non ci posso credere!
E quindi non esiste un'alternativa funzionante sotto Linux! Allucinante.

PGI-Bis
21-04-2010, 13:53
Daje. :D Tu prendere WebBrowser di JDIC e usare. :D

Scrivo un programma d'esempio così vediamo subito se funziona anche su linux. Prima però un :coffee:...

fbcyborg
21-04-2010, 13:54
Daje. :D Tu prendere WebBrowser di JDIC e usare. :D
LOL, scusa, ma sono un pò frastornato in queste ore! :D

OK, aspetto l'esempio allora! Goditi il caffè! :) Grazie

PGI-Bis
21-04-2010, 14:45
Allora, passo passo.

Scarica JDIC 0.9.5 cross-platform.zip

https://jdic.dev.java.net/servlets/ProjectDocumentList?folderID=9354&expandFolder=9354&folderID=5497

estrai l'archivio dove vuoi. Nella cartella

"jdic-0.9.5-bin-cross-platform" (quella che contiene i bat)

Ci metti questo esempio:

import java.awt.*;
import java.awt.event.*;
import java.net.*;
import javax.swing.*;
import java.io.*;
import org.jdesktop.jdic.browser.*;

public class YouEmbed implements Runnable {

public static void main(String[] args) {
EventQueue.invokeLater(new YouEmbed());
}

public void run() {
final WebBrowser browser = new WebBrowser();
browser.setPreferredSize(new Dimension(500, 500));
final JTextField field = new JTextField();
final JButton button = new JButton(new AbstractAction("carica") {

public void actionPerformed(ActionEvent e) {
loadVideo(field.getText(), browser);
}
});
JPanel top = new JPanel(new BorderLayout());
top.add(field);
top.add(button, BorderLayout.EAST);
JFrame window = new JFrame("YouEmbed");
window.add(top, BorderLayout.NORTH);
window.add(browser);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.pack();
window.setVisible(true);
}

public void loadVideo(String uri, WebBrowser browser) {
String body = "<object width='480' height='385'><param name='movie' value='$URI'></param><param name='allowFullScreen' value='false'></param><param name='allowscriptaccess' value='always'></param><embed src='$URI' type='application/x-shockwave-flash' allowscriptaccess='always' allowfullscreen='true' width='480' height='385'></embed></object>";
body = "<html><body>" + body.replace("$URI", uri) + "</body></html>";
URL url = generateTemporaryFile(body);
if(url != null) {
browser.setURL(url);
}
}

private URL generateTemporaryFile(String htmlContent) {
URL url = null;
PrintStream out = null;
try {
File temp = File.createTempFile("youembed", "html");
temp.deleteOnExit();
url = temp.toURI().toURL();
out = new PrintStream(temp);
out.print(htmlContent);
out.flush();
} catch(Exception ex) {
ex.printStackTrace();
} finally {
if(out != null) {
out.close();
}
}
return url;
}
}

Compili da console con:

javac -cp .:lib/* -d . YouEmbed.java

ed esegui con:

java -cp .:lib/* YouEmbed

Dovrebbe saltar fuori una finestra tristissima con un campo di testo e un pulsante.

Nel campo di testo incolli la stringa

http://www.youtube.com/v/XyX-KJwUohw

che sarebbe l'indirizzo dell'oggetto flash da incorporare. Premi "carica" e vedi che dice.

Stando alle faq funziona se c'è mozilla (versione antelucana) e potrebbe funzionare con gli altri browser linuxeschi.

fbcyborg
21-04-2010, 17:06
Grazie,

l'ho provato ma quando clicco su carica non mostra nulla e non succede niente; inoltre quando ho lanciato il programma (che è appunto partito senza problemi), ho ottenuto questa eccezione:
Native loader!
java.security.PrivilegedActionException: java.io.IOException: Native resourse [bin/linux/amd64/jdic.so] was not found in JAR.
at java.security.AccessController.doPrivileged(Native Method)
at org.jdesktop.jdic.init.NativeExtractor.loadLibruary(NativeExtractor.java:172)
at org.jdesktop.jdic.init.JdicManager.loadLibrary(Unknown Source)
at org.jdesktop.jdic.browser.WebBrowser.<clinit>(Unknown Source)
at YouEmbed.run(YouEmbed.java:15)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: java.io.IOException: Native resourse [bin/linux/amd64/jdic.so] was not found in JAR.
at org.jdesktop.jdic.init.NativeExtractor.extractBinary(NativeExtractor.java:141)
at org.jdesktop.jdic.init.NativeExtractor$1.run(NativeExtractor.java:174)
... 13 more
isDefaultBrowserMozilla
Exception in thread "EventThread" java.lang.UnsatisfiedLinkError: org.jdesktop.jdic.browser.internal.WebBrowserUtil.nativeGetBrowserPath()Ljava/lang/String;
at org.jdesktop.jdic.browser.internal.WebBrowserUtil.nativeGetBrowserPath(Native Method)
at org.jdesktop.jdic.browser.internal.WebBrowserUtil.getBrowserPath(Unknown Source)
at org.jdesktop.jdic.browser.internal.WebBrowserUtil.getEmbedBinaryName(Unknown Source)
at org.jdesktop.jdic.browser.NativeEventThread.run(Unknown Source)

PGI-Bis
21-04-2010, 17:24
Pure quella c'hai. Eccheccazz... :D

Devi compilare i sorgenti per ottenere le librerie native per amd64.

I sorgenti li trovi nella stessa pagina:

https://jdic.dev.java.net/servlets/ProjectDocumentList?folderID=9354&expandFolder=9354&folderID=0

Qui sembrano esserci delle vaghe istruzioni per la compilazione.

https://jdic.dev.java.net/issues/show_bug.cgi?id=280

Stavo anche pensando che un'altra via potrebbe essere quella di integrare un player javafx però non so se supporta il formato usato da youtube (h123ciapel chel ghè o qualcosa del genere), credo di no per problemi di IP.

fbcyborg
21-04-2010, 17:44
Pure quella c'hai. Eccheccazz... :D
E c'hai ragione!! Porca zozza! :D Solo che sti jar mi hanno fatto impazzire fino ad ora.
Devi compilare i sorgenti per ottenere le librerie native per amd64.
Ok, sono abituato a compilare qualsiasi cosa! :D anche la roba da mangiare, da buon Gentooista! :D
I sorgenti li trovi nella stessa pagina:

https://jdic.dev.java.net/servlets/ProjectDocumentList?folderID=9354&expandFolder=9354&folderID=0

Qui sembrano esserci delle vaghe istruzioni per la compilazione.

https://jdic.dev.java.net/issues/show_bug.cgi?id=280
Esatto, le istruzioni sono molto vaghe. Un ant buildall dovrebbe fare tutto il necessario, peccato che non si compila. Non si compila per lo stesso motivo (http://pastebin.com/6jPR3N3E) che ha riportato il tizio nel commento. Lì dicono di applicare una patch, ma a me sembra che non sia necessaria perché quelle righe sono già in quel file.

Stavo anche pensando che un'altra via potrebbe essere quella di integrare un player javafx però non so se supporta il formato usato da youtube (h123ciapel chel ghè o qualcosa del genere), credo di no per problemi di IP.
Mmmh... c'avevo pensato anche io, dietro consiglio di un utente del forum di html.it (http://forum.html.it/forum/showthread.php?s=&threadid=1366413), ma la cosa sembra piuttosto ardua.

PGI-Bis
21-04-2010, 19:49
L'integrazione è banale (la questione era stata affrontata in un altro thread qui).

Il problema è che.... ma che cacchio di formati supporta il player di javafx? Se carico un avi mi apre un finestrone a parte, così, tanto per gradire. Con gli mp4 mi dice "ma che sei scemo?". Se carico uno swf mi fa una pernacchia...

Ma torniamo a JDIC dico io!

jawt lo trovi in \jdk\include.

Prova a compilare includendo tutto quello che trovi in jdk\include.

PGI-Bis
21-04-2010, 19:54
Frugando in rete ho trovato questo:

http://fr2.rpmfind.net/linux/RPM/mandriva/2010.0/x86_64/media/contrib/release/jdic-0.9.4-0.0.1mdv2009.0.x86_64.html

Apparentemente è un precompilato JDIC a 64 bit. Forse frugando nei repository per la tua distribuzione linux trovi un omologo oppure puoi usare direttamente quello?

fbcyborg
21-04-2010, 19:59
Dunque, mi sa che mi sto confondendo un attimo.
Il problema principale era appunto quella libreria "native-loader" di 4 post fa.
Mi hai detto di compilare i sorgenti, ma ant buildall, mi da quel problema.
OK, provo a ricompilare l'esempietto che mi hai dato tu, YouEmbed, includendo quella dir, ma il suo contenuto è il seguente:
/opt/sun-jdk-1.6.0.19/include/
|-- classfile_constants.h
|-- jawt.h
|-- jdwpTransport.h
|-- jni.h
|-- jvmti.h
`-- linux
|-- jawt_md.h
`-- jni_md.h

Sinceramente mi sto perdendo un attimo. Io sto cercando questa benedetta libreria jdic-native.jar, ma non si trova precompilata e non si riesce a compilare. :help:

Frugando in rete ho trovato questo:

http://fr2.rpmfind.net/linux/RPM/mandriva/2010.0/x86_64/media/contrib/release/jdic-0.9.4-0.0.1mdv2009.0.x86_64.html

Apparentemente è un precompilato JDIC a 64 bit. Forse frugando nei repository per la tua distribuzione linux trovi un omologo oppure puoi usare direttamente quello?
In realtà infatti su gentoo c'è un pacchetto che si chiama dev-java/jdictrayapi-0.9.1-r2, ed è già installato da qualche giorno. Il problema è che non c'è alcuna traccia di alcun jdic-native.jar.

Provo a usare quella che mi hai linkato.

Grazie mille per la pazienza e l'aiuto!

EDIT:
Questi sono i files installati da quel pacchetto:
# equery f jdictrayapi
* Searching for jdictrayapi ...
* Contents of dev-java/jdictrayapi-0.9.1-r2:
/usr
/usr/lib64
/usr/lib64/jdictrayapi
/usr/lib64/jdictrayapi/libtray.so
/usr/share
/usr/share/jdictrayapi
/usr/share/jdictrayapi/lib
/usr/share/jdictrayapi/lib/jdic.jar
/usr/share/jdictrayapi/package.env

PGI-Bis
21-04-2010, 21:31
la trayapi è un altro pezzo di jdic che non ti serve (come sempre capita quando uno ha una cosa e l'altra no, quella che ha è quella che non serve).

A te serve una libreria "jdic.so" a 64 bit, piazzata in

[cartella jdic]\bin\linux\amd64\jdic.so


Se hai jdictrayicon probabilmente nel repository ci sarà anche un jdicbrowser (sempre a 64 bit). Prova a dare un'occhiata.

fbcyborg
21-04-2010, 21:40
No, purtroppo questa jdic.so non riesco a tirarla fuori da nessuna parte.
Non ci sono altri pacchetti jdic* purtroppo, a meno che non esistano degli ebuild "artigianali" per poter installarli lo stesso anche se sono fuori da portage.
Ma fin'ora non ne ho trovato alcuno.

PGI-Bis
21-04-2010, 21:48
prova a usare questo rpm

ftp://fr2.rpmfind.net/linux/Mandriva/official/2010.0/x86_64/media/contrib/release/jdic-0.9.4-0.0.1mdv2009.0.x86_64.rpm

Se lo apri dentro trovi:

1 fie jdic.jar
3 file so in una cartella lib64
1 mozembed-linux-gtk che non so cosa sia.

Metti quei 4 file in una cartella vuota insieme al file YouEmbed.java e da console compila con:

javac -d . -cp .;jdic.jar *.java

poi prova ad eseguire con:

java -Djava.library.path=. -cp .;jdic.jar YouEmbed

Premesso che se ti si fulmina il pc negherò di avertelo mai consigliato, che succede?

fbcyborg
21-04-2010, 22:28
Niente, il problema è sempre quello. Intanto il file jdic.so in quel file rpm non c'è!
Inoltre continua a cercarmelo in bin/linux/amd64/jdic.so, e lo cerca in un jar!
Ma tu riesci a fare qualche prova prima di farlo provare a me?
Ho paura che andando avanti a tentativi in questo modo non andiamo molto lontano! (oh, non fraintendere, ti sono estremamente grato per l'aiuto che mi stai dando, è solo per capire come orientarci meglio)

Forse se ci ributtiamo sulla creazione di quel jar che con ant non riesco a compilare è meglio.. anche se è dura anche quella strada.

fbcyborg
21-04-2010, 22:33
Eloquente questo post (http://routeconverter.com/forum/thread-401-post-2619.html#pid2619) del 2007.
No, the JDIC project is dead. I couldn't compile it on my Ubuntu 9.04 32-bit.

È pur vero che la speranza è l'ultima a morire ma quel messaggio non promette nulla di buono.

tomminno
22-04-2010, 00:40
Scusate se intervengo, ma provare ad integrare VLC?
Ok sembra che anche JVLC sia un binding abbandonato però un tentativo credo possa valere la pena.

fbcyborg
22-04-2010, 08:25
L'idea non sarebbe neanche cattiva. Stavo provando a vedere un video di youtube su VLC, ma mica ci va in play! :( booh, forse sbaglio qualcosa io.

PGI-Bis
22-04-2010, 12:46
Non ho un linux a 64 bit sotto mano, dovrei scaricarlo, installarlo, compilare jdic, dirti che funziona e poi saremmo punto e a capo perchè se funziona a me ma non a te non abbiamo combinato nulla.

Si potrebbe anche pensare di fare un player in java: il formato mp4 sarà pur documentato da qualche parte.

Però è una faccenda che rischia di andare per le lunghe.

fbcyborg
22-04-2010, 16:51
A parte che se funziona a te deve funzionare anche a me, La strada del player java la vedo poco pratica. Non voglio farti perdere troppo tempo, ma una macchina virtuale per fare una prova?

PGI-Bis
22-04-2010, 16:58
Nel solco tracciato dal digital divide io sto dall'altra parte: quella degli sfigati che non hanno l'ADSL.

Non che non abbia anche io la curiosità di vedere un po' 'sta faccenda ma se parto adesso una risposta te la posso dare in 4 giorni :D.

fbcyborg
22-04-2010, 17:00
LOL, mi dispiace... Io per fortuna ce l'ho, ma ho un amico che abita a ridosso del GRA di Roma in PIENA ZONA RESIDENZIALE, e non ce l'ha nemmeno lui. Quindi capisco! :)

Comunque tranquillo, questo lavoro ha una scadenza abbastanza in là nel tempo, quindi volendo 4 giorni posso pure aspettare! :D
(sono un approfittatore!!) :fagiano: :fagiano: :fagiano:

PGI-Bis
23-04-2010, 23:38
Ho installato ubuntu 64 bit.

Le parole non possono esprimere la qualità dell'esperienza che ne ho avuto.

Ma le immagini sì.

http://www.tukano.it/i%20love%20bill.jpg

Sempre sia lodato.

Puoi integrare un browser usando SWT

http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/AnotherSWTBrowserDemo.htm

Funziona anche su ubuntu 64 bit.

fbcyborg
24-04-2010, 09:17
LOL :D

Grazie!

Ma tu che cosa faresti se a runtime dicesse:
Exception in thread "main" java.lang.IllegalArgumentException: Argument cannot be null
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.graphics.ImageLoader.load(Unknown Source)
at org.eclipse.swt.graphics.ImageDataLoader.load(Unknown Source)
at org.eclipse.swt.graphics.ImageData.<init>(Unknown Source)
at org.eclipse.swt.graphics.Image.<init>(Unknown Source)
at SWTBrowserDemo.main(SWTBrowserDemo.java:417)
Forse ci sono problemi con le immagini.

PGI-Bis
24-04-2010, 14:19
Io farei così:

package swingswt;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.Timer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Main implements Runnable {

public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Main());
}

public void run() {
final JTextField urlField = new JTextField();
urlField.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
loadVideo(urlField.getText());
}
});
Canvas canvas = new Canvas();
canvas.setPreferredSize(new Dimension(400, 400));
JFrame window = new JFrame("SWT-Swing Integration Test");
window.add(canvas);
window.add(urlField, BorderLayout.NORTH);
window.pack();
createSWTBrowser(canvas);
window.addWindowListener(new WindowAdapter() {

@Override
public void windowClosing(WindowEvent e) {
e.getWindow().dispose();
}
});
window.setVisible(true);
window.setSize(window.getWidth() + 1, window.getHeight() + 1);
}

private void loadVideo(String url) {
String html = "<object style=\"margin:0px;\" width='480' height='385'>" +
"<param name='movie' value='$URL'></param>" +
"<param name='autoplay' value='true'></param>" +
"<param name='allowFullScreen' value='false'></param>" +
"<param name='allowscriptaccess' value='always'></param>" +
"<embed style=\"margin:0px;\" src='$URL' type='application/x-shockwave-flash' " +
"allowscriptaccess='always' allowfullscreen='false' " +
"width='480' height='385'></embed></object>";
html = html.replace('\'', '"').replace("$URL", url);
PrintStream out = null;
try {
File file = File.createTempFile("video", "html");
file.deleteOnExit();
out = new PrintStream(file);
out.print("<html><body style=\"margin:0px;\"><div style=\"margin:0px;\">" + html + "</div></body></html>");
out.flush();//http://www.youtube.com/v/50Lo7oR9aqU&autoplay=1&border=0&rel=0
browser.setUrl(file.toURI().toURL().toString());
} catch(IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, "", ex);
} finally {
out.close();
}
}

private Display display;
private Timer timer;
private Browser browser;

private void createSWTBrowser(final Canvas canvas) {
display = new Display();
final Shell shell = SWT_AWT.new_Shell(display, canvas);
browser = new Browser(shell, SWT.NONE);
GridLayout grid = new GridLayout();
grid.numColumns = 1;
shell.setLayout(grid);
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
data.grabExcessVerticalSpace = true;
browser.setLayoutData(data);
ActionListener al = new ActionListener() {

public void actionPerformed(ActionEvent e) {
if(!shell.isDisposed()) {
display.readAndDispatch();
} else {
display.dispose();
timer.stop();
}
}
};
timer = new Timer(10, al);
timer.start();
}
}

Meccanicamente funziona, ci vuole qualche ritocco estetico.

fbcyborg
24-04-2010, 17:36
Ottimo, ma te l'hai testato con un video su youtube già? Perché a me da problemi di plugin. Anche se vado sul sito di google non funzia.

Grazie sei un mito ;)

PGI-Bis
24-04-2010, 17:47
Sì, ho provato e funziona (windows + ie). Nota che quel programma non carica una pagina html ma un oggetto swf: come indirizzo devi dargli quello di un swf.

fbcyborg
24-04-2010, 17:57
Qua su Linux non mi funzia. Nemmeno se gli passo un URL ad uno swf diretto. Mi compare sempre un messaggio che dice:
http://i.imgur.com/cABmo.jpg (https://addons.mozilla.org/firefox/1174)
Clicco su OK e non compare nulla.

Comunque ora faccio delle prove su Winzozz. Grazie

PGI-Bis
24-04-2010, 18:02
Ce l'hai il plug-in per flash nel browser?

Tra l'altro, c'è il plug-in flash per Linux a 64 bit?

[Faccio un salto all'età della pietra, provo e ti so dire se funziona]

fbcyborg
24-04-2010, 18:09
Certo che ho il plugin flash su firefox (a 64 bit entrambi!!!)

OK

PGI-Bis
24-04-2010, 19:02
Inspiegabilmente su ubuntu 64 funziona.

Per la verità mi vomita una marea di eccezzioni del runtime GTK (qualcosa che bisognerebbe verificare) però va.

Forse ti prende un browser diverso da firefox? E' possibile?

Prova con gli esempi di questa pagina:

http://www.eclipse.org/swt/snippets/

In particolare i primi due della sezione browser.

fbcyborg
24-04-2010, 19:36
Inspiegabilmente su ubuntu 64 funziona.

Per la verità mi vomita una marea di eccezzioni del runtime GTK (qualcosa che bisognerebbe verificare) però va.
Quelli me li sputa fuori anche a me.
Ora provo su Kubuntu a 64bit. Ho creato un jar file apposta, così lo provo dove voglio. Ah, l'avevo provato anche su Windows 7, ma rompeva le balle sulla JVM a 32 bit... strano anche perché Windows 7 ce l'ho a 64bit su VirtualBox.

fbcyborg
26-04-2010, 14:42
Cercando una cosa per un altro progetto di cui mi sto occupando sono capitato su questa pagina (http://www.antelmann.com/developer/javadoc/com/antelmann/net/JWebBrowser.html). Questa libreria antelmann sembra davvero molto ricca di classi utili!!!
Di sicuro però non funziona il flash player....
Ed anche questo (http://www.jpackages.com/jflashplayer/) mi incuriosisce.

PGI-Bis
26-04-2010, 15:26
Mah, vista da qui quella libreria non mi sembra poi 'sta cornucopia di utilità.

Per il flash player, una soluzione all-java sarebbe preferibile (eventualmente sganciando il quattrino se si tratta di una cosa profescional).

Non è una cosa buona e giusta quel JFlashPlayer: funziona solo su windows, chi l'ha scritto farebbe meglio a dedicarsi a .NET. Uno può avere poca simpatia per altri sistemi operativi ma se scrive un programma Java deve scriverlo per la piattaforma Java, non per windows.

fbcyborg
26-04-2010, 15:32
No vabbè hai ragione. È che in quella libreria ho trovato una classe particolarmente utile in un altro progetto che sto sviluppando, e, avendo visto che ci sono un sacco di altre classi apparentemente utili mi sono fomentato! :D

Per quanto riguarda il flash player è vero, non avevo ancora approfondito. A me sti tizi che scrivono codice Java e non lo rendono portabile mi stanno sulle OO. Java nasce per essere portabile, multipiattaforma e questi che fanno? Mah!

Comunque ciò mi fa ben sperare nella ricerca di un flash player per mandare un video youtube in full screen.

Per la soluzione commerciale non se ne parla, è un progettino universitario e non intendo spenderci un centesimo! :)

PGI-Bis
26-04-2010, 15:47
Per SWT occhio che ci sono versioni diverse per architetture diverse. Se usi un os a 64 bit devi usare l'SWT a 64 bit di quell'OS.

fbcyborg
26-04-2010, 16:32
Eh, sì, quello l'avevo notato!!! :) Grazie

PGI-Bis
26-04-2010, 19:46
OT: quasi quasi se riesco a far andare i DVD 'sta ubuntu me la tengo. Devo solo vedere un attimo come mastica il 3D, ma quasi quasi...

banryu79
27-04-2010, 08:14
OT: quasi quasi se riesco a far andare i DVD 'sta ubuntu me la tengo. Devo solo vedere un attimo come mastica il 3D, ma quasi quasi...
:eek:
Ma.. ma.. ma... non c'è più religione!!!
:D

ally
27-04-2010, 09:27
...se posso dire la mia...cestina plugin e altre amenità su pseudo browser che funzionano solo su cancelli e finestre...pilota mplayer in slave mode da java...nessun cruccio di sorta e digerisci qualsiasi filmato...

...ciao Andrea...

fbcyborg
27-04-2010, 09:36
Non male come idea, grazie! potrebbe andar bene. Come procederesti tu?
Dici di chiamare mplayer invocando, alla pressione di un JButton ad esempio, una riga di comando da Java, del tipo:
mplayer URL_video (a proposito, che tipo di url? rtsp? http?) :confused: :confused:
Pensi che si possa fare l'embed di mplayer in un JPanel? Non è obbligatoria la cosa, ma potrebbe essere carina.

ally
27-04-2010, 09:55
...una cosa così...


package it.ally.mplayer;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;


public class Mplayer {

private static Process proc;
private static Mplayer self;

BufferedReader input;
private OutputStream output;

private String playlist;
private String mplayerPath = "c:/Programmi/mplayer/mplayer.exe";
private String arguments = "-slave -geometry 300x500+0+0 -noborder";

private boolean paused;

private Mplayer(){
self = this;
}

public static Mplayer getInstance(){
return self == null? new Mplayer() : self;
}

public boolean isPlaying(){
try{
proc.exitValue();
return false;
}
catch(IllegalThreadStateException e){
return true;
}
catch(NullPointerException e){
return false;
}
}

public void play(){
try {
proc = Runtime.getRuntime().exec(this.mplayerPath+" "+this.arguments+" "+this.playlist);
this.input = new BufferedReader(new InputStreamReader(proc.getInputStream()));
this.output = proc.getOutputStream();
new Thread(){
public void run(){
String line;
try {
while((line = Mplayer.this.input.readLine()) != null){
if (line.indexOf("Failed to kill")>-1)
System.exit(0);
sleep(10);
}
} catch(Exception e) {
System.out.println(e);
}
}
}.start();
} catch (Exception e) {
System.out.println(e);
}
}

private void sendCommand(String cmd){
try {
if(proc != null){
this.output.write(cmd.getBytes());
this.output.flush();
}
}catch(IOException e) {
System.out.println(e);
}
}

public void stop(){
sendCommand("quit\n");
}

public void seek(int pos, int type){
switch(type){
case 0:
sendCommand("seek "+pos+" 0\n");
break;
case 1:
sendCommand("seek "+pos+" 1\n");
break;
case 2:
sendCommand("seek "+pos+" 2\n");
break;
default: break;
}
this.paused = false;
}

public void pause(){

sendCommand("pause\n");
if(this.paused)
this.paused = false;
else
this.paused = true;
}

public synchronized void upVolume(){

sendCommand("volume +1 [0]\n");
}

public synchronized void downVolume(){

sendCommand("volume -1 [0]\n");
}

public void mute(){

sendCommand("mute\n");
}

public void fullscreen(){

sendCommand("vo_fullscreen\n");
}


public String getPlaylist() {
return this.playlist;
}

public void setPlaylist(String playlist) {
this.playlist = playlist;
}

public static void main(String args[]){

Mplayer mplayer = new Mplayer();
mplayer.setPlaylist("c:/video.mpg");
mplayer.play();
}
}



...ci sono una pletora di comandi passabili in slave mode...il -noborder non funziona sotto linux pero'...quindi se vuoi annegarlo in una finestra swing sotto il pinguino devi smanacciare sulle finestre del desktop o usare amenità in stile devilspie...altro cruccio il controllo volume...funziona bene ma per il massimo controllo è meglio interfacciarsi con il volume master della macchina in questione...sopratutto se vuoi una regolazione fine...

...ciao Andrea...

ally
27-04-2010, 09:57
...qui (http://www.mplayerhq.hu/DOCS/tech/slave.txt) le informazioni necessarie sullo slave mode...si potrebbe ricavare una libreria carina da questo stralcio di codice...so che qualcun'altro si era cimentato con progetto chiamato jmplayer su sourcefrge ma pilotava solo file audio...ah l'implementazione singleton è cestinabilissima...non offendetemi!...

...ciao Andrea...

fbcyborg
27-04-2010, 09:59
Grazie, ma una cosa:
non accetta URL diretti da youtube, in modo che li possa mandare "in streaming"? O meglio, in buffering come avviene sul sito?

Perché ho visto che tu gli passi un file .mpg, e io non ne ho a disposizione uno.

ally
27-04-2010, 10:13
...dovresti interccetare l'url dell'flv...mplayer digerisce il formato senza grossi crucci...

...ciao Andrea...

fbcyborg
27-04-2010, 10:18
Perfetto, vedo che gli URL rtsp come questo (rtsp://v1.cache3.c.youtube.com/ClMLENy73wIaSgmqC-vd5Ze4bBMYDSANFEIKdGVzaW5hLXBzZEgGUghzdGFuZGFyZHIhARwch9gplq7Ie2vQcN0qGQ8O88HsQjpE1a8d1GxQnGDmDA==/0/0/0/video.3gp) se li prende tranquillamente.

Provo!

fbcyborg
27-04-2010, 13:08
Ciao,
-noborder pare che funzioni benissimo sotto Linux!
Ora voglio capire come integrarlo in un JPanel. Risolto questo ho svoltato!

Grazie!

ally
27-04-2010, 13:12
Ciao,
-noborder pare che funzioni benissimo sotto Linux!
Ora voglio capire come integrarlo in un JPanel. Risolto questo ho svoltato!

Grazie!

...no border non son riuscito a farlo funzionare...metodi alternativi ci sono...come appunto devilspie ma diventerebbe una soluzione improponibile da distribuire...se risolvi fammi sapere...è un argomento che interessa anche al sottoscritto...

...ciao Andrea...

fbcyborg
27-04-2010, 20:28
Ok, ma forse non ho capito bene.
A te non funziona il noborder o hai problemi con l'integrazione?

Per quanto riguarda la portabilità in questo caso per me non è un problema. L'applicazione che devo fare non c'è bisogno che soddisfi requisiti di portabilità.
Comunque, già che usi mplayer la portabilità viene meno. Nel senso che costringi comunque l'utente a installare mplayer. Invece sarebbe opportuno, in tale ottica, usare un player "che te lo porti dietro" con l'applicazione.

Comunque, a parte questo, dici che è un casino fare l'embed di mplayer all'interno del jpanel? Se ho capito bene, è un casino anche farlo con devilspie che in realtà non conosco.

ally
28-04-2010, 07:55
...utilizzare mplayer non è limitatante visto che sotto il pinguino è di facile istallazione e su win puo' essere integrato come singolo eseguibile...per quanto riguarda il noborder so che sotto gnome non funziona...l'uso di devilspie comporta la creazione di un profilo per la finestra di mplayer legato ad ogni utente della macchina...in sinto devilspie dice al desktop manager di non usare i bordi quando il processo ha un determinato nome (mplayer) o di eseguire altre operazioni sul focus o sulle dimensioni sulla grafica del programma intercettato...alla fine della fiera non è assolutamente un cruccio integrarlo in un jpanel...sotto linux mi pare sia possibile modificare la geometry al volo durante l'esecuzione e quindi inseguire la finestra in cui è annegato nel caso questa venisse spostata...

...ciao Andrea...

fbcyborg
28-04-2010, 08:49
Ah, ecco perché, io uso KDE! :D :cool:
Avevo capito che devilspie fosse per integrarlo nel JPanel. Quindi non mi resta che capire quali siano le istruzioni per inserirlo direttamente nel JPanel.

Per quanto riguarda i bordi non c'è problema, li posso mettere a dimensione fissa. Per le mie esigenze va più che bene anche così. Non devo perderci troppo tempo.

fbcyborg
28-04-2010, 10:32
Per il momento ho collegato il lancio di mplayer all'actionPerformed di un JButton e mi compare una finestra che manda il video in play.
Tutto OK, ma non capisco perché mandando in play url tipo questo:
rtsp://v2.cache4.c.youtube.com/ClELENy73wIaSAmU-Vq_NfPG1xMYDSANFEIKdGVzaW5hLXBzZEgGUgZ2aWRlb3NyIQEcHIfYKZauyHtr0HDdKhkPDvPB7EI6RNWvHdRsUJxg5gw=/0/0/0/video.3gp
molti video (la maggior parte) sono senza audio.
Io userei anche un URL ad un file flv, ma credo non sia possibile realizzare lo streaming.

ally
28-04-2010, 10:55
...mi dispiace ma non sono un guru di filmati in streaming...a naso sospetto un problema di codec...ma da totale ignorante in materia...come quando una macchina non funziona...a naso penso sia il motore...

...ciao Andrea...

fbcyborg
28-04-2010, 10:56
Ah! ho capito.. :) LOL

Infatti ecco cosa accade se vado da riga di comando!
Opening audio decoder: [ffmpeg] FFmpeg/libavcodec audio decoders
Cannot find codec 'libopencore_amrnb' in libavcodec...
ADecoder init failed :(
ADecoder init failed :(
Cannot find codec for audio format 0x726D6173.
EDIT:Risolto!
Ho ricompilato mplayer e ffmpeg con il supporto amr, ed ora i video si sentono tutti.

PGI-Bis
28-04-2010, 13:09
Far partire il player esterno è ultra-cheap.

Frugando e rifrugando ho trovato una libreria

http://djproject.sourceforge.net/ns/

Qui su ubuntu 64 funziona egregiamente (anche se impiega qualche secondo a caricarsi).

package testplayer;

import chrriis.dj.nativeswing.swtimpl.NativeInterface;
import chrriis.dj.nativeswing.swtimpl.components.JFlashPlayer;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main implements Runnable {

public static void main(String[] args) {
NativeInterface.open();
EventQueue.invokeLater(new Main());
NativeInterface.runEventPump();
}

public void run() {
JFlashPlayer player = new JFlashPlayer();
JPanel panel = new JPanel(new BorderLayout());
panel.add(player);
JFrame window = new JFrame("Test");
window.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
window.add(panel);
window.setSize(400, 400);
window.setVisible(true);
player.load("http://www.youtube.com/v/XyX-KJwUohw");
}
}

Oltre allo zip devi scaricare swt per il tuo so. Al progetto aggiungi DJNativeSwing.jar, DJNativeSwing-SWT.jar, swt.jar e jna-3.0.7.jar e sei a posto. C'è anche un player video, JVLCPlayer, che funziona allo stesso modo.

ally
28-04-2010, 13:33
...quel progettino fa cose decisamente degne di nota...sopratutto per il controllo browser e flash...ci avevo smanacciato diversi mesi fa ma sotto linux non ero riuscito a farlo fungere...

...ciao Andrea...

fbcyborg
28-04-2010, 13:40
La cosa sembrerebbe molto interessante!!!

Ma ci risiamo:
http://i.imgur.com/zZkEi.jpg (https://addons.mozilla.org/firefox/1174)

Ma che diavolo è sta cosa?
Perché a voi non succede?

PGI-Bis
28-04-2010, 13:43
Potrei buttar lì un "hai XULRunner installato?" ma è come se io dicessi "apperipicchio punzi punzi" perchè 'sto XULRunner non so cosa sia. Mi pare di aver letto tuttavia che serva per questo genere di integrazioni.

fbcyborg
28-04-2010, 13:45
Certo! Ce l'ho installato. Quando compili/installi mozilla firefox si tira dietro xulrunner, quindi è tutto ok!
Però vedo che nel mio caso il supporto java è disabilitato. Quindi provo a ricompilarlo con tale supporto attivo e ti faccio sapere.

Grazie! ;)

fbcyborg
28-04-2010, 13:54
Niente da fare, non era quello il problema.
Se clicco su OK, mi si apre un browser (JWebBrowser) alla pagina di adobe dove si scarica il plugin.
Per l'appunto, questo "mini browser" dove dovrebbe apparire il video non mi vede il plugin flash. Ma non saprei come farglielo vedere.
Non so se bisogna importare qualche directory dove c'è il file .so del plugin (libflashplayer.so), ma la cosa non mi convince molto.

PGI-Bis
28-04-2010, 15:41
A parte firefox hai altri browser? Magari mozilla (esiste ancora?)

fbcyborg
28-04-2010, 15:46
No solo Mozilla Firefox.
(C'è Konqueror ma quello è di base con KDE)

Comunque nel frattempo mi sto installando Ubuntu a 64 bit in una macchina virtuale. Così provo anche io.

fbcyborg
28-04-2010, 16:39
Ho provato il browser anche su Ubuntu, ed effettivamente funziona!
Devo capire cosa diavolo manca qui sulla mia Gentoo. Il plugin flash funziona...

fbcyborg
28-04-2010, 19:28
Scusa, una curiosità: questo URL come l'hai ricavato?
http://www.youtube.com/v/XyX-KJwUohw
Stavo cercando di capire come fare tramite le API di YouTube ma al massimo riesco ad ottenere l'URL classico, e due tipi di URL rtsp. Ma quello fullscreen non lo trovo.

PGI-Bis
28-04-2010, 20:41
Ho fatto un copia e incolla di un pezzo dell'url. Mi pare che sia il valore dell'attributo "video".

fbcyborg
28-04-2010, 20:51
Mah, tipicamente gli url dei video hanno questa forma: http://www.youtube.com/watch?v=-iMRoxmgCd4 .. tu da dove l'hai preso quell'URL? Tramite le API di google/youtube?

PGI-Bis
28-04-2010, 21:46
Ho detto URL? Volevo dire "codice che salta fuori premendo il pulsante embed sotto al player di youtube".

<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/IlWDJQXeihg&hl=en_US&fs=1&"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/IlWDJQXeihg&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>

fbcyborg
28-04-2010, 21:48
Aaah, giusto OK!
Il fatto comunque è che io gli URL li prendo grazie alle API YouTube.
Fino ad ora non sono ancora riuscito a trovare un metodo java di quelle API che mi restituisca l'URL del video in full screen.

PGI-Bis
28-04-2010, 22:05
In una connessione "normale" direi che il valore che cerchi sia quello dell'attributo "v". Cioè questo:

http://www.youtube.com/watch?v=IlWDJQXeihg&feature=related

Sarebbe:

"http://www.youtube.com/v/IlWDJQXeihg

Magari ci sono metodi più raffinati ma se mancano, un bel colpo di clava e via!

fbcyborg
28-04-2010, 22:54
Mmh.. forse bisogna usare qualche espressione regolare o non so..
Al limite la cosa la si può approfondire in seguito, quando sarò riuscito a capire perché non mi funziona quel Flash Player su Gentoo.

fbcyborg
12-05-2010, 13:44
Finalmente ho capito perché non funzionava il JFlashPlayer su Gentoo.
In pratica xulrunner non vedeva il plugin poiché mancava un link simbolico.

Quindi la soluzione è questa:
ln -s /opt/netscape/plugins/libflashplayer.so /usr/lib/xulrunner-1.9.2/plugins/

Che faticaccia!

ally
12-05-2010, 14:28
...molto interessante...grazie per la segnalazione...

...ciao Andrea...

fbcyborg
12-05-2010, 16:36
Prego, comunque questa libreria da un sacco di problemi.
Ho spostato quel codice postato da PGI-Bis sul notebook (stessa architettura, stesse versioni di java, stessa distribuzione) e non funziona.
Da sempre problemi con una variabile d'ambiente che non è settata (MOZILLA_FIVE_HOME).
L'errore preciso è:
Failed to create chrriis.dj.nativeswing.swtimpl.components.NativeWebBrowser[1,1670109169]

Reason:
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
java.lang.reflect.InvocationTargetException
org.eclipse.swt.SWTError: No more handles [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)]
La cosa assurda è che sul mio Desktop PC funziona anche senza specificare quella variabile (malgrado alcuni crash della macchina virtuale, dei quali ho già aperto dei bug report sul sito della SUN).

Inoltre, ho trovato qualche soluzione, ma non sempre funziona, ovvero fare l'export di quella variabile e dargli la home di xulrunner.

banryu79
12-05-2010, 17:15
L'errore preciso è:
Failed to create chrriis.dj.nativeswing.swtimpl.components.NativeWebBrowser[1,1670109169]

Reason:
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
java.lang.reflect.InvocationTargetException
org.eclipse.swt.SWTError: No more handles [Unknown Mozilla path (MOZILLA_FIVE_HOME not set)]

La cosa assurda è che sul mio Desktop PC funziona anche senza specificare quella variabile (malgrado alcuni crash della macchina virtuale, dei quali ho già aperto dei bug report sul sito della SUN).

Immagino ci avrai già sbattuto parecchio la testa, ma la sparo lo stesso:
hai già provato a fare una ricerca su Google con la stringa "org.eclipse.swt.SWTError: No more handles" per vedere se scopri qualcosa di strano?
Quel "no more handles" puzza di resource leak...

fbcyborg
12-05-2010, 17:27
Certo, ovviamente ho cercato.

La cosa che ha fatto sì che casualmente, quel codice funzionasse per una ed una sola volta sul mio notebook è stata questa (https://www.jfire.org/modules/phpwiki/index.php/HowToSetupTheIntegratedBrowserOnLinux):
export MOZILLA_FIVE_HOME=/usr/lib/xulrunner-1.9.2
Dopo di che ho potuto lanciare il jar che avevo creato per fare le prove e vedere il video.

Da Eclipse non ne parliamo nemmeno.
Invece sul fisso, funziona sia da eclipse che da riga di comando, a parte il fatto che ogni volta mi viene creato un file hs_err_pidXXXXX.log nella root del progetto, e l'ho segnalato alla SUN con un bug report.

Di resource leak non ne so nulla sinceramente!