FnzDataSetHelper.cs 10 KB

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