mirror of
https://github.com/cxfksword/jellyfin-plugin-danmu.git
synced 2026-02-03 02:04:47 +08:00
fix: fix mgtv danmu download. #66
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user