FnzDataSetHelper.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. using FNZCM.BlazorWasm.Models;
  2. using FNZCM.BlazorWasm.UI.Components;
  3. using FNZCM.BlazorWasm.Utility;
  4. using FNZCM.Shared.Helpers;
  5. using FNZCM.Shared.MediaModels;
  6. using Newtonsoft.Json;
  7. using System.Text;
  8. namespace FNZCM.BlazorWasm.Helpers
  9. {
  10. public class FnzDataSetHelper
  11. {
  12. private readonly ApiClient api;
  13. private readonly FnzDataSetSingleto dataSet;
  14. public FnzDataSetHelper(ApiClient api, FnzDataSetSingleto dataset)
  15. {
  16. this.api = api;
  17. this.dataSet = dataset;
  18. }
  19. public async Task InitFeModulesAsync(ProgressBar[] progress)
  20. {
  21. var mediaTagsT = api.GetMediaTagsAsync(progress);
  22. var librariesT = api.GetLibrariesAsync(progress);
  23. await Task.WhenAll(librariesT, mediaTagsT);
  24. var libraries = librariesT.Result;
  25. var mediaTags = mediaTagsT.Result;
  26. var apiBase = api.BaseAddress.ToString();
  27. var lstAllTrack = new List<FeTrack>();
  28. var lstAllTrackSet = new List<FeTrackSet>();
  29. var lstAllDisc = new List<FeDisc>();
  30. var lstAllLibrry = new List<FeLibrary>();
  31. var currentDisc = 0;
  32. var numberOfDisc = libraries.Sum(p => p.Value.Discs.Count);
  33. foreach (var lib in libraries.OrderBy(p => p.Key))
  34. {
  35. var feLib = new FeLibrary
  36. {
  37. Key = lib.Key,
  38. Name = lib.Value.Name,
  39. };
  40. lstAllLibrry.Add(feLib);
  41. var lstDiscOfLib = new List<FeDisc>();
  42. foreach (var disc in lib.Value.Discs.OrderByDescending(p => p.Key))
  43. {
  44. await progress[2].SetProgress(((float)(currentDisc++)) / numberOfDisc, $"Parsing model {currentDisc}/{numberOfDisc}");
  45. var feDisc = new FeDisc
  46. {
  47. LibKey = lib.Key,
  48. Lib = feLib,
  49. Key = disc.Key,
  50. Name = disc.Value.Name,
  51. CoverPath = $"{apiBase}cover/{lib.Key.UrlEscape()}/{disc.Key.UrlEscape()}/cover.jpg",
  52. };
  53. lstAllDisc.Add(feDisc);
  54. lstDiscOfLib.Add(feDisc);
  55. // BK
  56. if (disc.Value.Bks?.Any() == true)
  57. {
  58. var feBkOfDisc = new List<FeBk>();
  59. foreach (var item in disc.Value.Bks.OrderBy(p => p.Key))
  60. {
  61. feBkOfDisc.Add(new FeBk
  62. {
  63. Key = item.Key,
  64. Name = item.Value,
  65. Path = $"{apiBase}bk/{lib.Key.UrlEscape()}/{disc.Key.UrlEscape()}/{item.Key.UrlEscape()}",
  66. });
  67. }
  68. feDisc.Bks = feBkOfDisc.ToArray();
  69. }
  70. // Trask Set
  71. var lstTrackSetOfDisc = new List<FeTrackSet>();
  72. // Trask Set Main
  73. {
  74. var feTsMain = new FeTrackSet
  75. {
  76. LibKey = lib.Key,
  77. Lib = feLib,
  78. DiscKey = disc.Key,
  79. Disc = feDisc,
  80. Key = "main",
  81. Name = "Main",
  82. M3U8Path = $"{apiBase}list/{lib.Key.UrlEscape()}/{disc.Key.UrlEscape()}/playlist.m3u8",
  83. };
  84. lstAllTrackSet.Add(feTsMain);
  85. lstTrackSetOfDisc.Add(feTsMain);
  86. var lstTracksOfTsMain = new List<FeTrack>();
  87. foreach (var t in disc.Value.MainTracks.OrderBy(p => p.Key))
  88. {
  89. MediaTag mediaTag = mediaTags.GetEx($"/media/{lib.Key}/{disc.Key}/{t.Key}");
  90. var fet = new FeTrack
  91. {
  92. LibKey = lib.Key,
  93. Lib = feLib,
  94. DiscKey = disc.Key,
  95. Disc = feDisc,
  96. TrackSetKey = "main",
  97. TrackSet = feTsMain,
  98. Key = t.Key,
  99. Name = t.Value,
  100. Path = $"{apiBase}media/{lib.Key.UrlEscape()}/{disc.Key.UrlEscape()}/{t.Key.UrlEscape()}",
  101. Tag = MappingTag(mediaTag)
  102. };
  103. lstAllTrack.Add(fet);
  104. if (lstAllTrack.Count % 250 == 0) await Task.Delay(1);
  105. lstTracksOfTsMain.Add(fet);
  106. }
  107. feTsMain.Tracks = lstTracksOfTsMain.ToArray();
  108. feTsMain.TotalBytes = feTsMain.Tracks.Sum(p => p.Tag?.Length ?? 0);
  109. feTsMain.TotalDuration = feTsMain.Tracks.Sum(p => p.Tag?.Duration ?? 0);
  110. }
  111. // Trask Set Sub
  112. {
  113. foreach (var tSubSet in disc.Value.SubTracks.OrderBy(p => p.Key))
  114. {
  115. var feTsSub = new FeTrackSet
  116. {
  117. LibKey = lib.Key,
  118. Lib = feLib,
  119. DiscKey = disc.Key,
  120. Disc = feDisc,
  121. Key = tSubSet.Key,
  122. Name = tSubSet.Value.Name,
  123. M3U8Path = $"{apiBase}list/{lib.Key.UrlEscape()}/{disc.Key.UrlEscape()}/{tSubSet.Key.UrlEscape()}/playlist.m3u8",
  124. };
  125. lstAllTrackSet.Add(feTsSub);
  126. if (lstAllTrack.Count % 250 == 0) await Task.Delay(1);
  127. lstTrackSetOfDisc.Add(feTsSub);
  128. var lstTracksOfTsSub = new List<FeTrack>();
  129. foreach (var t in tSubSet.Value.Tracks.OrderBy(p => p.Key))
  130. {
  131. MediaTag mediaTag = mediaTags.GetEx($"/media/{lib.Key}/{disc.Key}/{tSubSet.Key}/{t.Key}");
  132. var fet = new FeTrack
  133. {
  134. LibKey = lib.Key,
  135. Lib = feLib,
  136. DiscKey = disc.Key,
  137. Disc = feDisc,
  138. TrackSetKey = tSubSet.Key,
  139. TrackSet = feTsSub,
  140. Key = t.Key,
  141. Name = t.Value,
  142. Path = $"{apiBase}media/{lib.Key.UrlEscape()}/{disc.Key.UrlEscape()}/{tSubSet.Key.UrlEscape()}/{t.Key.UrlEscape()}",
  143. Tag = MappingTag(mediaTag)
  144. };
  145. lstAllTrack.Add(fet);
  146. lstTracksOfTsSub.Add(fet);
  147. }
  148. feTsSub.Tracks = lstTracksOfTsSub.ToArray();
  149. feTsSub.TotalBytes = feTsSub.Tracks.Sum(p => p.Tag?.Length ?? 0);
  150. feTsSub.TotalDuration = feTsSub.Tracks.Sum(p => p.Tag?.Duration ?? 0);
  151. }// end foreach sub track set
  152. }
  153. feDisc.TrackSets = lstTrackSetOfDisc.ToArray();
  154. }// end foreach disc
  155. feLib.Discs = lstDiscOfLib.ToArray();
  156. var lstCatalogOfLib = new List<FeLibraryCatalog>();
  157. var trackSetKeys = feLib.Discs.SelectMany(p => p.TrackSets.Select(q => q.Key)).Distinct().ToArray();
  158. foreach (var tsKey in trackSetKeys)
  159. {
  160. var cat = new FeLibraryCatalog
  161. {
  162. Name = tsKey.ToUpper(),
  163. PlaylistPath = tsKey == "main"
  164. ? $"{apiBase}lib_list/{lib.Key.UrlEscape()}/playlist.m3u8"
  165. : $"{apiBase}lib_list/{lib.Key.UrlEscape()}/{tsKey.UrlEscape()}/playlist.m3u8",
  166. TotalBytes = feLib.Discs
  167. .Sum(p => p.TrackSets
  168. .Where(p => p.Key == tsKey)
  169. .Sum(q => q.Tracks
  170. .Sum(r => r.Tag?.Length ?? 0)
  171. )
  172. ),
  173. TotalDuration = feLib.Discs
  174. .Sum(p => p.TrackSets
  175. .Where(p => p.Key == tsKey)
  176. .Sum(q => q.Tracks
  177. .Sum(r => r.Tag?.Duration ?? 0)
  178. )
  179. ),
  180. };
  181. lstCatalogOfLib.Add(cat);
  182. }
  183. feLib.Catalogs = lstCatalogOfLib.ToArray();
  184. }// end foreach lib
  185. await progress[2].ForceUpdate();
  186. dataSet.AllTracks = lstAllTrack.ToArray();
  187. dataSet.AllTracksSet = lstAllTrackSet.ToArray();
  188. dataSet.AllDisc = lstAllDisc.ToArray();
  189. dataSet.AllLibrary = lstAllLibrry.ToArray();
  190. }
  191. private static FeMediaTag MappingTag(MediaTag mediaTag)
  192. {
  193. if (mediaTag == null) return null;
  194. var m = new FeMediaTag
  195. {
  196. Album = mediaTag.Album,
  197. DiscNum = mediaTag.DiscNum,
  198. TrackNum = mediaTag.DiscNum,
  199. Title = mediaTag.Title,
  200. Artist = mediaTag.Artist,
  201. Duration = mediaTag.Duration,
  202. Length = mediaTag.Length,
  203. Bit = mediaTag.Bit,
  204. Freq = mediaTag.Freq,
  205. };
  206. var lst = new List<string>();
  207. if (m.Bit != 0) lst.Add($"{m.Bit}b");
  208. if (m.Freq != 0) lst.Add($"{m.Freq / 100f}");
  209. m.ParamDesc = string.Join("", lst);
  210. return m;
  211. }
  212. }
  213. }