DIYgod/RSSHub · warning · Error

No shorts found for this channel. Please make sure the chann

Error message

No shorts found for this channel. Please make sure the channel ID is correct and that the channel contains shorts.

What it means

The Ganjing World shorts route queries the v1.1 content API with content_type=Shorts. If data.list is empty, the channel has no shorts (or is wrong/non-existent), and the route throws rather than emit an empty feed.

Source

Thrown at lib/routes/ganjingworld/channel/shorts.ts:41

        {
            source: ['ganjingworld.com'],
            target: '/channel/shorts/:id',
        },
    ],
    url: 'www.ganjingworld.com',
    name: 'Shorts in a channel',
    maintainers: ['yixiangli2001'],
    handler,
};

async function handler(ctx) {
    const id = ctx.req.param('id');
    const url = `https://www.ganjingworld.com/channel/${id}?tab=shorts`;
    const apiUrl = `https://gw.ganjingworld.com/v1.1/content/get-by-channel?channel_id=${id}&content_type=Shorts&page_size=30&query=basic%2Cwatch_count&visibility=public&mode=ready`;

    const parsed: ApiResponse = await ofetch<ApiResponse>(apiUrl);
    if (parsed.data.list.length === 0) {
        throw new Error('No shorts found for this channel. Please make sure the channel ID is correct and that the channel contains shorts.');
    }
    const title = parsed.data.list[0].channel.name;
    const items = parsed.data.list.map((item) => {
        const pubDate = new Date(item.time_scheduled);
        const videoUrl = item.video_url || (item.media.length > 0 ? item.media[0].url : '');
        const posterUrl = item.poster_url || item.image_auto_url || '';

        let description = item.description || '';
        if (videoUrl) {
            description = `<video controls src="${videoUrl}" poster="${posterUrl}" style="max-width: 100%;"></video><br/>${description}`;
        }

        return {
            title: item.title,
            link: `https://www.ganjingworld.com/video/${item.id}`,
            pubDate,
            description,
        };

View on GitHub (pinned to bed535e087)

Solutions

  1. Open https://www.ganjingworld.com/channel/{id}?tab=shorts in a browser to confirm shorts exist.
  2. Verify the id is a channel id (content API uses channel_id).
  3. Point the user at the articles or posts route if the channel has no shorts.

Example fix

// before
if (parsed.data.list.length === 0) {
    throw new Error('No shorts found for this channel. ...');
}

// after
if (parsed.data.list.length === 0) {
    throw new InvalidParameterError(`Channel "${id}" has no shorts. Verify the channel ID and try the articles or posts route.`);
}
Defensive patterns

Strategy: validation

Validate before calling

const probe = await ofetch(`https://gw.ganjingworld.com/v1.1/content/get-by-channel?channel_id=${id}&content_type=Shorts&page_size=1`);
if (probe.data.list.length === 0) {
  throw new InvalidParameterError(`Channel ${id} has no shorts`);
}

Type guard

const hasShorts = (res: ApiResponse): boolean => res.data.list.length > 0;

Prevention

When it happens

Trigger: Querying a channel that only produces News articles or text posts (no Shorts), a non-existent channel id, or a channel whose shorts are not in visibility=public / mode=ready.

Common situations: Using an articles-only channel id for shorts; copying a user id instead of a channel id; all shorts being in draft/non-ready mode.

Related errors


AI-assisted analysis of DIYgod/RSSHub@bed535e087 (2026-08-12). Data as JSON: /api/errors/02a804cb7f700a9a. Report an issue: GitHub.