jely2002/youtube-dl-gui · warning
No options found for group
Error message
No options found for group: ${groupId}, cannot resume. What it means
resumeAllGroups iterates all groups in paused state and restarts their downloads using stored options. If a paused group has no persisted options, it logs a warning 'No options found for group: ${groupId}, cannot resume.' via console.warn and continues — it does not throw and does not abort other groups.
Solutions
- Persist download options alongside group state so paused groups survive restarts with their options.
- When clearing/pruning options, also move the group out of paused state (e.g. back to idle) so resumeAllGroups skips it.
- Check the console warning's groupId and re-create the download for that group manually with fresh options.
- In the UI, hide the resume-all button or exclude groups lacking options.
Example fix
// before
const options = optionsStore.getOptions(groupId);
if (!options) { console.warn(...); continue; }
// after
const options = optionsStore.getOptions(groupId);
if (!options) {
stateStore.setGroupState(groupId, MediaState.idle); // resync state
continue;
} Defensive patterns
Strategy: validation
Validate before calling
const state = stateStore.getGroupState(groupId);
const options = optionsStore.getOptions(groupId);
if (state === MediaState.paused && !options) {
stateStore.setGroupState(groupId, MediaState.idle); // cannot resume
} Type guard
const isResumable = (groupId: string): boolean => {
const s = stateStore.getGroupState(groupId);
return (s === MediaState.paused || s === MediaState.pausedList) && !!optionsStore.getOptions(groupId);
}; Try / catch
// Non-throwing by design: filter to resumable groups before acting.
for (const groupId of groupStore.groupOrder.filter(isResumable)) {
void downloadGroup(groupId, optionsStore.getOptions(groupId)!);
} Prevention
- Persist download options with group state so resume works after restart.
- Clear paused state whenever options are pruned or cleared.
- Surface non-resumable paused groups in the UI instead of silently skipping them.
When it happens
Trigger: A group is in MediaState.paused/pausedList but optionsStore.getOptions(groupId) returns undefined — options were cleared on app restart (not persisted), the group was created without options, or options were pruned while state remained paused.
Common situations: Resuming after an app relaunch where download options are session-only; clearing option overrides elsewhere in the UI while leaving the group paused; a partially initialized group that reached paused state without ever starting.
Understand the failure class
Background: "X is required", "must be set", "cannot be empty": the missing-required-config error family, from Vertex AI project/location to WeChat keys — this error's family across 18 libraries.
Related errors
- Orphaned media item found during error handling.
- Orphaned media item found.
- Playlist group is missing entry metadata.
- Unknown shortcut action
AI-assisted analysis of jely2002/youtube-dl-gui@c402ee39c0 (2026-09-12).
Data as JSON: /api/errors/a897a09e91682d60.
Report an issue: GitHub.
Appendix: source
Thrown at src/stores/media/media.ts:437
await notify(NotificationKind.QueueDownloading, { n: group_ids.length.toString() }, fromShortcut);
}
function pauseAllGroups() {
for (const groupId of groupStore.groupOrder) {
const state = stateStore.getGroupState(groupId);
if (state === MediaState.downloading || state === MediaState.downloadingList) {
void pauseGroup(groupId);
}
}
}
function resumeAllGroups() {
for (const groupId of groupStore.groupOrder) {
const state = stateStore.getGroupState(groupId);
if (state !== MediaState.paused && state !== MediaState.pausedList) continue;
const options = optionsStore.getOptions(groupId);
if (!options) {
console.warn(`No options found for group: ${groupId}, cannot resume.`);
continue;
}
void downloadGroup(groupId, options);
}
}
function deleteGroup(id: string) {
const group = groupStore.findGroupById(id);
for (const itemId of Object.keys(group.items)) {
stateStore.removeState(itemId);
progressStore.deleteProgress(itemId);
sizeStore.removeSizes(itemId);
diagnosticsStore.removeDiagnostics(itemId);
}
diagnosticsStore.removeDiagnostics(group.id);
destinationStore.deleteDestinations(group.id);
optionsStore.removeOptions(group.id);
groupStore.cancelGroup(group.id);View on GitHub (pinned to c402ee39c0)