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)
BereichMethodeParameterRückgabe
Storagestorage.set(key, value)String, String
storage.get(key)StringString | null
storage.remove(key)String
storage.keys()String[]
DOMdom.ready(callback)Function
dom.addStyle(css)StringHTMLElement
dom.injectScript(src)StringHTMLElement
dom.waitFor(selector, callback, timeout?)String, Function, Number
HTTPhttp.get(url, callback)String, Function(err, text)
http.getJSON(url, callback)String, Function(err, data)
Pagepage.urlString
page.domainString
page.titleString
Logginglog(msg)String
warn(msg)String
error(msg)String
SeleneBridge (Browser-Level, asynchron via QWebChannel)
BereichMethodeParameterRückgabe
TabscurrentTabInfo(){url, title, iconUrl}
navigate(url)String
BookmarksaddBookmark(url, title)String, StringBoolean
removeBookmark(url)StringBoolean
isBookmarked(url)StringBoolean
listBookmarks()[{url, title, folder}]
HistorysearchHistory(query, limit)String, Number[{url, title, timestamp, visitCount}]
recentHistory(limit)Number[{url, title, timestamp, visitCount}]
addHistoryEntry(url, title)String, String
SettingsgetSetting(key, default)String, StringString
setSetting(key, value)String, String
getBoolSetting(key, default)String, BooleanBoolean
setBoolSetting(key, value)String, Boolean
ThemecurrentTheme()String
Notificationsnotify(title, message)String, String
Browser InfobrowserInfo(){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.

Plugin SDK Guide Browser Übersicht
Wuppertaler Tafel AllOne The Outpace - Band Homepage