You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
downkyi/DownKyi/Services/FavoritesService.cs

233 lines
9.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using DownKyi.Core.BiliApi.Favorites;
using DownKyi.Core.Storage;
using DownKyi.Core.Utils;
using DownKyi.ViewModels.PageViewModels;
using Prism.Events;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading;
using System.Windows.Media.Imaging;
namespace DownKyi.Services
{
public class FavoritesService : IFavoritesService
{
/// <summary>
/// 获取收藏夹元数据
/// </summary>
/// <param name="mediaId"></param>
/// <returns></returns>
public Favorites GetFavorites(long mediaId)
{
var favoritesMetaInfo = FavoritesInfo.GetFavoritesInfo(mediaId);
if (favoritesMetaInfo == null) { return null; }
// 查询、保存封面
StorageCover storageCover = new StorageCover();
string coverUrl = favoritesMetaInfo.Cover;
BitmapImage cover = storageCover.GetCoverThumbnail(favoritesMetaInfo.Id, "Favorites", favoritesMetaInfo.Mid, coverUrl, 300, 188);
// 获取用户头像
string upName;
string header;
if (favoritesMetaInfo.Upper != null)
{
upName = favoritesMetaInfo.Upper.Name;
StorageHeader storageHeader = new StorageHeader();
header = storageHeader.GetHeader(favoritesMetaInfo.Upper.Mid, favoritesMetaInfo.Upper.Name, favoritesMetaInfo.Upper.Face);
}
else
{
upName = "";
header = null;
}
// 为Favorites赋值
Favorites favorites = new Favorites();
App.PropertyChangeAsync(new Action(() =>
{
favorites.CoverUrl = coverUrl;
favorites.Cover = cover;
favorites.Title = favoritesMetaInfo.Title;
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区
DateTime dateTime = startTime.AddSeconds(favoritesMetaInfo.Ctime);
favorites.CreateTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss");
favorites.PlayNumber = Format.FormatNumber(favoritesMetaInfo.CntInfo.Play);
favorites.LikeNumber = Format.FormatNumber(favoritesMetaInfo.CntInfo.ThumbUp);
favorites.FavoriteNumber = Format.FormatNumber(favoritesMetaInfo.CntInfo.Collect);
favorites.ShareNumber = Format.FormatNumber(favoritesMetaInfo.CntInfo.Share);
favorites.Description = favoritesMetaInfo.Intro;
favorites.MediaCount = favoritesMetaInfo.MediaCount;
favorites.UpName = upName;
if (header != null)
{
StorageHeader storageHeader = new StorageHeader();
favorites.UpHeader = storageHeader.GetHeaderThumbnail(header, 48, 48);
favorites.UpperMid = favoritesMetaInfo.Upper.Mid;
}
else
{
favorites.UpHeader = null;
}
}));
return favorites;
}
///// <summary>
///// 获取收藏夹所有内容明细列表
///// </summary>
///// <param name="mediaId"></param>
///// <param name="result"></param>
///// <param name="eventAggregator"></param>
//public void GetFavoritesMediaList(long mediaId, ObservableCollection<FavoritesMedia> result, IEventAggregator eventAggregator, CancellationToken cancellationToken)
//{
// List<Core.BiliApi.Favorites.Models.FavoritesMedia> medias = FavoritesResource.GetAllFavoritesMedia(mediaId);
// if (medias.Count == 0) { return; }
// GetFavoritesMediaList(medias, result, eventAggregator, cancellationToken);
//}
///// <summary>
///// 获取收藏夹指定页的内容明细列表
///// </summary>
///// <param name="mediaId"></param>
///// <param name="pn"></param>
///// <param name="ps"></param>
///// <param name="result"></param>
///// <param name="eventAggregator"></param>
//public void GetFavoritesMediaList(long mediaId, int pn, int ps, ObservableCollection<FavoritesMedia> result, IEventAggregator eventAggregator, CancellationToken cancellationToken)
//{
// List<Core.BiliApi.Favorites.Models.FavoritesMedia> medias = FavoritesResource.GetFavoritesMedia(mediaId, pn, ps);
// if (medias.Count == 0) { return; }
// GetFavoritesMediaList(medias, result, eventAggregator, cancellationToken);
//}
/// <summary>
/// 获取收藏夹内容明细列表
/// </summary>
/// <param name="medias"></param>
/// <param name="result"></param>
/// <param name="eventAggregator"></param>
public void GetFavoritesMediaList(List<Core.BiliApi.Favorites.Models.FavoritesMedia> medias, ObservableCollection<FavoritesMedia> result, IEventAggregator eventAggregator, CancellationToken cancellationToken)
{
int order = 0;
foreach (var media in medias)
{
if (media.Title == "已失效视频") { continue; }
order++;
// 查询、保存封面
StorageCover storageCover = new StorageCover();
string coverUrl = media.Cover;
BitmapImage cover = storageCover.GetCoverThumbnail(media.Id, media.Bvid, -1, coverUrl, 200, 125);
// 当地时区
DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
// 创建时间
DateTime dateCTime = startTime.AddSeconds(media.Ctime);
string ctime = dateCTime.ToString("yyyy-MM-dd");
// 收藏时间
DateTime dateFavTime = startTime.AddSeconds(media.FavTime);
string favTime = dateFavTime.ToString("yyyy-MM-dd");
App.PropertyChangeAsync(new Action(() =>
{
FavoritesMedia newMedia = new FavoritesMedia(eventAggregator)
{
Avid = media.Id,
Bvid = media.Bvid,
Order = order,
Cover = cover,
Title = media.Title,
PlayNumber = media.CntInfo != null ? Format.FormatNumber(media.CntInfo.Play) : "0",
DanmakuNumber = media.CntInfo != null ? Format.FormatNumber(media.CntInfo.Danmaku) : "0",
FavoriteNumber = media.CntInfo != null ? Format.FormatNumber(media.CntInfo.Collect) : "0",
Duration = Format.FormatDuration2(media.Duration),
UpName = media.Upper != null ? media.Upper.Name : string.Empty,
UpMid = media.Upper != null ? media.Upper.Mid : -1,
CreateTime = ctime,
FavTime = favTime
};
if (!result.ToList().Exists(t => t.Avid == newMedia.Avid))
{
result.Add(newMedia);
Thread.Sleep(10);
}
}));
// 判断是否该结束线程若为true跳出循环
if (cancellationToken.IsCancellationRequested)
{
break;
}
}
}
/// <summary>
/// 更新我创建的收藏夹列表
/// </summary>
/// <param name="mid"></param>
/// <param name="tabHeaders"></param>
public void GetCreatedFavorites(long mid, ObservableCollection<TabHeader> tabHeaders, CancellationToken cancellationToken)
{
var favorites = FavoritesInfo.GetAllCreatedFavorites(mid);
if (favorites.Count == 0) { return; }
foreach (var item in favorites)
{
//cancellationToken.ThrowIfCancellationRequested();
// 判断是否该结束线程若为true跳出循环
if (cancellationToken.IsCancellationRequested)
{
break;
}
App.PropertyChangeAsync(new Action(() =>
{
tabHeaders.Add(new TabHeader { Id = (int)item.Id, Title = item.Title, SubTitle = item.MediaCount.ToString() });
}));
}
}
/// <summary>
/// 更新我收藏的收藏夹列表
/// </summary>
/// <param name="mid"></param>
/// <param name="tabHeaders"></param>
public void GetCollectedFavorites(long mid, ObservableCollection<TabHeader> tabHeaders, CancellationToken cancellationToken)
{
var favorites = FavoritesInfo.GetAllCollectedFavorites(mid);
if (favorites.Count == 0) { return; }
foreach (var item in favorites)
{
// 判断是否该结束线程若为true跳出循环
if (cancellationToken.IsCancellationRequested)
{
break;
}
App.PropertyChangeAsync(new Action(() =>
{
tabHeaders.Add(new TabHeader { Id = (int)item.Id, Title = item.Title, SubTitle = item.MediaCount.ToString() });
}));
}
}
}
}