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
- Verify the MV actually plays (not just loads) in a browser from the same network
- 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
- Retry from an appropriate region for geo-limited MVs
- 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
- Treat CoreVideoInfo errors as content-unavailable, not transient
- Confirm playback (not just page load) in a browser before retrying
- Track API schema changes if Error is suddenly truthy on working videos
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.