feat: add fnOS packaging, storage workflows and release pipeline
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
using dy.net.model.dto;
|
||||
using dy.net.model.entity;
|
||||
using dy.net.model.response;
|
||||
using SqlSugar;
|
||||
|
||||
namespace dy.net.service
|
||||
{
|
||||
public class DouyinMigrationSourceResolver
|
||||
{
|
||||
private readonly DouyinHttpClientService _http;
|
||||
private readonly ISqlSugarClient _db;
|
||||
|
||||
public DouyinMigrationSourceResolver(DouyinHttpClientService http, ISqlSugarClient db)
|
||||
{
|
||||
_http = http;
|
||||
_db = db;
|
||||
}
|
||||
|
||||
public async Task<IReadOnlyList<string>> ResolveAsync(DouyinVideo video, DouyinCookie cookie, CancellationToken cancellationToken)
|
||||
{
|
||||
if (video == null || cookie == null || string.IsNullOrWhiteSpace(cookie.Cookies)) return Array.Empty<string>();
|
||||
var category = string.IsNullOrWhiteSpace(video.CateId)
|
||||
? null
|
||||
: await _db.Queryable<DouyinCollectCate>().InSingleAsync(video.CateId);
|
||||
var followed = video.ViedoType == VideoTypeEnum.dy_follows
|
||||
? await _db.Queryable<DouyinFollowed>().Where(x => x.UperId == video.AuthorId).FirstAsync()
|
||||
: null;
|
||||
|
||||
var cursor = "0";
|
||||
for (var page = 0; page < 500 && !cancellationToken.IsCancellationRequested; page++)
|
||||
{
|
||||
var response = await FetchAsync(video, cookie, category, followed, cursor);
|
||||
if (response?.StatusCode != 0 || response.AwemeList == null) return Array.Empty<string>();
|
||||
var match = response.AwemeList.FirstOrDefault(x => x.AwemeId == video.AwemeId);
|
||||
if (match != null) return ExtractUrls(match);
|
||||
if (response.HasMore != 1) break;
|
||||
var next = response.Cursor ?? response.MaxCursor;
|
||||
if (string.IsNullOrWhiteSpace(next) || next == cursor) break;
|
||||
cursor = next;
|
||||
}
|
||||
return Array.Empty<string>();
|
||||
}
|
||||
|
||||
private async Task<DouyinVideoInfoResponse> FetchAsync(
|
||||
DouyinVideo video,
|
||||
DouyinCookie cookie,
|
||||
DouyinCollectCate category,
|
||||
DouyinFollowed followed,
|
||||
string cursor) => video.ViedoType switch
|
||||
{
|
||||
VideoTypeEnum.dy_favorite when !string.IsNullOrWhiteSpace(cookie.SecUserId) =>
|
||||
await _http.SyncFavoriteVideos("18", cursor, cookie.SecUserId, cookie.Cookies),
|
||||
VideoTypeEnum.dy_follows when !string.IsNullOrWhiteSpace(followed?.SecUid) =>
|
||||
await _http.SyncUpderPostVideos("18", cursor, followed.SecUid, cookie.Cookies),
|
||||
VideoTypeEnum.dy_custom_collect when !string.IsNullOrWhiteSpace(category?.XId) =>
|
||||
await _http.SyncCollectVideosByCollectId(cursor, "18", cookie.Cookies, category.XId),
|
||||
VideoTypeEnum.dy_mix when !string.IsNullOrWhiteSpace(category?.XId ?? video.CateXId) =>
|
||||
await _http.SyncMixViedosByMixId(cursor, "18", cookie.Cookies, category?.XId ?? video.CateXId),
|
||||
VideoTypeEnum.dy_series when !string.IsNullOrWhiteSpace(category?.XId ?? video.CateXId) =>
|
||||
await _http.SyncSeriesViedosByMSeriesId(cursor, "18", cookie.Cookies, category?.XId ?? video.CateXId),
|
||||
_ => await _http.SyncCollectVideos(cursor, "18", cookie.Cookies)
|
||||
};
|
||||
|
||||
private static IReadOnlyList<string> ExtractUrls(Aweme aweme)
|
||||
{
|
||||
return (aweme.Video?.BitRate ?? new List<VideoBitRate>())
|
||||
.Where(x => x?.PlayAddr?.UrlList != null)
|
||||
.OrderByDescending(x => x.BitRateValue)
|
||||
.SelectMany(x => x.PlayAddr.UrlList)
|
||||
.Where(x => !string.IsNullOrWhiteSpace(x))
|
||||
.Distinct()
|
||||
.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user