fix: fix mgtv danmu download. #66

This commit is contained in:
cxfksword
2024-12-08 14:45:47 +08:00
parent e269527aeb
commit 89634c83f2
2 changed files with 75 additions and 19 deletions

View File

@@ -0,0 +1,32 @@
using System.Linq;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace Jellyfin.Plugin.Danmu.Scrapers.Mgtv.Entity;
public class MgtvControlBarrageResult
{
[JsonPropertyName("data")]
public MgtvControlBarrage Data { get; set; }
}
public class MgtvControlBarrage
{
[JsonPropertyName("cdn_list")]
public string CdnList { get; set; }
[JsonPropertyName("cdn_version")]
public string CdnVersion { get; set; }
public string CdnHost
{
get
{
if (string.IsNullOrEmpty(CdnList))
{
return "bullet-ali.hitv.com";
}
return CdnList.Split(',').Where(x => !x.Contains("-ws")).FirstOrDefault("bullet-ali.hitv.com");
}
}
}

View File

@@ -132,31 +132,55 @@ public class MgtvApi : AbstractApi
return danmuList;
}
// https://galaxy.bz.mgtv.com/getctlbarrage?version=8.1.39&abroad=0&uuid=&os=10.15.7&platform=0&deviceid=42813b17-99f8-4e34-98a2-2c37537667ad&mac=&vid=21920728&pid=&cid=593455&ticket=
var ctlbarrageUrl = $"https://galaxy.bz.mgtv.com/getctlbarrage?version=8.1.39&abroad=0&uuid=&os=10.15.7&platform=0&mac=&vid={vid}&pid=&cid={cid}&ticket=";
var ctlbarrageResponse = await this.httpClient.GetAsync(ctlbarrageUrl, cancellationToken).ConfigureAwait(false);
ctlbarrageResponse.EnsureSuccessStatusCode();
var time = 0;
do
var ctlbarrageResult = await ctlbarrageResponse.Content.ReadFromJsonAsync<MgtvControlBarrageResult>(_jsonOptions, cancellationToken).ConfigureAwait(false);
if (ctlbarrageResult != null && ctlbarrageResult.Data != null)
{
var segmentUrl = $"https://galaxy.bz.mgtv.com/cdn/opbarrage?vid={vid}&pid=&cid={cid}&ticket=&time={time}&allowedRC=1";
var segmentResponse = await this.httpClient.GetAsync(segmentUrl, cancellationToken).ConfigureAwait(false);
segmentResponse.EnsureSuccessStatusCode();
// https://pcweb.api.mgtv.com/video/info?allowedRC=1&cid=593455&vid=21920892&change=3&datatype=1&type=1&_support=10000000
var videoInfoUrl = $"https://pcweb.api.mgtv.com/video/info?allowedRC=1&cid={cid}&vid={vid}&change=3&datatype=1&type=1&_support=10000000";
var videoInfoResponse = await this.httpClient.GetAsync(videoInfoUrl, cancellationToken).ConfigureAwait(false);
videoInfoResponse.EnsureSuccessStatusCode();
var segmentResult = await segmentResponse.Content.ReadFromJsonAsync<MgtvCommentSegmentResult>(_jsonOptions, cancellationToken).ConfigureAwait(false);
if (segmentResult != null && segmentResult.Data != null && segmentResult.Data.Items != null)
var videoInfoResult = await videoInfoResponse.Content.ReadFromJsonAsync<MgtvVideoInfoResult>(_jsonOptions, cancellationToken).ConfigureAwait(false);
if (videoInfoResult != null && videoInfoResult.Data != null && videoInfoResult.Data.Info != null)
{
// 60秒每segment为避免弹幕太大从中间隔抽取最大60秒200条弹幕
danmuList.AddRange(segmentResult.Data.Items.ExtractToNumber(200));
}
else
{
break;
}
var time = 0;
var totalMinutes = videoInfoResult.Data.Info.TotalMinutes;
while (time < totalMinutes)
{
try {
// https://bullet-ali.hitv.com/bullet/tx/2024/12/5/093517/21920728/20.json
var segmentUrl = $"https://{ctlbarrageResult.Data.CdnHost}/{ctlbarrageResult.Data.CdnVersion}/{time}.json";
var segmentResponse = await this.httpClient.GetAsync(segmentUrl, cancellationToken).ConfigureAwait(false);
segmentResponse.EnsureSuccessStatusCode();
time = segmentResult?.Data?.Next ?? 0;
// 等待一段时间避免api请求太快
await _delayExecuteConstraint;
var segmentResult = await segmentResponse.Content.ReadFromJsonAsync<MgtvCommentSegmentResult>(_jsonOptions, cancellationToken).ConfigureAwait(false);
if (segmentResult != null && segmentResult.Data != null && segmentResult.Data.Items != null)
{
// 60秒每segment为避免弹幕太大从中间隔抽取最大60秒200条弹幕
danmuList.AddRange(segmentResult.Data.Items.ExtractToNumber(200));
}
else
{
break;
}
time++;
// 等待一段时间避免api请求太快
await _delayExecuteConstraint;
}
catch (Exception ex)
{
_logger.LogError(ex, ex.Message);
break;
}
}
}
}
while (time > 0);
return danmuList;
}