11using System ;
2+ using System . Collections . Concurrent ;
23using System . Collections . Generic ;
34using System . Linq ;
45using System . Net ;
@@ -38,10 +39,11 @@ public override async Task<Book> Get(Uri url) {
3839 var id = GetId ( url ) ;
3940
4041 var details = await GetBook ( id ) ;
41- var detailBook = details . Items . FirstOrDefault ( d => d . TextBook != default ) ? . TextBook ??
42- details . Items . FirstOrDefault ( d => d . AudioBook != default ) ? . AudioBook ??
43- details . Items . FirstOrDefault ( d => d . ComicBook != default ) ? . ComicBook ??
44- details . Items . FirstOrDefault ( d => d . PressBook != default ) ? . PressBook ;
42+ var detailBook = details ? . Items . FirstOrDefault ( d => d . TextBook != default ) ? . TextBook ??
43+ details ? . Items . FirstOrDefault ( d => d . AudioBook != default ) ? . AudioBook ??
44+ details ? . Items . FirstOrDefault ( d => d . ComicBook != default ) ? . ComicBook ??
45+ details ? . Items . FirstOrDefault ( d => d . PressBook != default ) ? . PressBook ??
46+ await GetSerial ( id ) ;
4547
4648 if ( detailBook == default ) {
4749 throw new Exception ( "Не удалось получить книгу" ) ;
@@ -55,15 +57,27 @@ public override async Task<Book> Get(Uri url) {
5557 Annotation = detailBook . Annotation ,
5658 } ;
5759
58- var origBook = await GetOriginalFile ( id ) ;
59- if ( origBook . Extension == ".epub" ) {
60- book . Chapters = await FillChaptersFromEpub ( origBook ) ;
60+ if ( Config . Options . NoChapters ) {
61+ return book ;
62+ }
63+
64+ var origBooks = await GetOriginalFiles ( id ) ;
65+ if ( origBooks . Count == 1 ) {
66+ if ( detailBook . ContentInfo . FileType == "EPUB" ) {
67+ book . Chapters = await FillChaptersFromEpub ( origBooks [ 0 ] ) ;
68+ } else {
69+ Config . Logger . LogInformation ( "Эта книга не в формате epub. Получить главы невозможно" ) ;
70+ }
6171 } else {
62- Config . Logger . LogInformation ( "Эта книга не в формате epub. Получить главы невозможно" ) ;
72+ if ( detailBook . ContentInfo . FileType == "JPG" ) {
73+ book . Chapters = FillChaptersFromImages ( detailBook , origBooks ) ;
74+ }
6375 }
64-
76+
6577 if ( Config . Options . HasAdditionalType ( AdditionalTypeEnum . Books ) ) {
66- book . AdditionalFiles . Add ( AdditionalTypeEnum . Books , origBook ) ;
78+ foreach ( var origBook in origBooks ) {
79+ book . AdditionalFiles . Add ( AdditionalTypeEnum . Books , origBook ) ;
80+ }
6781 }
6882
6983 if ( Config . Options . HasAdditionalType ( AdditionalTypeEnum . Audio ) ) {
@@ -73,18 +87,43 @@ public override async Task<Book> Get(Uri url) {
7387 return book ;
7488 }
7589
76- private async Task < TempFile > GetOriginalFile ( string bookId ) {
77- var fileMeta = await GetFileMeta ( bookId ) ;
78- var fileUrl = await GetFileUrl ( fileMeta . FirstOrDefault ( ) ) ;
79- var response = await Config . Client . GetWithTriesAsync ( fileUrl . Url . AsUri ( ) ) ;
80- Config . Logger . LogInformation ( $ "Оригинальный файл доступен по ссылке { fileUrl . Url . AsUri ( ) } ") ;
81- return await TempFile . Create ( fileUrl . Url . AsUri ( ) , Config . TempFolder . Path , fileUrl . Url . AsUri ( ) . GetFileName ( ) , await response . Content . ReadAsStreamAsync ( ) ) ;
90+ private static IEnumerable < Chapter > FillChaptersFromImages ( StrokiMtsBookItem book , IEnumerable < TempFile > images ) {
91+ var sb = new StringBuilder ( ) ;
92+ foreach ( var image in images ) {
93+ sb . Append ( $ "<img src=\" { image . FullName } \" />") ;
94+ }
95+
96+ var chapter = new Chapter {
97+ Images = images ,
98+ Content = sb . ToString ( ) ,
99+ Title = book . Title ,
100+ } ;
101+
102+ return new List < Chapter > { chapter } ;
103+ }
104+
105+ private async Task < List < TempFile > > GetOriginalFiles ( string bookId ) {
106+ var fileMetas = await GetFileMeta ( bookId ) ;
107+ var result = new ConcurrentBag < Tuple < TempFile , int > > ( ) ;
108+
109+ var tuples = fileMetas . Select ( ( file , i ) => Tuple . Create ( file , i ) ) ;
110+ await Parallel . ForEachAsync ( tuples , async ( t , _ ) => {
111+ var fileUrl = await GetFileUrl ( t . Item1 ) ;
112+ var response = await Config . Client . GetWithTriesAsync ( fileUrl . Url . AsUri ( ) ) ;
113+ Config . Logger . LogInformation ( $ "Оригинальный файл доступен по ссылке { fileUrl . Url . AsUri ( ) } ") ;
114+ var tempFile = await TempFile . Create ( fileUrl . Url . AsUri ( ) , Config . TempFolder . Path , fileUrl . Url . AsUri ( ) . GetFileName ( ) , await response . Content . ReadAsStreamAsync ( _ ) ) ;
115+
116+ result . Add ( Tuple . Create ( tempFile , t . Item2 ) ) ;
117+ } ) ;
118+
119+
120+ return result . OrderBy ( t => t . Item2 ) . Select ( t => t . Item1 ) . ToList ( ) ;
82121 }
83122
84123 private async Task < List < TempFile > > GetAudio ( StrokiMtsApiMultiResponse details ) {
85124 var result = new List < TempFile > ( ) ;
86125
87- var detail = details . Items . FirstOrDefault ( d => d . AudioBook != default ) ;
126+ var detail = details ? . Items . FirstOrDefault ( d => d . AudioBook != default ) ;
88127 if ( detail == default ) {
89128 return result ;
90129 }
@@ -131,7 +170,12 @@ private async Task<StrokiMtsFileUrl> GetFileUrl(StrokiMtsFile file) {
131170 }
132171
133172 private async Task < StrokiMtsApiMultiResponse > GetBook ( string id ) {
134- var json = await SendAsync < StrokiMtsApiResponse < StrokiMtsApiMultiResponse > > ( ( ) => GetMessage ( SystemUrl . MakeRelativeUri ( $ "/api/books/multi/{ id } ") , "5.38.0" , "5.3" ) ) ;
173+ var json = await SendAsync < StrokiMtsApiResponse < StrokiMtsApiMultiResponse > > ( ( ) => GetMessage ( SystemUrl . MakeRelativeUri ( $ "/api/books/multi/{ id } ") , "5.53" , "7.0" ) ) ;
174+ return json . Data ;
175+ }
176+
177+ private async Task < StrokiMtsBookItem > GetSerial ( string id ) {
178+ var json = await SendAsync < StrokiMtsApiResponse < StrokiMtsBookItem > > ( ( ) => GetMessage ( SystemUrl . MakeRelativeUri ( $ "/api/serials/episodes/{ id } ") , "5.53" , "7.0" ) ) ;
135179 return json . Data ;
136180 }
137181
0 commit comments