Root cause of the recurring "kein Filecode — Server gab leeren Link zurueck": the web-session upload flow gets the filecode back inside an XFileSharing HTML form, and on long/large uploads that form comes back empty (no fn). Verified research: doodstream's server-side file-registration callback times out under large-file load, so the upload "succeeds" (bytes sent, HTTP 200) but no filecode is minted — and because registration failed, the file is NOT in the file list either, so polling can't recover it. The web path also rides a per-page-load sess_id token that ages over the multi-minute upload. The official doodapi.co JSON API has no such failure mode for result retrieval: the upload response returns result[0].filecode directly, and it authenticates with a persistent api_key (no aging sess_id). Git history confirms the API was doodstream's ORIGINAL upload path (initial commit); web login was added later only "as an alternative to API key" — so preferring the key restores the intended primary path rather than fighting a deliberate choice. - lib/account-auth.js (new, pure, unit-tested): selectUploadAuth() prefers the doodstream API key over username/password; all other hosters unchanged. - main.js buildTaskFromAccount delegates to it → a doodstream account with an apiKey now routes through hosters.uploadFile (doodapi API) instead of the web uploader; keyless accounts keep using web login. - hosters.js: drop the stale hardcoded fallback node from the doodstream API config (same dead tr1128ve host removed from the web path) so a failed server lookup throws cleanly instead of uploading into a dead end. - Tests: 8 routing cases (doodstream key-preference, keyless fallback, voe unaffected, authType=api, null-safety). Full suite 173/173. This eliminates the empty-form failure mode for result retrieval when a key is configured. It does NOT change doodstream's backend — whether the large-file timeout recurs (now as a structured JSON error, not a silent empty form) is for the server run to confirm. Requires a doodstream API key on the account. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
37 lines
1.7 KiB
JavaScript
37 lines
1.7 KiB
JavaScript
// Decides which credential an upload task should use for a given hoster.
|
|
// Extracted from main.js buildTaskFromAccount so the routing can be unit-tested
|
|
// without Electron.
|
|
//
|
|
// DOODSTREAM SPECIAL CASE: prefer the official doodapi.co API key whenever the
|
|
// account has one. The web-login path (username/password) drives doodstream's
|
|
// browser upload flow, which hands the filecode back inside an XFileSharing
|
|
// HTML form. On long/large uploads that form comes back empty (no fn) because a
|
|
// per-page-load sess_id token ages out over the multi-minute upload and/or the
|
|
// server-side file-registration callback times out — the upload then "succeeds"
|
|
// (bytes sent, HTTP 200) but yields no link. The JSON API returns the filecode
|
|
// directly in result[0].filecode and authenticates with a persistent api_key,
|
|
// so it has no empty-form failure mode for result retrieval. The API path was
|
|
// doodstream's ORIGINAL upload path (present since the initial commit); web
|
|
// login was added later only as an alternative for keyless accounts — so
|
|
// preferring the key here restores the intended primary path, it doesn't fight
|
|
// a deliberate choice. Keyless accounts keep using web login unchanged.
|
|
function selectUploadAuth(hoster, account) {
|
|
if (!account || typeof account !== 'object') return {};
|
|
|
|
if (hoster === 'doodstream.com' && account.apiKey) {
|
|
return { apiKey: account.apiKey };
|
|
}
|
|
if (account.authType === 'api' && account.apiKey) {
|
|
return { apiKey: account.apiKey };
|
|
}
|
|
if (account.username && account.password) {
|
|
return { username: account.username, password: account.password };
|
|
}
|
|
if (account.apiKey) {
|
|
return { apiKey: account.apiKey };
|
|
}
|
|
return {};
|
|
}
|
|
|
|
module.exports = { selectUploadAuth };
|