@@ -87,9 +87,29 @@ final class LibraryViewModel: ObservableObject {
8787
8888 // refresh library
8989 guard let data = try await fetchData ( ) else {
90- error = nil
91- process. state = . complete
92- return
90+ // this is the case when we have no new data (304 http)
91+ // but we still need to refresh the memory only stored
92+ // zimfile categories to languages dictionary
93+ if CategoriesToLanguages . allCategories ( ) . count < 2 {
94+ let context = Database . shared. viewContext
95+ if let zimFiles: [ ZimFile ] = try ? context. fetch ( ZimFile . fetchRequest ( ) ) {
96+ saveCategoryAvailableInLanguages ( fromDBZimFiles: zimFiles)
97+ // populate library language code if there isn't one set already
98+ await setDefaultContentFilterLanguage ( )
99+
100+ error = nil
101+ process. state = . complete
102+ return
103+ } else {
104+ error = LibraryRefreshError . process
105+ process. state = . error
106+ return
107+ }
108+ } else {
109+ error = nil
110+ process. state = . complete
111+ return
112+ }
93113 }
94114 let parser = try await parse ( data: data)
95115 // delete all old ISO Lang Code entries if needed, by passing in an empty parser
@@ -138,6 +158,22 @@ final class LibraryViewModel: ObservableObject {
138158 }
139159 CategoriesToLanguages . save ( dictionary)
140160 }
161+
162+ private func saveCategoryAvailableInLanguages( fromDBZimFiles zimFiles: [ ZimFile ] ) {
163+ var dictionary : [ Category : Set < String > ] = [ : ]
164+ for zimFile in zimFiles {
165+ let category = Category ( rawValue: zimFile. category) ?? . other
166+ let allLanguagesForCategory : Set < String >
167+ let categoryLanguages : Set < String > = Set < String > ( zimFile. languageCode. components ( separatedBy: " , " ) )
168+ if let existingLanguages = dictionary [ category] {
169+ allLanguagesForCategory = existingLanguages. union ( categoryLanguages)
170+ } else {
171+ allLanguagesForCategory = categoryLanguages
172+ }
173+ dictionary [ category] = allLanguagesForCategory
174+ }
175+ CategoriesToLanguages . save ( dictionary)
176+ }
141177
142178 /// The fetched content is filtered by the languages set in settings.
143179 /// We need to make sure, whatever was set by the user is
0 commit comments