Linksammler Pakete mit allen Informationen exportieren und wieder importieren
Hier mein Roman .
Folgendes ist gegeben:
- Windows Server 2016 auf meinem billig Server (der nur zum Downloaden oder Filme schauen an ist)
- Weitere Rechner (jeweils mit JDownloader ausgestattet) im Netzwerk
- Rechner haben Zugriff auf freigegebene Ordner
Was möchte ich:
Da mein Server rechts langsam ist würde ich gerne in JDownloader auf einem anderen Rechner meine Links sammeln und die Pakete organisieren. Diese dann mit all den Daten (Paketname(n),jeweiligen Link(s),Downloadverzeichnis(se)) exportieren und in Jdownloader auf dem Server importieren.
MyJdownloader gibt mir leider nicht die gesamte Pracht des JDownloader und all seinen Funktionen wieder und reagiert zudem nicht so schnell wie ich es mir wünsche. Liegt wohl dadran, dass mein Server nicht der schnellste ist (1. oder liegt das wo anders? [z.B. 4 Sekunden bis Linksammler geladen ist])
Möglichkeiten die mir einfallen:
- 2. selber ein Java Programm schreiben mit der MyJdownloader API
Kann ich das so umsetzten, dass ich von meinem Rechner mit dem Javaprogramm übers Netzwerk den JDownloader auf dem Server steuern kann?
Also: (PC: Java Client) => (Netzwerk) => (Server: JDownloader)
oder muss das so: (PC: Java Client) => (Netzwerk) => (Server: Java Server) => (Server: JDownloader)
- 3. Über WinRS/WinRM oder PowerShell oder SSH auf den Server Verbinden und Jdownloader mit meinen Daten füttern (mit automatisierte Batch Datei zb) (Find grade nichts zu JDownloader CLI)
-4.FolderWatch und EventScripter verwenden. Bin ich aktuell auch dran. Scheitere leider bereits am Anfang...
5. Welche Möglichkeiten habe ich noch? 6. Welche Möglichkeiten wäre am besten/einfachsten umzusetzen?
Ich nehme mal an mit FolderWatch und EventScripter kommt ich schnell an mein Ziel. Nun brauch ich dort aber Hilfe :D.
7.Problem:
An dem Beispiel crwaljob hier
Spoiler:
Code:
#this is a property file format. You can put all these entries in a jsonarray [{..},{...}] as well.
#save this as myFile.crawljob
#Start a new entry with anything but a comment (#...) or key=. An empty line would be ok as well
->NEW ENTRY<-
chunks=0
#a comment
extractPasswords=["Password1","Password2"]
enabled=null
text=**External links are only visible to Support Staff** packageName=MyPackageName
autoStart=TRUE
extractAfterDownload=UNSET
downloadFolder=null
priority=DEFAULT
forcedStart=UNSET
downloadPassword=null
#use only if text contains one single link
filename=null
overwritePackagizerEnabled=TRUE #ANGEPASST
comment=null
autoConfirm=UNSET
deepAnalyseEnabled=false
addOfflineLink=true
->NEW ENTRY<-
#properties that are not required can be ignored. This is absolutly fine:
text=**External links are only visible to Support Staff**
Kommt nun das bei raus:
Spoiler:
Wie bring ich beide Links in das Paket "MyPackageName"?
Den Ordner Video wurde vom meim Packagizer erstellt.
Aber OverridePackagizer = TRUE ...
Fällt mir gerade beim schreiben auf: Ein guter Ansatz ist bestimmt beide links in einer Entry unterzubringen.
Spoiler:
Code:
text="**External links are only visible to Support Staff**,"**External links are only visible to Support Staff**
Code:
text=**External links are only visible to Support Staff**text=**External links are only visible to Support Staff**
Geht beides ned. HILFE :D
Nebenbei versteh ich ned ganz was die Aussage "#use only if text contains one single link" meint. Bezieht sich diese nur auf filename?
So damit bin ich erst mal fertig mit meinem Post. Einmal durchlesen, verdauen und wieder auskotzen bitte.
Noch kleine Anmerkung: Habs wirklich versucht klein zu halten
Die einfachste Lösung. Mit JDownloader X sammeln und organisieren. Die Links im Linksammler behalten. Danach X beenden und die Datei cfg/linkcollectorXY.zip nehmen und diese dann via LadeContainer im JDownloader Y laden und voila, die Links tauchen nun im Linksammler von Y auf Ich denke das ist genau das, wonach du gesucht hast
Wenn ich neue Links hinzufüge, dann dauerts etwa ca 10 sek und dann ist ein neues linkcollectorXY.zip erstellt.
EDIT:
So ein rießen Text und so ne kleine Antwort.
EDIT2:
Gibts ne Möglichkeit um mein Linksammler mit der linkcollectorXY.zip zu vergleichen?
Vergleiche solange bis Linksammler == neuster linkcollectorXY
Danach weiß ich, dass das aktuelle linkcollectorXY.zip wirklich das richtige ist.
EDIT3:
Wenn nicht mach ichs so:
Nach drücken meines EventScriptButtons
1.Lösche alle linkcollectorXY.zip.
2.Füge Dummy link in Linksammler.
3.Sobald Datei linkcollector*.zip existiert dann kopiere wohin ich will
.
.
.
Letzter Schritt importiere: Wenn importiert, dann lösche Dummy
Frage is nur, wenn ich über EventScripter ein Link hinzufüge, ob dass das Event auslöst um eine neue linkcollectorXY.zip zu erstellen.
EDIT4:
Kann man mit EventScripter überhaupt Links hinzufügen o.O?
Finde leider nichts dazu in der Hilfe beim EventScripter.
Jede Änderungen im Linksammler wirft das *verzögerte* Speichern an Also egal ob manuell via Gui oder über API oder über Eventscripter
Das Delay kannst du via Einstellungen-Profieinstellungen- MinimumSaveDelay und MaximumSaveDelay selbst festlegen
Kann man mit EventScripter überhaupt Links hinzufügen o.O?
Finde leider nichts dazu in der Hilfe beim EventScripter.
Ja, hier am besten mgpai fragen (auf English). Er ist unser Eventscript Meister
Oder du suchst einfach nach seinen Posts und findest evtl schon was fertiges/brauchbares
Kann man mit EventScripter überhaupt Links hinzufügen o.O?
Finde leider nichts dazu in der Hilfe beim EventScripter.
Ja. Man nutzt per EventScripter dann die callAPI.
Beispiel:
Code:
var link = "http://jdownloader.org/download/index"; // Specify URL to be added
callAPI("linkgrabberv2", "addLinks", {
"deepDecrypt": true,
"links": link
});
Oder eine Textdatei mit mehreren Links wäre auch denkbar:
Code:
var myfile = JD_HOME + "/mylinks.txt"; // Full path to text file containing the urls
callAPI("linkgrabberv2", "addLinks", {
"deepDecrypt": true,
"links": readFile(myfile)
});
__________________
Join 9kw.eu Captcha Service now and let your JD continue downloads while you sleep.
Also habs jetzt über FolderWatch gelöst.
Hatte mit mgpai auch andere Ansätze umgesetz aber die hatten so Ihre Nachteile.
Version 1 mit mgpai: Manuelles exportieren mittels DLC erstellen. Und manuelles importieren dieser DLC. Probleme hier waren, dass man den DownloadFolder und das ExtractPassword nicht mitnehmen konnte. Das hatten wir über den Paketnamen behoben. Bsp: Terminator#Filme#password. Das war mir aber noch viel zu viel Aufand da ich alles selber machen musste (Export Import).
Version 2 mit mgpai: EventScripter kopiert linkCollector.zip in ShareOrdner. Server sucht alle 10 sek nach neuer Datei in diesem Ordner. Dann startet eine externe Batch und Jdownloader schließt sich. Die Batch löscht vorhandene linkCollector.zips im cfg Ordner und kopiert die neuen rein. Danach wird Jdownloader wieder gestartet.
Nachteile: Jdownloader muss neugestartet werden, bereits vorhandene Daten im LinkCrawler würden gelöscht.
Aktuelle Version 3 ganz alleine: Makiere Pakete die exportiert werden sollen. Rechtsklick -> Export to Server. Dies erstellt ein CrawlerJob für makierte Pakete. Hab das aber auf archivdateien beschränkt. Andere Dateien sind so klein die lad ich gleich direkt mit meim PC.
Hier mal das Script:
Spoiler:
Code:
if (name == "Export to Server") {
var folderWatchPath = "Z:\\.jdownloader\\.share\\"; //Change path if you like
var packages = lgSelection.getPackages();
var hasOnlyArchives = true;
var crawlerEntrys = [];
for (var i = 0; i < packages.length; i++) {
package = packages[i];
var links = package.getDownloadLinks();
var linksText = "";
var password = null;
for (var j = 0; j < links.length; j++) {
linksText += links[j].getUrl() + ",";
var archive = links[j].getArchive();
if (archive == null) hasOnlyArchives = false;
else if (archive.getInfo().passwords.length != 0) password = archive.getInfo().passwords[0];
}
crawlerEntrys.push(createCrawlerEntry(package.getName(), linksText, package.getDownloadFolder(), password));
}
if (hasOnlyArchives) {
crawlerJob = "";
for (var i = 0; i < crawlerEntrys.length; i++) {
entry = crawlerEntrys[i];
crawlerJob += entry + "\r\n\r\n";
}
var filePath = folderWatchPath + "exportJob.crawljob";
var file = getPath(filePath);
if (file.exists()) file.delete();
writeFile(filePath, crawlerJob, false);
} else alert("Supports Only Archive Files");
}
function createCrawlerEntry(packageName, linksText, downloadFolder, password) {
var job = "->NEW ENTRY<-\r\n";
var newLine = "\r\n";
if (password != null) job += "extractPasswords=[\"" + password + "\"]" + newLine;
job += "packageName=" + packageName + newLine;
job += "text=" + linksText + newLine;
job += "downloadFolder=" + downloadFolder + newLine;
job += "autoStart=TRUE" + newLine;
job += "extractAfterDownload=TRUE" + newLine;
job += "overwritePackagizerEnabled=TRUE" + newLine;
job += "deepAnalyseEnabled=FALSE" + newLine;
job += "autoConfirm=TRUE";
return job;
}
Es gab zudem ein weiteren Grund warum ich das auf Archive beschränke.
Ich verwende die link.getUrl() methode um die links für den Job zu generieren.
Bei YouTube bräuchte ich aber die link.getContentURL() denn sonst werden andere Links beim Import generiert und nicht die eigentlichen Links die ich über YouTube laden wollte. Naja wie gesagt das ist eines der kleinen Dateien die ich sowieso über mein PC lade.
Ein würde mich dennoch interessieren, beim .crawljob um alle links in ein Paket zu bekommen mache ich das aktuell so:
text=link1,link2,link3,...
aber sollte man, dass so machen?
ich würde eigentlich denken, dass text= nur für einen Link gedacht ist.
Aber anderst sehe ich keine Möglichkeit alles in einem Package zu bekommen.
Zudem Verbessungsvorschläge für das Script sind gern gesehen
Du kannst die linkCollector.zip auch als Container (via Script,Folderwatch) laden lassen Dann importiert der JDownloader die Datei in Linksammler oder DownloadListe.
du kannst im CrawlJob einen Paketnamen definieren "packageName", dann wandern die Links in ein entsprechend benanntes Paket
Du kannst die linkCollector.zip auch als Container (via Script,Folderwatch) laden lassen
Leider fragt mich Jdownloader dann beim Import, ob ich diese Dateien impotieren möchte. Das sollte er aber ohne Nachfrage machen. Das wäre besonders problematisch, wenn ich im Headless Modus laufen lasse.
Quote:
Originally Posted by Jiaz
du kannst im CrawlJob einen Paketnamen definieren "packageName", dann wandern die Links in ein entsprechend benanntes Paket
Ok hätte genauer sein sollen:
sieht aktuell so aus:
Frage ist, soll "text=" mehrere Links enhalten oder sollte es so ein:
text=link1
NEW ENTRY
text=link2
NEW ENTRY
...
Wenn es nach dem Schema seien sollte, dann weiß ich nicht wie man alles in ein Paket bekommt.
Aber nach meinem Schema geht es ja
Da ich über crawljob das Problem mit dem URL / ContentURL habe, kann ich die Abfrage beim Import der zip umgehen? z.b. so:
crawljob:
text=file://D:\filecollector1023.zip
**External links are only visible to Support Staff**Wie funktioniert FolderWatch auf Synology
Nach dem Thread sollte dies ja möglich sein. Bei mir läd er aber dann die zip oder dlc direkt ohne "entpacken" in den Linksammler
Wenn ich über mein Script ein CrawlerJob erstellen lasse, dann weiß ich nicht wann ich getUrl() oder getContentURL() oder eines der anderen Möglichkeiten verwenden soll.
Wenn ich z.B. von filecrypt ein Paket im Linksammler habe, dann ist der ContentURL der link zu filecript (blöd, denn nach Import über crawljob kommt ein Captcha dadruch). Der Url geht direkt zu ShareOnline. Also nehm ich hier getURL.
Bei Youtube könnte ich nicht URL verwenden sondern brauche ContentURL, sonst weiß man nicht ob der Link die Videodatei oder die Untertitel runterladen soll. Also getURL bringt mir hier eine Offline Datei glaub ich, die bringt mir rein garnichts.
Aber wie gesagt, youtube dateien werde ich kaum auf den Server importieren, da dies kleine Dateien sind die ich über den PC lade. ABER fände es schön, wenn mein Script alles könnte
Da jedes Plugin unterschiedlich arbeitet, gibt es keine *einfache* Lösung.
getContent ->sofern die URL nicht aus einem Container kam, gibt entweder eine URL zurück welche genau zu dem Link führt oder einfach die URL selbst. Im Falle von Container gibt es nix zurück.
getURL gibt immer die *rohe* Plugin URL weiter. Oftmals klappt das, aber je nach Plugin kann hier auch eine komplette JDownloader interne URL stehen. Auch gibt es Links da geht getURL gar nicht /zb Usenet, da hier sehr viele Metadaten notwendig sind.
Jetzt brauch ich nur noch einen Button der mir die neuste zip in den folderwatch/share order kopiert.
Da ich mit LinkCollector: Minimum/Maximum Save Delay irgendwie nicht auf einen Nenner komme, mach ichs wohl so:
0. Button gedrückt
1. Suche aktuelle zip: z.b: "linkcollector1352.zip"
2. ändere Downloadordner zu Server Downloadordner (falls bereits geschehen, ändere Kommentar zu "Dummy"). Dadurch soll das verzögerte Speichern ausgelöst werden.
3. warte bis "linkcollector1353.zip" existiert
4. kopiere in share ordner
Frage: würde die Nummerierung bei den zip's irgendwann von neu anfangen? Oder zählt JD bis ins Unendliche :D?
Ach ok, dass disable/enable is natürlich auch gut.
Und wegen dem zählen, da gings mir nur darum, wenn ich bei 9999 bin und ich dann 10000 suche, dass er nicht wieder auf 1 zurück springt, sonst würde mein Script das dann nicht als das neustes erkennen. Aber wenn er einfach weiter zählt ist es um so besser für mich :D.
Gut, glaub jetzt hab ich alles was ich möchte. Jetzt setzte ich nocht meinen Button um und stells dann hier rein. Glaube aber kaum, dass das jemand braucht. Das ist einfach zu speziell auf mein Bedarf zugeschnitten :D.
//SyncFilesScript will sync you files in Linkgrabber with a JDownloader in your network, you have to use a share folder for this.
//Be aware you can only sync "selected" links/packages and not selected links/packages will be removed!!!!!
//If you have deactivated "GeneralSettings: Save Linkgrabber list" you have to activate it or JDownloader won't create linkcollector.zip's in the cfg folder.
//Beware you also need at least one "linkcollector.zip" with numbers: "linkcollector1.zip" or "linkcollector2.zip"
//Just insert some links in Jdownloader and wait for a new lincollector.zip file. Or delete some links and wait.
//Simple howTo ;)
//Insert this script into the JDownloader you want to export links with the event "Button Clicked in LinkGrabber Contect Menu"
//Create a button "SyncFiles" in the context menu of the linkgrabber
//Adjust your share folder in the function "copyLinkCollectorToShare(collector)" below
//Activate folderWatch on the JDownloader you want to import the links and adjust the folder path
//Happy syncing
if (name == "SyncFiles") {
var collector = getCurrentLinkCollector();
var nbr = getLinkCollectorNumber(collector);
var newLinkCollector = generateNewLinkCollector(nbr + 1);
deleteUnselected(); //be aware, you need to delete all other Links else you would sync also filtered links you filterd through the Sidebar Views
var isFound = false;
var breakAfterSec = 20 * 2; //change only the "20" not the "* 2", 20 means 10 seconds ;D
while (true) {
if (isFoundLinkCollector(newLinkCollector) == true) {
isFound = true;
break;
}
sleep(500);
breakAfterSec -= 1;
if (breakAfterSec == 0) break;
}
if (isFound) {
copyLinkCollectorToShare(newLinkCollector);
alert("Files were synced.");
} else(alert("Couldn't sync Files. Probaly the collector.zip file take to long to create. If so change the \"breakAfterSec\" to a higher value."));
}
function copyLinkCollectorToShare(collector) {
var sharePath = "\\\\PCNAME\\shareFolder\\otherFolder\\"; //Change to your share folder!
var absoluteCollectorPath = getPath(JD_HOME + "\\cfg\\" + collector);
absoluteCollectorPath.copyTo(sharePath);
}
function isFoundLinkCollector(collector) {
var currentCollector = getCurrentLinkCollector();
if (collector == currentCollector) return true;
return false;
}
function generateNewLinkCollector(nbr) {
var collector = "linkcollector" + nbr + ".zip";
return collector;
}
function getLinkCollectorNumber(collector) {
return parseInt(collector.match(/\d+/g));
}
function getCurrentLinkCollector() {
var cfgPath = JD_HOME + "\\cfg\\";
var linkcollectors = getPath(cfgPath).getChildren().filter(/linkcollector[0-9]*.zip/);
return linkcollectors[linkcollectors.length - 1].getName();
}
function deleteUnselected() {
var allLinks = getAllCrawledLinks();
var selectedLinks = lgSelection.getLinks();
for (var i = 0; i < allLinks.length; i++) {
currUUID = allLinks[i].getUUID();
var isInSelectedLinks = false;
for (var j = 0; j < selectedLinks.length; j++) {
if (currUUID == selectedLinks[j].getUUID()) {
isInSelectedLinks = true;
break;
}
}
if (!isInSelectedLinks) allLinks[i].remove();
}
}
Ups. Hatte vergessen, dass Enable/Disable einzubauen. Es ging bisher nur wenn mehr Links vorhanden waren als man Selektiert hatte.
Nun gehts auch wenn man nur ein Link hat und man diesen syncen möchte.
Spoiler:
Code:
//SyncFilesScript will sync you files in Linkgrabber with a JDownloader in your network, you have to use a share folder for this.
//Be aware you can only sync "selected" links/packages and not selected links/packages will be removed!!!!!
//If you have deactivated "GeneralSettings: Save Linkgrabber list" you have to activate it or JDownloader won't create linkcollector.zip's in the cfg folder.
//Beware you also need at least one "linkcollector.zip" with numbers: "linkcollector1.zip" or "linkcollector2.zip"
//Just insert some links in Jdownloader and wait for a new lincollector.zip file. Or delete some links and wait.
//Simple howTo ;)
//Insert this script into the JDownloader you want to export links with the event "Button Clicked in LinkGrabber Contect Menu"
//Create a button "SyncFiles" in the context menu of the linkgrabber
//Adjust your share folder in the function "copyLinkCollectorToShare(collector)" below
//Activate folderWatch on the JDownloader you want to import the links and adjust the folder path
//Happy syncing
if (name == "SyncFiles") {
var collector = getCurrentLinkCollector();
var nbr = getLinkCollectorNumber(collector);
var newLinkCollector = generateNewLinkCollector(nbr + 1);
deleteUnselected(); //be aware, you need to delete all other Links else you would sync also filtered links you filterd through the Sidebar Views
var isFound = false;
var breakAfterSec = 10 * 2; //change only the "20" not the "* 2"
while (true) {
if (isFoundLinkCollector(newLinkCollector) == true) {
isFound = true;
break;
}
sleep(500);
breakAfterSec -= 1;
if (breakAfterSec == 0) break;
}
if (isFound) {
copyLinkCollectorToShare(newLinkCollector);
alert("Files were synced.\n");
} else(alert("Couldn't sync Files. Probaly the collector.zip file take to long to create. If so change the "breakAfterSec" to a higher value.\n"));
}
function copyLinkCollectorToShare(collector) {
var sharePath = "\\\\PCNAME\\ShareFolder\\folder\\folder\"; //Change to your share folder!
var absoluteCollectorPath = getPath(JD_HOME + "\\cfg\" + collector);
absoluteCollectorPath.copyTo(sharePath);
}
function isFoundLinkCollector(collector) {
var currentCollector = getCurrentLinkCollector();
if (collector == currentCollector) return true;
return false;
}
function generateNewLinkCollector(nbr) {
var collector = "linkcollector" + nbr + ".zip";
return collector;
}
function getLinkCollectorNumber(collector) {
return parseInt(collector.match(/\d+/g));
}
function getCurrentLinkCollector() {
var cfgPath = JD_HOME + "\\cfg\";
var linkcollectors = getPath(cfgPath).getChildren().filter(/linkcollector[0-9]*.zip/);
return linkcollectors[linkcollectors.length - 1].getName();
}
function deleteUnselected() {
var allLinks = getAllCrawledLinks();
var selectedLinks = lgSelection.getLinks();
if (allLinks.length == selectedLinks.length)
swapEnabledDisabled(allLinks[0]);
for (var i = 0; i < allLinks.length; i++) {
currUUID = allLinks[i].getUUID();
var isInSelectedLinks = false;
for (var j = 0; j < selectedLinks.length; j++) {
if (currUUID == selectedLinks[j].getUUID()) {
isInSelectedLinks = true;
break;
}
}
if (!isInSelectedLinks) allLinks[i].remove();
}
}
function swapEnabledDisabled(link) {
var enabled = link.isEnabled();
link.setEnabled(!enabled);
link.setEnabled(enabled);
}