

次ã«ããã¯ãããžãŒãåŸã ã«æãäžããŠãããŸãã ããã€ãã®æãããªäºå®ã¯ããã§ã¯çç¥ãããŠãããããæåã®ã¢ããªã±ãŒã·ã§ã³ãäœæããããã®ããã¥ã¢ã«ããã§ã«ãèªã¿ã«ãªãããšããå§ãããŸãã
config.xml
<widget network="public private">
<widgetname>Stream media</widgetname>
<description>Stream media online from your own computer with Opera Unite! Audio, video and etc.</description>
<author>
<name>avenu</name>
<organisation></organisation>
</author>
<feature name="http://xmlns.opera.com/webserver">
<param name="type" value="service"/>
<param name="servicepath" value="stream"/>
</feature>
<feature name="http://xmlns.opera.com/fileio">
<param name="folderhint" value="home" />
</feature>
</widget>
ãããã¯ãŒã¯=ãŠã£ãžã§ããã¿ã°ã®ããããªãã¯ãã©ã€ããŒããå±æ§ã«æ³šæããŠãã ãã-å€éšãµã€ãã§äœæ¥ããå Žåã¯æå¹ã«ããããšããå§ãããŸãã AJAXã®æ©èœã«ãããç°¡åãªæ¹æ³ã§ãããã«æ¥ç¶ã§ããªãããšã«æ³šæããŠãã ããã ãã ãããã®å±æ§ã䜿çšãããšããŠã£ãžã§ããèªäœã¯ãµãŒããŒäžã®åãAJAXã䜿çšããŠã€ã³ã¿ãŒãããã«æ¥ç¶ã§ããŸãã
ããã«ããã¡ã€ã«I / O APIã¯æ¬¡ã®å Žæã«æ¥ç¶ãããŠããŸãã
<feature name="http://xmlns.opera.com/fileio">
<param name="folderhint" value="home" />
</feature>
ãããŠããµãŒãã¹ã¢ãã¬ã¹ãã©ã®ããã«èŠãããïŒ
<param name="servicepath" value="stream"/>
Javascript
Javascriptã¯ãµãŒããŒãšã¯ã©ã€ã¢ã³ãã«åãããŠããŸãã Opera Unitedã®ãã¹ãŠã®ããžãã¯ã¯ãµãŒããŒã«ç»é²ãããŸãïŒPHP / Ruby / Python /ã®é¡äŒŒç©ãèæ ®ããŠãã ããïŒãã¯ã©ã€ã¢ã³ãã§ã¯ãŠãŒã¶ãŒãèŠããµã€ãã®ããžãã¯ãå®è£ ãããŸãã ããšãã°ãjQueryã䜿çšã§ããŸãã Uniteã®HTMLã¯ãMVCããã®ãã¥ãŒã«äŒŒãŠããŸãïŒããããããµãŒããŒåŽã®JavaScriptã¯ã³ã³ãããŒã©ãŒã«é¡äŒŒããŠããŸãïŒã ãŠãããã¯ãã¹ã¯ãªããããæž¡ãããå€æ°ã«å¿ããŠHTMLãçæããŸãã
ãããã£ãŠãã¯ã©ã€ã¢ã³ãã¹ã¯ãªãããCSSããã¡ã€ã«ã¯ããã©ã«ããã©ã«ããŒpublic_htmlã«é 眮ãããŸãã ãµãŒããŒã¹ã¯ãªãããšHTMLã¯ä»»æã®ãã©ã«ããŒã«é 眮ã§ããŸããããããžã®ãã¹ã¯èªåã§æå®ããŸãã ãããè¡ãã«ã¯ãã«ãŒãã§ãå°æ¥ã®æ§æãã¡ã€ã«ã®æšªã«ãindex.htmlãã¡ã€ã«ãäœæãããã¿ã€ãã®æ§é ã瀺ããŸãã
<!DOCTYPE html>
<script src="script/markuper.js"></script>
<script src="script/functions.js"></script>
<script src="script/operafunctions.js"></script>
<script src="script/script.js"></script>
åŸã§ããŒã¯ã¢ããã¡ã«ããºã ã䜿çšããŠHTMLãæ¥ç¶ããŸãã
次ã«ãäœæããæ¥ç¶ãããjavascriptã®1ã€ïŒããšãã°ãã¹ã¯ãªãããã©ã«ããŒããscript.jsïŒã§ããµãŒããŒã®ã€ãã³ãããªã³ã«ããåŠçãæ¥ç¶ããã¹ã¯ãªããã«ãªã¯ãšã¹ãåŠçïŒURLïŒãè¿œå ããŸãã
window.onload = function ()
webserver = opera.io.webserver
if (webserver)
{
//Handle requests for various URLs
webserver.addEventListener('_index', showEntryList, false);
webserver.addEventListener('shared', download, false);
}
}
_indexã¯ããµãŒãã¹ã®éå§ããŒãžã®èå¥åã§ãã ãã®ååã¯ããã©ã«ãã§ãã äžèšã®ã«ãŒãã¢ã¯ã»ã¹ã³ãŒãã§ã¯ãshowEntryListé¢æ°ãåŒã³åºãããŸãã åæ§ã«ãããŠã³ããŒãæ©èœãžã®åŒã³åºããè¿œå ããŠãã¿ã€ã/ãµãŒãã¹å/å ±æ/ bla / bla / blaã®ã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ããUnitedã®ãã¡ã€ã«å ±æã®æ©èœã解決ããŸããã
é¢æ°ã§ã¯ãEventåã®å€æ°ã䜿çšã§ããããããããŸããŸãªäŸ¿å©ãªãªããžã§ã¯ããååŸã§ããŸãã
var response = e.connection.response;
var request = e.connection.request;
ãã ããã°ããŒãã«ãªãã©ãªããžã§ã¯ãã䜿çšããŠRequestãªããžã§ã¯ããŸãã¯Responeãªããžã§ã¯ããååŸã§ããŸãããããã«ã¢ã¯ã»ã¹ããæç¹ã§ãRequestã¯æ¢ã«æ°ããå¯èœæ§ããããŸãã
opera.io.webserver.connections.request
opera.io.webserver.connections.response
Requestã䜿çšããŠãGET / POSTïŒããããïŒãªã¯ãšã¹ãããããŒã¿ããã«ã§ããŸãïŒ
var index = request.queryItems['id'][0];
var password = request.bodyItems.passwords[0];
å¿çã¯ããŠãŒã¶ãŒçšã®ããŒãžãçæããŸãã
response.write( '<!DOCTYPE html>'
+ '<html><head><title>Entries</title></head>'
+ '<body><ul>'
);
ãã ããããã¯HTMLãæäœããæã䟿å©ãªæ¹æ³ã§ã¯ãããŸããã ããŒã¯ã¢ããã¡ã«ããºã ãæ€èšããŠãã ããã
HTML
ããã§ãindex-template.htmlãªã©ã®ãã³ãã¬ãŒããã¡ã€ã«ãäœæãããã³ãã¬ãŒããªã©ã®ã«ãŒãïŒãŸãã¯ããæ·±ãïŒã®ãã©ã«ããŒã«è¿œå ã§ããŸãã ã¹ã¯ãªããã§ã¯ãæ°ããMarkaperãªããžã§ã¯ãã¯æ¬¡ã®ããã«ãªããŸãã
var template = new Markuper( 'templates/index-template.html');
ãã¡ã€ã«èªäœã¯æ¬¡ã®ããã«ãªããŸãã
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Tutorial</title>
</head>
<body>
<h1>{{name}} Tutorial</h1>
<p>
This variable is further down the data object hierarchy:
'{{further.down.the.hierarchy}}'
</p>
</body>
</html>
{{path.to.variable}}ã¯ãããããã£ã«ããå€æ°ã®ãã¹ã§ãã 次ã®ãããªã¹ã¯ãªããããæž¡ããŸãã
function handleRequest( event )
{
var response = event.connection.response;
var data =
{
name : 'Template',
further : {down: {the : {hierarchy: 'yes it is!' } } }
};
var template = new Markuper( 'templates/tutorial.html', data );
response.write( template.parse().html() );
response.close();
}
MarkaperïŒtemplate.parseïŒïŒã解æãããªããžã§ã¯ããHTMLã«å€æããå¿ èŠãããããšã«æ³šæããŠãã ããïŒtemplate.parseïŒïŒãHtmlïŒïŒã
ãã¡ã€ã«å ±æ
<feature name="http://xmlns.opera.com/fileio">
<param name="folderhint" value="home" />
</feature>
homeã¯ããã£ã¹ã¯äžã®ãŠãŒã¶ãŒãã©ã«ããŒã§ãïŒDocuments and Settings / userãªã©ïŒã ãã©ã«ããŒã®ä»ã®äŸã¯APIã«ãããŸãã ãã ãããã©ã«ããŒãžã®ãã¹ãæå®ããããšã¯ã§ããŸããã ã¯ãã¹ãã©ãããã©ãŒã ãããªãã¯ç¥ã£ãŠããŸãã
ãããå°é£ã®å§ãŸãã§ãã ãã©ã«ããŒã¯å ±æãããŠããŸããããã¡ã€ã«ã¯ãããŸããïŒïŒïŒã éæ¥çã«ãŠãã€ãããã«ããã¥ã¢ã«ããå察ãç¶ããŸããã ãã¡ã€ã«ãå ±æããªããã°ãªããªãããšã«å ããŠãå¥ã®åé¡ããããŸãã ãµãŒãã¹ãäžå®å®ãªãããäžåºŠå ±æããããã¡ã€ã«ãã»ãã·ã§ã³äžã«å ±æããããšããäºå®ã«äŸåããããšã¯äžå¯èœã§ãã ãããã£ãŠããªã¯ãšã¹ããå©çšå¯èœã«ãªã£ããšãã«ãã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ãåŠçããããšããå§ãããŸãã ãŠãŒã¶ãŒããã¡ã€ã«ãèŠæ±ããŸãã-å ±æãããŠã³ããŒã-å ±æã®ã¹ããŒã¿ã¹ãååŸããŸããã æ®å¿µãªãããæ¢åã®unshareFileé¢æ°ãshareFileé¢æ°ã¯ãæ¢ã«å ±æãããŠããªããã¡ã€ã«ãŸãã¯å ±æãã¡ã€ã«ãé©å®ã¹ãªãããããšèŽåœçãªãšã©ãŒãã¹ããŒããŸãã ã€ãŸã 2åã®å ±æã¯æ©èœããªããã®ã§ã¯ãªããæ©èœããªããµãŒããŒãåãåããŸãã
å ±æãã©ã«ããŒã«ã¯ãšã€ãªã¢ã¹ãå ±æãããŠããŸãã ããã«å ããŠãã¢ããªã±ãŒã·ã§ã³ïŒãµãŒãã¹ãã©ã«ããŒïŒãã¹ãã¬ãŒãžïŒãµãŒãã¹ããŒã¿ã«å²ãåœãŠããããã©ã«ããŒïŒããããŸãã ãµãŒããŒã«å ±ææ¥ç¶ããŸãïŒ
window.onload = function () {
webserver = opera.io.webserver;
if (webserver)
{
opera.io.filesystem.mountSystemDirectory('shared');
webserver.addEventListener('shared', download, false);
webserver.addEventListener('_index', showEntryList, false);
}
}
ãµãŒããŒãšãµãŒãã¹ããªã³ã«ããåŸãå ±æãã©ã«ããŒãããŠã³ãããŸãã äžèšã®Operaã®äžå®å®æ§ãèæ ®ãããšããµãŒããŒããªã¯ãšã¹ããæåã§åŠçããããšããå§ãããŸãã
次ã«ãããŠã³ããŒãæ©èœèªäœãäœæããŸãã
function download(e) {
var req = e.connection.request;
var res = e.connection.response;
var mp = opera.io.filesystem.mountPoints;
var filePath = fullPathWithoutServiceName(req.uri);
var file = mp.resolve(filePath);
if(file.exists) {
if(file.isFile) {
opera.io.webserver.shareFile( file, filePath );
res.closeAndRedispatch();
opera.io.webserver.unshareFile(file);
}
if(file.isDirectory) {
//deep inside... folders, folders, folders. total commander :)
showEntryList(e);
res.closeAndRedispatch();
}
}
else {
res.closeAndRedispatch();
}
res.close();
}
ããã§é·ãéåæ¢ããããšã¯ãããŸãããAPIé¢æ°ã®ååãããã¹ãŠãã»ãŒæããã§ãã urlã®ãµãŒãã¹åã®åŸã«ãã¹ãããŠã³ãããŸãã fullPathWithoutServiceNameã¯ãèªåã§äœæããé¢æ°ãURL解æã§ãã ãã¡ã€ã«ãå®éã«ååšããå Žåã¯ãããããã©ã«ããŒã§ããããããã§ãã³ã°ã¢ãŠãããŠããã ããã確èªããŸãã ãã©ã«ããŒã®å ŽåãshowEntryListãã³ãã©ãŒã«ã¢ã¯ã·ã§ã³ãæž¡ããŸãããã®ãã³ãã©ãŒã¯ããã£ã¬ã¯ããªå ã®ãã¡ã€ã«ãšãã©ã«ããŒã®ãªã¹ãã衚瀺ããã ãã§ãã ãã¡ã€ã«ã®å Žåããã¡ã€ã«ãå ±æããæ綱ããµãŒããŒã«è»¢éããæ»ã£ããšãã«ãã¡ã€ã«ããæš©å©ã奪ããŸãã ãã¡ã€ã«åã衚瀺ããåã«ããã¹ãŠã®æåãããã§ãšã³ã³ãŒããããŠããããšã«æ³šæããŠãã ããã衚瀺ããåã«ãããããunescapeé¢æ°ã§ã©ããããå¿ èŠããããŸãã ãã以å€ã®å ŽåãæãåçŽãªå Žåããã¡ã€ã«åã®ã¹ããŒã¹ã®ä»£ããã«ããŠãŒã¶ãŒã«ã¯ïŒ 20ã衚瀺ãããŸãã
closeAndRedispatché¢æ°ã䜿çšããŠããµãŒããŒã«é¢æ°ãè¿ããäœæ¥ãç¶è¡ããŸãã T.O. ãã«ãã¬ãã«ã®ãã©ã«ããŒãšãã¡ã€ã«ã§äœæ¥ãã»ããã¢ããããŸãã
ããŒãžã§ã³ã¢ãã
unite.opera.com/service/322
次ã«ããã®DOAPãã¡ã€ã«ã¯æ¬¡ã®å Žæã«ãããŸãã
unite.opera.com/service/doap/322
ããã¯ãã¬ãŒã³XMLã§ããããã解æããŠããŒãžã§ã³ã確èªãããããã¢ãããŠã£ã³ããŠã«ãããã¢ããããããšãææ¡ã§ããŸãã åŠçäŸã次ã«ç€ºããŸãã
function getLastVersion() {
try {
var req = new XMLHttpRequest();
req.onreadystatechange = function(x) {
if (this.readyState == 4) {
if(this.status == 200) {
var xml = this.responseXML;
var release = xml.getElementsByTagName('release').item(0);
var version = release.getElementsByTagName('Version').item(0);
var revision = version.getElementsByTagName('revision').item(0).firstChild.data;
var lastCheckedVersion = getLastCheckedVersion();
if(revision && lastCheckedVersion && revision!=lastCheckedVersion) {
widget.showNotification("New version "+revision+" is available. Click here to update.", function() {
widget.openURL(globalSettings.url);});
setLastCheckedVersion(revision);
} } } };
req.open('GET', globalSettings.doap);
req.send(null);
}
catch(e) {
}
}
function getLastCheckedVersion() {
return widget.preferenceForKey('last_checked_version');
}
function setLastCheckedVersion(version) {
widget.setPreferenceForKey(version, 'last_checked_version');
}
å€éšãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ã䜿çšãããããšã«æ³šæããŠãã ãã;åè¿°ã®ããã«ãconfig.xmlãä¿®æ£ããå¿ èŠããããŸãã
URL unite.opera.com/service/322ã¯ãçè«çã«ã¯ããµãŒãã¹ãã£ã¬ã¯ããªãã¢ã¿ããããŠconfig.xmlãã¡ã€ã«ã«ç§»åããããšã§èªåçã«ååŸã§ããŸããããã¯ãIDã®åœ¢åŒã§URLãå ¥åããå Žæã§ãã ããããç§ã¯ãããæãäžããããã«ç ŽãããŸããã誰ããã³ãŒããæžããŠéããããç§ã¯ããããã§ã:)ãããŠããã®é¢æ°ãæžãããæãŸã§ã«ãç§ã¯ãã§ã«ãã®URLãç¥ã£ãŠããŸãã
ãããã°ãã
Unite.opera.comã§ã®è©äŸ¡
ã¹ããªãŒã ã¡ãã£ã¢
ç§ã®åªåã®çµæã¯ãã¹ããªãŒã ã¡ãã£ã¢ãµãŒãã¹ã§ãããããã«ãããYouTubeã®ãããªããšã1ã2åè¡ãããšãã§ããŸãã ãããªãšãªãŒãã£ãªãåçã§ããŸãã ãã¡ãããããããMP3ããã³FLV圢åŒã®ã¿ã«å¶éãããŠããå Žåããã¹ãŠãã¯ãã¹ãã©ãŠã¶ã«ãªããŸãã ãããããããã®ã»ãšãã©ã¯AVIãªã©ã«ãããªãä¿åããŸããããã«ãããã¯ãã¹ãã©ãŠã¶ããã³ã¯ãã¹ãã©ãããã©ãŒã ã®åé¡ãçºçããŸãã ããã§ç§ã¯æ¬åœã«äœãæäŒãããšãã§ããªãã®ã§ãjQueryãã©ã°ã€ã³ã«ããããã¹ãŠãå¯èœãªéããã¯ãã¹ãã§ãã ãã ããWindows Media Playerã®AVIã§ã¯ããã¡ã€ã«å šäœãããŠã³ããŒãããããŸã§åŸ ã€å¿ èŠããããŸãã ç§ãæäŸã§ããæ倧å€ã¯ãFLVã«å€æããŠããFlashãã¬ãŒã€ãŒãèµ·åãããã衚瀺ããåã«ã¯ã©ã€ã¢ã³ãã«ãã¡ã€ã«ãããŠã³ããŒãããããšã§ãã
ãã¡ãããããŠã³ããŒãã§ããŸãïŒ
unite.opera.com/service/322
å°ãé¢åãªã®ã§ãå ¬åŒããã¥ã¢ã«ã®æŽ»ååéã«å ¥ããªããã°ãªããŸããã§ããããç§ããã£ãããšãç¹°ãè¿ãããšãªãããŠãã€ãããã®ãµã€ãã§èª¬æãããŠããªãæ©èœã«ã€ããŠè©±ãããšãã§ããŸããã§ããã 質åãããã°ãæžããŠãã ãããäžç·ã«èããŠã¿ãŸãã
PSãµãŒãã¹ãäœããã®æ¹æ³ã§åçåããããšã¯æå³ããªããšæããŸãã ãããã£ãŠãç§ã¯ããè¯ãããŒãžã§ã³ãããã«ãªãªãŒã¹ãããããšãé¡ã£ãŠããŸããç§ã¯ãã®ãããã¯ã«ã€ããŠäžäººã®äººãšå©ä»çã«è©±ããŠããŸã:)