Selene Plugin API
Vollständige Referenz aller verfügbaren API-Bereiche für Selene Browser Plugins
Übersicht: Zwei API-Objekte
| Objekt | Verfügbarkeit | Zweck |
|---|---|---|
window.SelenePlugin |
Sofort (kein Channel nötig) | DOM, Storage, HTTP, Logging — läuft direkt in der Seite |
window.SeleneBridge |
Asynchron (via QWebChannel) | Browser-Interna: Tabs, Bookmarks, History, Settings, Theme, Notifications |
⚠ Wichtiger Hinweis: SeleneBridge wird über QWebChannel geladen und ist nicht sofort verfügbar. Verwende den waitForBridge Pattern:
SelenePlugin.dom.ready(function() {
function waitForBridge(callback) {
if (window.SeleneBridge) {
callback();
} else {
setTimeout(function() { waitForBridge(callback); }, 50);
}
}
waitForBridge(function() {
var info = SeleneBridge.browserInfo();
console.log(info.name, info.version);
});
});
1. SelenePlugin (Seiten-Level API)
1.1 Storage — Persistenter Key-Value Store
Plugin-spezifischer Storage, isoliert von anderen Plugins und der Website.
// Wert speichern
SelenePlugin.storage.set('darkMode', 'true');
// Wert lesen
var value = SelenePlugin.storage.get('darkMode'); // → "true" oder null
// Wert löschen
SelenePlugin.storage.remove('darkMode');
// Alle Keys auflisten
var keys = SelenePlugin.storage.keys(); // → ["darkMode", "fontSize", ...]
Bereich: localStorage mit Prefix selene_plugin_ — isoliert pro Plugin.
1.2 DOM — DOM-Manipulation
// Warten bis DOM bereit ist
SelenePlugin.dom.ready(function() {
// Code läuft wenn DOM geladen ist
});
// CSS injizieren
SelenePlugin.dom.addStyle('body { background: #0a0a1a !important; }');
// Externes Script laden
SelenePlugin.dom.injectScript('https://cdn.example.com/lib.js');
// Auf Element warten (pollt bis es erscheint)
SelenePlugin.dom.waitFor('.player-container', function(el) {
console.log('Player gefunden:', el);
}, 15000); // Timeout: 15 Sekunden (default: 10s)
1.3 HTTP — Netzwerk-Anfragen
// Text herunterladen
SelenePlugin.http.get('https://api.example.com/data', function(err, text) {
if (err) { SelenePlugin.error('HTTP Fehler: ' + err); return; }
console.log('Antwort:', text);
});
// JSON herunterladen
SelenePlugin.http.getJSON('https://api.example.com/data', function(err, data) {
if (err) { SelenePlugin.error('JSON Fehler: ' + err); return; }
console.log('Daten:', data);
});
1.4 Page — Seiten-Informationen
var url = SelenePlugin.page.url; // "https://www.youtube.com/watch?v=..."
var domain = SelenePlugin.page.domain; // "www.youtube.com"
var title = SelenePlugin.page.title; // "Video Title - YouTube"
1.5 Logging — Konsolen-Ausgabe
SelenePlugin.log('Normale Nachricht');
SelenePlugin.warn('Warnung!');
SelenePlugin.error('Fehler!');
Erscheint im Browser-Log mit Prefix [Selene Plugin].
2. SeleneBridge (Browser-Level API)
Alle Methoden sind synchron (Q_INVOKABLE) und geben Werte direkt zurück.
2.1 Tabs — Aktuellen Tab steuern
// Aktuelle Tab-Info abrufen
var info = SeleneBridge.currentTabInfo();
// → { url: "https://google.com", title: "Google", iconUrl: "..." }
// Zu einer URL navigieren (lädt im aktuellen Tab)
SeleneBridge.navigate('https://www.youtube.com');
2.2 Bookmarks — Lesezeichen verwalten
// Lesezeichen hinzufügen
var added = SeleneBridge.addBookmark('https://example.com', 'Example Site');
// → true wenn hinzugefügt, false wenn bereits vorhanden
// Lesezeichen entfernen
var removed = SeleneBridge.removeBookmark('https://example.com');
// → true wenn entfernt, false wenn nicht vorhanden
// Prüfen ob URL bereits gebookmarkt ist
var exists = SeleneBridge.isBookmarked('https://example.com');
// → true / false
// Alle Lesezeichen auflisten
var bookmarks = SeleneBridge.listBookmarks();
// → [{ url: "...", title: "...", folder: "..." }, ...]
Bereich: Browser-Lesezeichen (gespeichert in ~/.selene/bookmarks.wlb).
2.3 History — Verlauf durchsuchen
// Verlauf durchsuchen
var results = SeleneBridge.searchHistory('youtube', 20);
// → [{ url: "...", title: "...", timestamp: 1691612345000, visitCount: 5 }, ...]
// Letzte Einträge abrufen
var recent = SeleneBridge.recentHistory(10);
// → [{ url: "...", title: "...", timestamp: ..., visitCount: 1 }, ...]
// Verlauf-Eintrag hinzufügen
SeleneBridge.addHistoryEntry('https://example.com', 'Example');
Bereich: Browser-Verlauf (gespeichert in ~/.selene/browser.wlb).
2.4 Settings — Browser-Einstellungen lesen/schreiben
// String-Einstellung lesen
var homepage = SeleneBridge.getSetting('homepage', 'https://google.com');
// String-Einstellung setzen
SeleneBridge.setSetting('homepage', 'https://youtube.com');
// Boolean-Einstellung lesen
var darkMode = SeleneBridge.getBoolSetting('dark_mode', false);
// → true / false
// Boolean-Einstellung setzen
SeleneBridge.setBoolSetting('dark_mode', true);
Bereich: Browser-Einstellungen (gespeichert in ~/.selene/settings.wlb). Plugins können eigene Settings hier speichern (mit Plugin-Name als Prefix empfohlen).
2.5 Theme — Aktuelles Theme abfragen
var theme = SeleneBridge.currentTheme();
// → "cyberpunk" | "light" | "custom_theme_name"
2.6 Notifications — Benachrichtigungen anzeigen
SeleneBridge.notify('Plugin geladen', 'YouTube Dark Mode ist aktiv!');
Zeigt eine Benachrichtigung im Browser-UI an (Status-Bar / Toast).
2.7 Browser Info — Browser-Metadaten
var info = SeleneBridge.browserInfo();
// → { name: "Selene", version: "1.0.0", displayName: "Selene", organization: "Selene" }
console.log('Browser:', info.name, 'v' + info.version);
3. Plugin-Manifest (plugin.json)
{
"name": "Mein Plugin",
"version": "1.0.0",
"description": "Beschreibung",
"author": "DeinName",
"main": "main.js",
"enabled": true,
"match": [
"https://*.youtube.com/*",
"*://*.google.com/*"
]
}
| Pattern | Bedeutung |
|---|---|
*://*.google.com/* | Alle Google-Subdomains, jedes Protokoll |
https://youtube.com/* | Nur HTTPS, genau youtube.com |
*://*/* | Jede Seite (Vorsicht: läuft überall!) |
https://*/* | Jede HTTPS-Seite |
4. Vollständiges Beispiel: YouTube Enhancement
plugin.json
{
"name": "YouTube Enhancer",
"version": "1.2.0",
"description": "Dark Mode + Auto-Skip Ads + Bookmark Videos",
"author": "Selene Community",
"main": "main.js",
"match": ["https://*.youtube.com/*"]
}
main.js
SelenePlugin.dom.ready(function() {
// 1. Dark Mode CSS injizieren
SelenePlugin.dom.addStyle('ytd-app { background: #0f0f0f !important; }');
// 2. Plugin-Storage: Einstellungen lesen
var skipAds = SelenePlugin.storage.get('skipAds') !== 'false';
// 3. Auto-Skip Ads (DOM-Level)
if (skipAds) {
setInterval(function() {
var skipBtn = document.querySelector('.ytp-ad-skip-button');
if (skipBtn) {
skipBtn.click();
SelenePlugin.log('Ad skipped');
}
}, 1000);
}
// 4. Bridge: Browser-Info abrufen
function waitForBridge(cb) {
if (window.SeleneBridge) cb();
else setTimeout(function() { waitForBridge(cb); }, 50);
}
waitForBridge(function() {
// 5. Bridge: Bookmark aktuellen Tab
var info = SeleneBridge.currentTabInfo();
SelenePlugin.log('Running on: ' + info.url);
// 6. Bridge: Notification anzeigen
SeleneBridge.notify('YouTube Enhancer', 'Plugin aktiv auf ' + info.title);
// 7. Bridge: Theme prüfen
var theme = SeleneBridge.currentTheme();
SelenePlugin.log('Current theme: ' + theme);
// 8. Bridge: Setting speichern
SeleneBridge.setSetting('yt_last_visit', info.url);
});
// 9. DOM: Auf Video-Player warten und modifizieren
SelenePlugin.dom.waitFor('video', function(video) {
SelenePlugin.log('Video element found');
});
});
5. API-Übersichtstabelle
SelenePlugin (Seiten-Level, sofort verfügbar)
| Bereich | Methode | Parameter | Rückgabe |
|---|---|---|---|
| Storage | storage.set(key, value) | String, String | — |
storage.get(key) | String | String | null | |
storage.remove(key) | String | — | |
storage.keys() | — | String[] | |
| DOM | dom.ready(callback) | Function | — |
dom.addStyle(css) | String | HTMLElement | |
dom.injectScript(src) | String | HTMLElement | |
dom.waitFor(selector, callback, timeout?) | String, Function, Number | — | |
| HTTP | http.get(url, callback) | String, Function(err, text) | — |
http.getJSON(url, callback) | String, Function(err, data) | — | |
| Page | page.url | — | String |
page.domain | — | String | |
page.title | — | String | |
| Logging | log(msg) | String | — |
warn(msg) | String | — | |
error(msg) | String | — |
SeleneBridge (Browser-Level, asynchron via QWebChannel)
| Bereich | Methode | Parameter | Rückgabe |
|---|---|---|---|
| Tabs | currentTabInfo() | — | {url, title, iconUrl} |
navigate(url) | String | — | |
| Bookmarks | addBookmark(url, title) | String, String | Boolean |
removeBookmark(url) | String | Boolean | |
isBookmarked(url) | String | Boolean | |
listBookmarks() | — | [{url, title, folder}] | |
| History | searchHistory(query, limit) | String, Number | [{url, title, timestamp, visitCount}] |
recentHistory(limit) | Number | [{url, title, timestamp, visitCount}] | |
addHistoryEntry(url, title) | String, String | — | |
| Settings | getSetting(key, default) | String, String | String |
setSetting(key, value) | String, String | — | |
getBoolSetting(key, default) | String, Boolean | Boolean | |
setBoolSetting(key, value) | String, Boolean | — | |
| Theme | currentTheme() | — | String |
| Notifications | notify(title, message) | String, String | — |
| Browser Info | browserInfo() | — | {name, version, displayName, organization} |
6. Plugin-Verzeichnis
~/.selene/plugins/
├── yt-enhance/
│ ├── plugin.json
│ └── main.js
├── dark-mode/
│ ├── plugin.json
│ └── main.js
└── ad-blocker-extra/
├── plugin.json
├── main.js
└── styles.css
Jeder Ordner = ein Plugin. Der Ordnername wird als Plugin-ID verwendet.
7. Plugin hochladen (Plugin Store)
Plugins können über den Browser (Menu → Plugins → Upload) oder via API hochgeladen werden:
POST https://rl-dev.de/api/browser/plugins
Content-Type: multipart/form-data
Authorization: Bearer <token>
Fields:
name: Plugin-Name
description: Beschreibung
version: 1.0.0
category: productivity
file: plugin.zip (enthält plugin.json + main.js)
Andere User können Plugins dann über den Plugin Store herunterladen und installieren.