Load! Plugin-Entwicklung

Mit Version 3 unseres Plugin-Systems haben wir uns nun dazu entschlossen, es offen zu legen, sodass nun jeder Plugins entwickeln kann. Vorraussetzung dafür ist Kenntnis einer Sprache, die native Windows-DLLs erzeugen kann (C/C++/Delphi) – Die Beispiel-Plugins und die folgenden Deklarationen sind in Pascal(Delphi) geschrieben.

Das meiste dürfte aus den Beispiel-Plugins (Hoster Filemonkey.in (aufwändiger), Sockshare.com (einfacher), NCrypt.in (Decrypter)) ersichtlich werden: http://www.candisoft.com/downloads/Example_Plugins.zip

Es folgen Erklärungen zu einzelnen Methoden der Interfaces.

Die Bibliothek selbst muss drei Funktionen exportieren:
CreateInstance – Erstellt ein LoadPlugin Objekt und gibt es als Interface zurück.

GetCapabilities – Gibt einen TCapabilities record zurück, siehe Beispiel-Plugins. 0 bei den Max-Werten bedeutet unendlich, IsMultiHost sollte immer False sein (wäre für Geschichten wie SpeedLoad etc.).

GetHostFilter – Gibt den Filter zurück, der auf alle Links, die das Plugin behandeln soll, anwendbar sein muss. Dies kann auch ein regulärer Ausdruck sein, in diesem Fall muss das erste Zeichen des Strings ein \ sein.

Download-Plugins müssen folgende Methoden implementieren:

procedure Init(Ifc: IDownload); stdcall;
Übergibt dem Plugin das Interface, um mit Load! zu kommunizieren.

function GetFileInfo(Link: WideString): IFileInfo; stdcall;
Ermittelt Dateiname und Größe (in Bytes) für einen Link.

function GetFileInfoMulti(Links: ICSList): IFileInfos; stdcall;
Ermittelt Datei-Informationen für mehrere Links auf einmal.

procedure Download(Link: WideString); stdcall;
Kostenloser Download des Links

procedure Premium(Link, Username, Password: WideString); stdcall;
Downloaden des Links mit einem Premium-Account

function GetAccountInfo(Username, Password: WideString): TAccountInfo; stdcall;
Informationen über einen Account abholen, z.B. Gültigkeitsdauer und verbleibender Traffic

function CheckFile(Contents: WideString): Boolean; stdcall;
Wird aufgerufen, wenn die Datei kleiner als 30 KB ist, um zu prüfen ob evt. eine HTML-Fehlerseite vom Hoster zurückkam. False als Ergebnis bedeutet, dass ein Fehler aufgetreten ist. In diesem Fall muss die Routine auch RestartLink aufrufen.

Nun zum IHTTP-Interface. Dieses bildet die Grundlage für sowohl IDownload als auch IDecrypt.

function Captcha(Link: WideString; Cookie: WideString = ”; Referer: WideString = ”;
Description: WideString = ”): WideString; stdcall;

Zeigt ein Captcha an. Description sollte nur gesetzt werden, wenn unklar ist, was eingegeben/angeklickt werden muss. Um ein anklickbares Captcha zu zeigen, muss als Description point@:beschreibungstext übergeben werden.

function HTTP: IHTTPClient; stdcall;
Liefert ein IHTTPClient-Interface, welches erweiterte Manipulation des Clients ermöglicht. So kann GetCurrentHeaders benutzt werden, wenn bei einem Captcha-Download ein Cookie mitgeliefert wurde, SetCustomHeader fügt den nächsten Requests den angegeben Header hinzu und RawRequest kann benutzt werden, wenn exotische Schutzmaßnahmen umgangen werden müssen, für die die normale HTTP-Unterstützung nicht ausreicht.

function HTTPRequest(Link: WideString; Cookie: WideString = ”; Referer: WideString = ”; PostParams: WideString = ”; AllowRedirect: Boolean = True): THTTPResult; stdcall;
Selbsterklärend. Ist PostParams leer, wird ein GET-Request durchgeführt.

function IsStopped: Boolean; stdcall;
Gibt an, ob der Benutzer Stop gedrückt hat, um die Bearbeitung eines Links abzubrechen.

procedure Log(Msg: WideString; Debug: Boolean = False); stdcall;
Log-Einträge zum Finden von Fehlern. Debug sollte immer False sein, denn sonst wird die Nachrichten nur in nicht-öffentlichen Debug-Builds von Load! ausgegeben.

function Password: WideString; stdcall;
procedure RestartLink; stdcall;
function Tools: ITools; stdcall;

Selbsterklärend.

Methoden von IDecrypt:

procedure AddContainer(Link, Extension: WideString; Cookie: WideString = ”;
Referer: WideString = ”); stdcall;

Lädt einen Container herunter und fügt ihn ein. Extension kann .dlc, .rsdf oder .ccf sein.

function MirrorSelect(Mirrors: ICSList): TMirrorSelection; stdcall;
Zeigt ein Mirror-Auswahl Fenster mit den angegeben Hoster-Namen an. Zurückgegeben wird ein record, in dem der Name und Index (von 0 an gezählt, -1 = Stoppen).

procedure Progress(Current, Max: Integer; Info: WideString = ”); stdcall;
Zeigt den Fortschritt der Entschlüsselung an. Info kann z.B. ein Name des Inhalts, der entschlüsselt wird, sein. Ansonsten wird der Link angezeigt.
In der Unit Tools findet man viele kleine Hilfsfunktionen, vor allem für Strings. Desweiteren ist dort die Klasse TCSList deklariert, eine String-Liste, in die weitere Hilfsfunktionen gekapselt sind. Sinn der Sache ist einfach, dass keine der großen Standard-Units (Classes usw.) eingebunden werden muss, welche die Dateigröße jedes Plugins verdoppeln oder sogar verdreifachen würde.

Natürlich beantworten wir gerne Fragen zur Pluginentwicklung – diese einfach in der passenden Sektion im Forum posten. Wahlweise können dort auch geschriebene Plugins veröffentlicht, ansonsten gibt es private Nachrichten. Wenn das Plugin auf den Updateserver veröffentlich werden soll, muss der Sourcecode an uns weitergereicht werden, sodass wir überprüfen können, ob das Plugin neben seiner Hauptfunktion keine “bösen Sachen” macht.

Deutsch