@@ -87,9 +87,29 @@ final class LibraryViewModel: ObservableObject {
87
87
88
88
// refresh library
89
89
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
+ }
93
113
}
94
114
let parser = try await parse ( data: data)
95
115
// delete all old ISO Lang Code entries if needed, by passing in an empty parser
@@ -138,6 +158,22 @@ final class LibraryViewModel: ObservableObject {
138
158
}
139
159
CategoriesToLanguages . save ( dictionary)
140
160
}
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
+ }
141
177
142
178
/// The fetched content is filtered by the languages set in settings.
143
179
/// We need to make sure, whatever was set by the user is
0 commit comments