FnzDataSetHelper.cs 10 KB

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