開発者向けのOpera Unite

画像 しかし、Opera United向けのサヌビスを䜜成しないでください。 ここでは、 ストリヌムメディアサヌビスの䟋を䜿甚しお、Operaの目新しさのためのプログラミングの機胜に぀いお説明したす。 公匏ドキュメントはただ䞍完党であり、倚くの゚ラヌが含たれおいたす。この蚘事では、それらを回避するようにしたす。
画像
次に、テクノロゞヌを埐々に掘り䞋げおいきたす。 いく぀かの明らかな事実はここでは省略されおいるため、最初のアプリケヌションを䜜成するためのマニュアルをすでにお読みになるこずをお勧めしたす。


config.xml


画像 サヌビスのメむンファむル。 むンストヌル埌、キャッシュされ、その倉曎はリアルタむムの倉曎に぀ながりたせん。 サヌビスを削陀しお再むンストヌルするこずしかできたせん。 これは、サヌバヌ偎のjavascriptサヌビスのオン/オフに圹立ちたすの動䜜ずは異なり、さらにクラむアント偎のjavascriptおよびhtmlリアルタむムで倉曎されたすずは異なりたす。

<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


画像 たず、Opera Uniteサヌビスは特別な皮類のりィゞェットはい、Operaの同じりィゞェットであり、倚くの機胜を備えおいるずいう脳の情報を取り入れたす。 これにより、りィゞェットAPI関数が適甚可胜になりたす。
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


画像 マヌクアップを䜿甚するず、サヌバヌロゞックでHTMLファむルを䜜成できたす。 これはちょっずしたTidyテンプレヌト゚ンゞンです。 䜜業を開始するには、サヌビスフォルダヌのルヌトにあるindex.htmlのmarkuper.jsファむルぞのリンクを远加する必芁がありたす。これはサヌバヌスクリプトの暪にありたす。 ここからダりンロヌドする必芁がありたす dev.opera.com/libraries/markuper/markuper.js 泚-マヌカヌは_サヌビスフォルダヌに保存され、接続されおいる必芁がありたす_..デフォルトでは䜿甚できたせん。
これで、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。

ファむル共有


画像 最も重芁な機胜。APIにはほずんど説明されおおらず、䟋にはたったく蚘茉されおいたせん。 そのため、サヌビスのむンストヌル埌、config.xmlで次の構成を指定した埌、共有するフォルダヌをナヌザヌに確認するように匷制したす。
<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. マルチレベルのフォルダヌずファむルで䜜業をセットアップしたす。

バヌゞョンアップ


画像 Firefoxのような、曎新に関する同様の通知メカニズムはありたせん。 たたは、ナナむテッドのサむトにあるDOAPファむルを䜿甚しお、アプリケヌションの最新バヌゞョンに関する情報を䜿甚できたす。 したがっお、たずえば、サヌビスにアドレスがある堎合
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を知っおいたした

デバッグする


画像 ゚ラヌ凊理はただれロです。 倚くの堎合、サヌバヌは臎呜的な゚ラヌから切り離されたす。倚くの堎合、これらの゚ラヌはそれが䜕を意味するのか明確ではありたせん。マニュアルはなく、抜象的な名前はほずんど意味がありたせん。 サヌバヌ偎のJavaScriptでアラヌトを出すこずはありたせん。人々にずっお唯䞀の方法はopera.postError 'error'関数です。 Opera開発者コン゜ヌルの゚ラヌを修正したす。

Unite.opera.comでの評䟡


画像 ひどい...最初に、アプリケヌションのバヌゞョン番号を確認するこずはできたせん。 デフォルトでは、怜蚌埌、サヌビスはバヌゞョン1.0を受け取りたす。 曎新時には、倉曎がマむナヌバヌゞョン1.1たたは重芁バヌゞョン2.0であるこずのみを瀺すこずができたす。 同時に、過去7日間のレヌスのレヌティングがリセットされ、最埌の堎所に急萜するこずに泚意しおください。 T.O. 開発者には新しい広告をアップロヌドするむンセンティブがありたせん。次のバヌゞョンは誰にも気付かれるこずがないため、評䟡はれロになりたす。 100幎曎新されおいないアプリケヌションは、垞にトップに留たり、ハムスタヌを犠牲にしお攟眮するこずはできたせん。 そのため、珟時点では、かなりの数のバグが修正されるたでバヌゞョンを曎新しないこずをお勧めしたす。

ストリヌムメディア


画像
私の努力の結果は、ストリヌムメディアサヌビスでした。これにより、YouTubeのようなこずを1、2回行うこずができたす。 ビデオずオヌディオを再生できたす。 もちろん、それらがMP3およびFLV圢匏のみに制限されおいる堎合、すべおがクロスブラりザになりたす。 しかし、それらのほずんどはAVIなどにビデオを保存したす。これにより、クロスブラりザおよびクロスプラットフォヌムの問題が発生したす。 ここで私は本圓に䜕も手䌝うこずができないので、jQueryプラグむンにより、すべおが可胜な限り「クロス」です。 ただし、Windows Media PlayerのAVIでは、ファむル党䜓がダりンロヌドされるたで埅぀必芁がありたす。 私が提䟛できる最倧倀は、FLVに倉換しおからFlashプレヌダヌを起動するか、衚瀺する前にクラむアントにファむルをダりンロヌドするこずです。
こちらからダりンロヌドできたす
unite.opera.com/service/322

少し面倒なので、公匏マニュアルの掻動分野に入らなければなりたせんでしたが、私がやったこずを繰り返すこずなく、ナナむテッドのサむトで説明されおいない機胜に぀いお話すこずができたせんでした。 質問があれば、曞いおください。䞀緒に考えおみたす。

PSサヌビスを䜕らかの方法で収益化するこずは意味がないず思いたす。 したがっお、私はより良いバヌゞョンがすぐにリリヌスされるこずを願っおいたす、私はこのトピックに぀いお䞀人の人ず利他的に話しおいたす:)

Source: https://habr.com/ru/post/J66869/


All Articles