iawia002/lux · error

data.VideoInfo.CoreVideoInfo.ErrorMsg

Error message

data.VideoInfo.CoreVideoInfo.ErrorMsg

What it means

The second-tier YinYueTai API check: the top-level response parsed fine and data.Error is false, but the nested VideoInfo.CoreVideoInfo.Error flag is true, so the API's CoreVideoInfo.ErrorMsg is returned. This means the MV record exists but playback info for it was refused (copyright takedown, region limit, or removed stream).

Source

Thrown at extractors/yinyuetai/yinyuetai.go:64

	params := fmt.Sprintf("videoId=%s", vid[1])
	// generate api url
	apiURL := genAPI(actionGetMvInfo, params)
	var err error
	html, err := request.Get(apiURL, url, nil)
	if err != nil {
		return nil, errors.WithStack(err)
	}
	// parse yinyuetai data
	data := yinyuetaiMvData{}
	if err = json.Unmarshal([]byte(html), &data); err != nil {
		return nil, errors.WithStack(extractors.ErrURLParseFailed)
	}
	// handle api error
	if data.Error {
		return nil, errors.New(data.Message)
	}
	if data.VideoInfo.CoreVideoInfo.Error {
		return nil, errors.New(data.VideoInfo.CoreVideoInfo.ErrorMsg)
	}
	title := data.VideoInfo.CoreVideoInfo.VideoName
	streams := make(map[string]*extractors.Stream, len(data.VideoInfo.CoreVideoInfo.VideoURLModels))
	// set streams
	for _, model := range data.VideoInfo.CoreVideoInfo.VideoURLModels {
		urlData := &extractors.Part{
			URL:  model.VideoURL,
			Size: model.FileSize,
			Ext:  "mp4",
		}
		streams[model.QualityLevel] = &extractors.Stream{
			Parts:   []*extractors.Part{urlData},
			Size:    model.FileSize,
			Quality: model.QualityLevelName,
		}
	}
	return []*extractors.Data{
		{

View on GitHub (pinned to dd00f6d258)

Solutions

  1. Verify the MV actually plays (not just loads) in a browser from the same network
  2. If it plays in-browser but fails here, capture the API response and compare its shape with the yinyuetaiMvData struct in extractors/yinyuetai/yinyuetai.go
  3. Retry from an appropriate region for geo-limited MVs
  4. Treat persistent failures as unavailable content and skip

Example fix

// before
if data.VideoInfo.CoreVideoInfo.Error {
    return nil, errors.New(data.VideoInfo.CoreVideoInfo.ErrorMsg)
}

// after (keep the API's message but add which video it concerns)
if data.VideoInfo.CoreVideoInfo.Error {
    return nil, fmt.Errorf("yinyuetai core video info error for vid %s: %s", vid, data.VideoInfo.CoreVideoInfo.ErrorMsg)
}
Defensive patterns

Strategy: try-catch

Try / catch

_, err := yinyuetai.Extract(url, opts)
if err != nil {
    // CoreVideoInfo-level refusal: MV exists but stream refused (copyright/region)
    // do not retry the same id; report the API's ErrorMsg verbatim
    log.Printf("yinyuetai stream refused for %s: %v", url, err)
    return err
}

Prevention

When it happens

Trigger: The MV page still exists but its stream was taken down for copyright, or the playback-info endpoint refuses the request for the client's region/IP; also possible after YinYueTai changes its response schema so Error/ErrorMsg land in unexpected places.

Common situations: Copyright-taken-down MVs whose landing pages remain; mainland-only content accessed from abroad; schema drift making Error truthy on valid responses.

Related errors


AI-assisted analysis of iawia002/lux@dd00f6d258 (2026-08-15). Data as JSON: /api/errors/6b6ad35fd3659f68. Report an issue: GitHub.