Skip to content

Commit

Permalink
初步整理冗余代码
Browse files Browse the repository at this point in the history
  • Loading branch information
nilaoda committed Sep 5, 2023
1 parent 7ce189f commit 8de1189
Show file tree
Hide file tree
Showing 8 changed files with 1,144 additions and 950 deletions.
22 changes: 22 additions & 0 deletions BBDown.Core/Entity/ParsedResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static BBDown.Core.Entity.Entity;

namespace BBDown.Core.Entity
{
public class ParsedResult
{
public string WebJsonString { get; set; }
public List<Video> VideoTracks { get; set; } = new();
public List<Audio> AudioTracks { get; set; } = new();
public List<Audio> BackgroundAudioTracks { get; set; } = new();
public List<AudioMaterialInfo> RoleAudioList { get; set; } = new();
public List<ViewPoint> ExtraPoints { get; set; } = new();
// ⬇⬇⬇⬇⬇ FOR FLV ⬇⬇⬇⬇⬇
public List<string> Clips { get; set; } = new();
public List<string> Dfns { get; set; } = new();
}
}
49 changes: 49 additions & 0 deletions BBDown.Core/FetcherFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using BBDown.Core.Fetcher;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BBDown.Core
{
public sealed class FetcherFactory
{
private FetcherFactory() { }

/// <summary>
/// 根据不同场景获取不同的Info解析器
/// </summary>
/// <param name="aidOri"></param>
/// <returns>IFetcher</returns>
public static IFetcher CreateFetcher(string aidOri, bool useIntlApi)
{
IFetcher fetcher = new NormalInfoFetcher();
if (aidOri.StartsWith("cheese"))
{
fetcher = new CheeseInfoFetcher();
}
else if (aidOri.StartsWith("ep"))
{
fetcher = useIntlApi ? new IntlBangumiInfoFetcher() : new BangumiInfoFetcher();
}
else if (aidOri.StartsWith("mid"))
{
fetcher = new SpaceVideoFetcher();
}
else if (aidOri.StartsWith("listBizId"))
{
fetcher = new MediaListFetcher();
}
else if (aidOri.StartsWith("seriesBizId"))
{
fetcher = new SeriesListFetcher();
}
else if (aidOri.StartsWith("favId"))
{
fetcher = new FavListFetcher();
}
return fetcher;
}
}
}
67 changes: 31 additions & 36 deletions BBDown.Core/Parser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using static BBDown.Core.Util.HTTPUtil;
using static BBDown.Core.Entity.Entity;
using System.Security.Cryptography;
using BBDown.Core.Entity;

namespace BBDown.Core
{
Expand Down Expand Up @@ -100,26 +101,20 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
return webJson;
}

public static async Task<(string, List<Video>, List<Audio>, List<string>, List<string>, List<Audio>, List<AudioMaterialInfo>, List<ViewPoint>)> ExtractTracksAsync(string aidOri, string aid, string cid, string epId, bool tvApi, bool intlApi, bool appApi, string encoding, string qn = "0")
public static async Task<ParsedResult> ExtractTracksAsync(string aidOri, string aid, string cid, string epId, bool tvApi, bool intlApi, bool appApi, string encoding, string qn = "0")
{
List<Video> videoTracks = new();
List<Audio> audioTracks = new();
List<string> clips = new();
List<string> dfns = new();
List<Audio> backgroundAudioTracks = new();
List<AudioMaterialInfo> roleAudioList = new();
List<ViewPoint> points = new();
var intlCode = "0";
ParsedResult parsedResult = new();

//调用解析
string webJsonStr = await GetPlayJsonAsync(encoding, aidOri, aid, cid, epId, tvApi, intlApi, appApi, qn);
parsedResult.WebJsonString = await GetPlayJsonAsync(encoding, aidOri, aid, cid, epId, tvApi, intlApi, appApi, qn);

startParsing:
var respJson = JsonDocument.Parse(webJsonStr);
var respJson = JsonDocument.Parse(parsedResult.WebJsonString);
var data = respJson.RootElement;

//intl接口
if (webJsonStr.Contains("\"stream_list\""))
if (parsedResult.WebJsonString.Contains("\"stream_list\""))
{
int pDur = data.GetProperty("data").GetProperty("video_info").GetProperty("timelength").GetInt32() / 1000;
var audio = data.GetProperty("data").GetProperty("video_info").GetProperty("dash_audio").EnumerateArray().ToList();
Expand All @@ -142,7 +137,7 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
codecs = GetVideoCodec(dashVideo.GetProperty("codecid").ToString()),
size = dashVideo.TryGetProperty("size", out var sizeNode) ? Convert.ToDouble(sizeNode.ToString()) : 0
};
if (!videoTracks.Contains(v)) videoTracks.Add(v);
if (!parsedResult.VideoTracks.Contains(v)) parsedResult.VideoTracks.Add(v);
}
}
}
Expand All @@ -160,27 +155,27 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
baseUrl = urlList.FirstOrDefault(i => !BaseUrlRegex().IsMatch(i), urlList.First()),
codecs = "M4A"
};
if (!audioTracks.Contains(a)) audioTracks.Add(a);
if (!parsedResult.AudioTracks.Contains(a)) parsedResult.AudioTracks.Add(a);
}

if (intlCode == "0")
{
intlCode = "1";
webJsonStr = await GetPlayJsonAsync(aid, cid, epId, qn, intlCode);
parsedResult.WebJsonString = await GetPlayJsonAsync(aid, cid, epId, qn, intlCode);
goto startParsing;
}

return (webJsonStr, videoTracks, audioTracks, clips, dfns, backgroundAudioTracks, roleAudioList, points);
return parsedResult;
}
// data节点一次性判断完
string nodeName = null;
if (webJsonStr.Contains("\"result\":{")) nodeName = "result";
else if (webJsonStr.Contains("\"data\":{")) nodeName = "data";
if (parsedResult.WebJsonString.Contains("\"result\":{")) nodeName = "result";
else if (parsedResult.WebJsonString.Contains("\"data\":{")) nodeName = "data";
var root = nodeName == null ? data : data.GetProperty(nodeName);

bool bangumi = aidOri.StartsWith("ep:");

if (webJsonStr.Contains("\"dash\":{")) //dash
if (parsedResult.WebJsonString.Contains("\"dash\":{")) //dash
{
List<JsonElement>? audio = null;
List<JsonElement>? video = null;
Expand All @@ -195,8 +190,8 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
reParse:
if (reParse)
{
webJsonStr = await GetPlayJsonAsync(encoding, aidOri, aid, cid, epId, tvApi, intlApi, appApi, GetMaxQn());
respJson = JsonDocument.Parse(webJsonStr);
parsedResult.WebJsonString = await GetPlayJsonAsync(encoding, aidOri, aid, cid, epId, tvApi, intlApi, appApi, GetMaxQn());
respJson = JsonDocument.Parse(parsedResult.WebJsonString);
data = respJson.RootElement;
root = nodeName == null ? data : data.GetProperty(nodeName);
}
Expand Down Expand Up @@ -266,7 +261,7 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
v.res = node.GetProperty("width").ToString() + "x" + node.GetProperty("height").ToString();
v.fps = node.GetProperty("frame_rate").ToString();
}
if (!videoTracks.Contains(v)) videoTracks.Add(v);
if (!parsedResult.VideoTracks.Contains(v)) parsedResult.VideoTracks.Add(v);
}
}

Expand Down Expand Up @@ -297,7 +292,7 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
_ => codecs
};

audioTracks.Add(new Audio()
parsedResult.AudioTracks.Add(new Audio()
{
id = audioId,
dfn = audioId,
Expand All @@ -316,7 +311,7 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
var audioId = node.GetProperty("id").ToString();
var urlList = new List<string> { node.GetProperty("base_url").ToString() };
urlList.AddRange(node.GetProperty("backup_url").EnumerateArray().Select(i => i.ToString()));
backgroundAudioTracks.Add(new Audio()
parsedResult.BackgroundAudioTracks.Add(new Audio()
{
id = audioId,
dfn = audioId,
Expand Down Expand Up @@ -345,7 +340,7 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
codecs = node.GetProperty("codecs").ToString()
});
}
roleAudioList.Add(new AudioMaterialInfo()
parsedResult.RoleAudioList.Add(new AudioMaterialInfo()
{
title = role.GetProperty("title").ToString(),
personName = role.GetProperty("person_name").ToString(),
Expand All @@ -355,11 +350,11 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
}
}
}
else if (webJsonStr.Contains("\"durl\":[")) //flv
else if (parsedResult.WebJsonString.Contains("\"durl\":[")) //flv
{
//默认以最高清晰度解析
webJsonStr = await GetPlayJsonAsync(encoding, aidOri, aid, cid, epId, tvApi, intlApi, appApi, GetMaxQn());
data = JsonDocument.Parse(webJsonStr).RootElement;
parsedResult.WebJsonString = await GetPlayJsonAsync(encoding, aidOri, aid, cid, epId, tvApi, intlApi, appApi, GetMaxQn());
data = JsonDocument.Parse(parsedResult.WebJsonString).RootElement;
root = nodeName == null ? data : data.GetProperty(nodeName);
string quality = "";
string videoCodecid = "";
Expand All @@ -372,18 +367,18 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
//获取所有分段
foreach (var node in root.GetProperty("durl").EnumerateArray())
{
clips.Add(node.GetProperty("url").ToString());
parsedResult.Clips.Add(node.GetProperty("url").ToString());
size += node.GetProperty("size").GetDouble();
length += node.GetProperty("length").GetDouble();
}
//TV模式可用清晰度
if (root.TryGetProperty("qn_extras", out JsonElement qnExtras))
{
dfns.AddRange(qnExtras.EnumerateArray().Select(node => node.GetProperty("qn").ToString()));
parsedResult.Dfns.AddRange(qnExtras.EnumerateArray().Select(node => node.GetProperty("qn").ToString()));
}
else if (root.TryGetProperty("accept_quality", out JsonElement acceptQuality)) //非tv模式可用清晰度
{
dfns.AddRange(acceptQuality.EnumerateArray()
parsedResult.Dfns.AddRange(acceptQuality.EnumerateArray()
.Select(node => node.ToString())
.Where(_qn => !string.IsNullOrEmpty(_qn)));
}
Expand All @@ -397,37 +392,37 @@ private static async Task<string> GetPlayJsonAsync(string aid, string cid, strin
dur = (int)length / 1000,
size = size
};
if (!videoTracks.Contains(v)) videoTracks.Add(v);
if (!parsedResult.VideoTracks.Contains(v)) parsedResult.VideoTracks.Add(v);
}

// 番剧片头片尾转分段信息, 预计效果: 正片? -> 片头 -> 正片 -> 片尾
if (bangumi)
{
if (root.TryGetProperty("clip_info_list", out JsonElement clipList))
{
points.AddRange(clipList.EnumerateArray().Select(clip => new ViewPoint()
parsedResult.ExtraPoints.AddRange(clipList.EnumerateArray().Select(clip => new ViewPoint()
{
title = clip.GetProperty("toastText").ToString().Replace("即将跳过", ""),
start = clip.GetProperty("start").GetInt32(),
end = clip.GetProperty("end").GetInt32()
})
);
points.Sort((p1, p2) => p1.start.CompareTo(p2.start));
parsedResult.ExtraPoints.Sort((p1, p2) => p1.start.CompareTo(p2.start));
var newPoints = new List<ViewPoint>();
int lastEnd = 0;
foreach (var point in points)
foreach (var point in parsedResult.ExtraPoints)
{
if (lastEnd < point.start)
newPoints.Add(new ViewPoint() { title = "正片", start = lastEnd, end = point.start });
newPoints.Add(point);
lastEnd = point.end;
}
points = newPoints;
parsedResult.ExtraPoints = newPoints;
}

}

return (webJsonStr, videoTracks, audioTracks, clips, dfns, backgroundAudioTracks, roleAudioList, points);
return parsedResult;
}

/// <summary>
Expand Down
Loading

2 comments on commit 8de1189

@dogdie233
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

还再接着整理嘛,还要改的话我就先不处理我那个pr的冲突了

@nilaoda
Copy link
Owner Author

@nilaoda nilaoda commented on 8de1189 Sep 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

还再接着整理嘛,还要改的话我就先不处理我那个pr的冲突了

最近一周应该不会继续优化

Please sign in to comment.