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

  1. Persist download options alongside group state so paused groups survive restarts with their options.
  2. When clearing/pruning options, also move the group out of paused state (e.g. back to idle) so resumeAllGroups skips it.
  3. Check the console warning's groupId and re-create the download for that group manually with fresh options.
  4. 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

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


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)