un fucky my wucky
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						| @ -1,5 +1,4 @@ | |||||||
| .gradle | .gradle | ||||||
| .secrets |  | ||||||
| /local.properties | /local.properties | ||||||
| /.idea/workspace.xml | /.idea/workspace.xml | ||||||
| .DS_Store | .DS_Store | ||||||
|  | |||||||
| @ -6,7 +6,7 @@ | |||||||
| 
 | 
 | ||||||
| # Usage | # Usage | ||||||
| 
 | 
 | ||||||
| https://github.com/keiyoushi/extensions/blob/main/README.md | [Getting started](https://keiyoushi.github.io/docs/guides/getting-started#adding-the-extension-repo) | ||||||
| 
 | 
 | ||||||
| # Contributing | # Contributing | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,383 +0,0 @@ | |||||||
| ## 1.4.47 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.151.0` |  | ||||||
| 
 |  | ||||||
| ### Feat |  | ||||||
| 
 |  | ||||||
| * add support for AVIF and HEIF image types |  | ||||||
| 
 |  | ||||||
| ## 1.4.46 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.151.0` |  | ||||||
| 
 |  | ||||||
| ### Feat |  | ||||||
| 
 |  | ||||||
| * Update to extension-lib 1.4 |  | ||||||
|   - Clicking on chapter WebView should now open the chapter/book page. |  | ||||||
| 
 |  | ||||||
| ## 1.3.45 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.151.0` |  | ||||||
| 
 |  | ||||||
| ### Feat |  | ||||||
| 
 |  | ||||||
| * Edit source display name |  | ||||||
| 
 |  | ||||||
| ## 1.3.44 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.151.0` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * Better date/time parsing |  | ||||||
| 
 |  | ||||||
| ## 1.3.43 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.151.0` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * Requests failing if address preference is saved with a trailing slash |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * Add URL validation in the address preferences |  | ||||||
| * Use a URL-focused keyboard when available while editing the address preferences |  | ||||||
| 
 |  | ||||||
| ## 1.3.42 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.151.0` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * default sort broken since Komga 0.155.1 |  | ||||||
| * proper sort criteria for readlists |  | ||||||
| 
 |  | ||||||
| ## 1.3.41 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.151.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * Improve how the status is displayed |  | ||||||
| 
 |  | ||||||
| ## 1.3.40 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.151.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * Exclude from bulk update warnings |  | ||||||
| 
 |  | ||||||
| ## 1.2.39 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.151.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * Prepend series name in front of books within readlists |  | ||||||
| 
 |  | ||||||
| ## 1.2.38 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.113.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * Add `README.md` |  | ||||||
| 
 |  | ||||||
| ## 1.2.37 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.113.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * In app link to `CHANGELOG.md` |  | ||||||
| 
 |  | ||||||
| ## 1.2.36 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.113.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * Don't request conversion for JPEG XL images |  | ||||||
| 
 |  | ||||||
| ## 1.2.35 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.113.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * Display the Translators of a book in the scanlator chapter field |  | ||||||
| 
 |  | ||||||
| ## 1.2.34 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.113.0` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * Loading of filter values could fail in some cases |  | ||||||
| 
 |  | ||||||
| ## 1.2.33 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.113.0` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * Open in WebView and Share options now open regular browser link instead of showing JSON |  | ||||||
| * Note that Komga cannot be viewed using System WebView since there is no login prompt |  | ||||||
|   However, opening in a regular browser works. |  | ||||||
| 
 |  | ||||||
| ## 1.2.32 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.113.0` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * Source language, conventionally set to "en", is now changed to "all" |  | ||||||
| * Downloaded files, if any, will have to be moved to new location |  | ||||||
|     - `Komga (EN)` to `Komga (ALL)` |  | ||||||
|     - `Komga (3) (EN)` to `Komga (3) (ALL)` |  | ||||||
| 
 |  | ||||||
| ## 1.2.31 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.113.0` |  | ||||||
| 
 |  | ||||||
| ### Refactor |  | ||||||
| 
 |  | ||||||
| * replace Gson with kotlinx.serialization  |  | ||||||
| 
 |  | ||||||
| ## 1.2.30 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.113.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * display read list summary |  | ||||||
| * display aggregated tags on series |  | ||||||
| * search series by book tags |  | ||||||
| 
 |  | ||||||
| ## 1.2.29 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.97.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * filter deleted series and books |  | ||||||
| 
 |  | ||||||
| ## 1.2.28 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.97.0` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * incorrect User Agent |  | ||||||
| 
 |  | ||||||
| ## 1.2.27 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.97.0` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * filter series by read or in progress |  | ||||||
| 
 |  | ||||||
| ## 1.2.26 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.87.4` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * show series with only in progress books when searching for unread only |  | ||||||
| 
 |  | ||||||
| ## 1.2.25 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.87.4` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * sort order for read list books |  | ||||||
| 
 |  | ||||||
| ## 1.2.24 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.87.4` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * only show series tags in the filter panel |  | ||||||
| * set URL properly on series and read lists, so restoring from a backup can work properly |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| ## 1.2.23 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.75.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * ignore DNS over HTTPS so it can reach IP addresses |  | ||||||
| 
 |  | ||||||
| ## 1.2.22 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.75.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * add error logs and better catch exceptions |  | ||||||
| 
 |  | ||||||
| ## 1.2.21 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.75.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * browse read lists (from the filter menu) |  | ||||||
| * filter by collection, respecting the collection's ordering |  | ||||||
| 
 |  | ||||||
| ## 1.2.20 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.75.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * filter by authors, grouped by role |  | ||||||
| 
 |  | ||||||
| ## 1.2.19 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.68.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * display Series authors |  | ||||||
| * display Series summary from books if no summary exists for Series |  | ||||||
| 
 |  | ||||||
| ## 1.2.18 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.63.2` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * use metadata.releaseDate or fileLastModified for chapter date |  | ||||||
| 
 |  | ||||||
| ## 1.2.17 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.63.2` |  | ||||||
| 
 |  | ||||||
| ### Fix |  | ||||||
| 
 |  | ||||||
| * list of collections for filtering could be empty in some conditions |  | ||||||
| 
 |  | ||||||
| ## 1.2.16 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.59.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * filter by genres, tags and publishers |  | ||||||
| 
 |  | ||||||
| ## 1.2.15 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.56.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * remove the 1000 chapters limit |  | ||||||
| * display series description and tags (genres + tags) |  | ||||||
| 
 |  | ||||||
| ## 1.2.14 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.41.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * change chapter display name to use the display number instead of the sort number |  | ||||||
| 
 |  | ||||||
| ## 1.2.13 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.41.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * compatibility for the upcoming version of Komga which have changes in the API (IDs are String instead of Long) |  | ||||||
| 
 |  | ||||||
| ## 1.2.12 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.41.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * filter by collection |  | ||||||
| 
 |  | ||||||
| ## 1.2.11 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.35.2` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * Set password preferences inputTypes |  | ||||||
| 
 |  | ||||||
| ## 1.2.10 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.35.2` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * unread only filter (closes gotson/komga#180) |  | ||||||
| * prefix book titles with number (closes gotson/komga#169) |  | ||||||
| 
 |  | ||||||
| ## 1.2.9 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.22.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * use SourceFactory to have multiple Komga servers (3 for the moment) |  | ||||||
| 
 |  | ||||||
| ## 1.2.8 |  | ||||||
| 
 |  | ||||||
| Minimum Komga version required: `0.22.0` |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * use book metadata title for chapter display name |  | ||||||
| * use book metadata sort number for chapter number |  | ||||||
| 
 |  | ||||||
| ## 1.2.7 |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * use series metadata title for display name |  | ||||||
| * filter on series status |  | ||||||
| 
 |  | ||||||
| ## 1.2.6 |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * Add support for AndroidX preferences  |  | ||||||
| 
 |  | ||||||
| ## 1.2.5 |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * add sort options in filter |  | ||||||
| 
 |  | ||||||
| ## 1.2.4 |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * better handling of authentication |  | ||||||
| 
 |  | ||||||
| ## 1.2.3 |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * filters by library |  | ||||||
| 
 |  | ||||||
| ## 1.2.2 |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * request converted image from server if format is not supported |  | ||||||
| 
 |  | ||||||
| ## 1.2.1 |  | ||||||
| 
 |  | ||||||
| ### Features |  | ||||||
| 
 |  | ||||||
| * first version |  | ||||||
| @ -1,35 +0,0 @@ | |||||||
| # Komga |  | ||||||
| 
 |  | ||||||
| Table of Content |  | ||||||
| - [FAQ](#FAQ) |  | ||||||
|   - [Why do I see no manga?](#why-do-i-see-no-manga) |  | ||||||
|   - [Where can I get more information about Komga?](#where-can-i-get-more-information-about-komga) |  | ||||||
|   - [The Komga extension stopped working?](#the-komga-extension-stopped-working) |  | ||||||
|   - [Can I add more than one Komga server or user?](#can-i-add-more-than-one-komga-server-or-user) |  | ||||||
|   - [Can I test the Komga extension before setting up my own server?](#can-i-test-the-komga-extension-before-setting-up-my-own-server) |  | ||||||
| - [Guides](#Guides) |  | ||||||
|   - [How do I add my Komga server to Tachiyomi?](#how-do-i-add-my-komga-server-to-tachiyomi) |  | ||||||
| 
 |  | ||||||
| Don't find the question you are look for go check out our general FAQs and Guides over at [Extension FAQ](https://tachiyomi.org/help/faq/#extensions) or [Getting Started](https://tachiyomi.org/help/guides/getting-started/#installation) |  | ||||||
| 
 |  | ||||||
| ## FAQ |  | ||||||
| 
 |  | ||||||
| ### Why do I see no manga? |  | ||||||
| Komga is a self-hosted comic/manga media server. |  | ||||||
| 
 |  | ||||||
| ### Where can I get more information about Komga? |  | ||||||
| You can visit the [Komga](https://komga.org/) website for for more information. |  | ||||||
| 
 |  | ||||||
| ### The Komga extension stopped working? |  | ||||||
| Make sure that your Komga server and extension are on the newest version. |  | ||||||
| 
 |  | ||||||
| ### Can I add more than one Komga server or user? |  | ||||||
| Yes, currently you can add up to 3 different Komga instances to Tachiyomi. |  | ||||||
| 
 |  | ||||||
| ### Can I test the Komga extension before setting up my own server? |  | ||||||
| Yes, you can try it out with the DEMO server `https://demo.komga.org`, username `demo@komga.org` and password `komga-demo`. |  | ||||||
| 
 |  | ||||||
| ## Guides |  | ||||||
| 
 |  | ||||||
| ### How do I add my Komga server to Tachiyomi? |  | ||||||
| Go into the settings of the Komga extension from the Extension tab in Browse and fill in your server address and login details. |  | ||||||
| @ -1,12 +1,3 @@ | |||||||
| <<<<<<< HEAD |  | ||||||
| ext { |  | ||||||
|     extName = 'Komga' |  | ||||||
|     extClass = '.KomgaFactory' |  | ||||||
|     extVersionCode = 50 |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| apply from: "$rootDir/common.gradle" |  | ||||||
| ======= |  | ||||||
| ext { | ext { | ||||||
|     extName = 'Komga' |     extName = 'Komga' | ||||||
|     extClass = '.KomgaFactory' |     extClass = '.KomgaFactory' | ||||||
| @ -18,4 +9,3 @@ apply from: "$rootDir/common.gradle" | |||||||
| dependencies { | dependencies { | ||||||
|     implementation("org.apache.commons:commons-text:1.11.0") |     implementation("org.apache.commons:commons-text:1.11.0") | ||||||
| } | } | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|  | |||||||
							
								
								
									
										0
									
								
								src/all/komga/res/mipmap-hdpi/ic_launcher.png
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB | 
							
								
								
									
										0
									
								
								src/all/komga/res/mipmap-mdpi/ic_launcher.png
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB | 
							
								
								
									
										0
									
								
								src/all/komga/res/mipmap-xhdpi/ic_launcher.png
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 8.0 KiB | 
							
								
								
									
										0
									
								
								src/all/komga/res/mipmap-xxhdpi/ic_launcher.png
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB | 
							
								
								
									
										0
									
								
								src/all/komga/res/mipmap-xxxhdpi/ic_launcher.png
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB | 
| @ -9,10 +9,7 @@ import android.util.Log | |||||||
| import android.widget.Button | import android.widget.Button | ||||||
| import android.widget.Toast | import android.widget.Toast | ||||||
| import androidx.preference.EditTextPreference | import androidx.preference.EditTextPreference | ||||||
| <<<<<<< HEAD |  | ||||||
| ======= |  | ||||||
| import androidx.preference.ListPreference | import androidx.preference.ListPreference | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| import androidx.preference.PreferenceScreen | import androidx.preference.PreferenceScreen | ||||||
| import eu.kanade.tachiyomi.AppInfo | import eu.kanade.tachiyomi.AppInfo | ||||||
| import eu.kanade.tachiyomi.extension.all.komga.dto.AuthorDto | import eu.kanade.tachiyomi.extension.all.komga.dto.AuthorDto | ||||||
| @ -24,11 +21,6 @@ import eu.kanade.tachiyomi.extension.all.komga.dto.PageWrapperDto | |||||||
| import eu.kanade.tachiyomi.extension.all.komga.dto.ReadListDto | import eu.kanade.tachiyomi.extension.all.komga.dto.ReadListDto | ||||||
| import eu.kanade.tachiyomi.extension.all.komga.dto.SeriesDto | import eu.kanade.tachiyomi.extension.all.komga.dto.SeriesDto | ||||||
| import eu.kanade.tachiyomi.network.GET | import eu.kanade.tachiyomi.network.GET | ||||||
| <<<<<<< HEAD |  | ||||||
| import eu.kanade.tachiyomi.network.asObservable |  | ||||||
| import eu.kanade.tachiyomi.network.await |  | ||||||
| ======= |  | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| import eu.kanade.tachiyomi.source.ConfigurableSource | import eu.kanade.tachiyomi.source.ConfigurableSource | ||||||
| import eu.kanade.tachiyomi.source.UnmeteredSource | import eu.kanade.tachiyomi.source.UnmeteredSource | ||||||
| import eu.kanade.tachiyomi.source.model.Filter | import eu.kanade.tachiyomi.source.model.Filter | ||||||
| @ -42,20 +34,12 @@ import kotlinx.serialization.decodeFromString | |||||||
| import kotlinx.serialization.json.Json | import kotlinx.serialization.json.Json | ||||||
| import okhttp3.Credentials | import okhttp3.Credentials | ||||||
| import okhttp3.Dns | import okhttp3.Dns | ||||||
| <<<<<<< HEAD |  | ||||||
| import okhttp3.Headers |  | ||||||
| ======= |  | ||||||
| import okhttp3.HttpUrl.Companion.toHttpUrl | import okhttp3.HttpUrl.Companion.toHttpUrl | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| import okhttp3.HttpUrl.Companion.toHttpUrlOrNull | import okhttp3.HttpUrl.Companion.toHttpUrlOrNull | ||||||
| import okhttp3.OkHttpClient | import okhttp3.OkHttpClient | ||||||
| import okhttp3.Request | import okhttp3.Request | ||||||
| import okhttp3.Response | import okhttp3.Response | ||||||
| <<<<<<< HEAD |  | ||||||
| import rx.Observable |  | ||||||
| ======= |  | ||||||
| import org.apache.commons.text.StringSubstitutor | import org.apache.commons.text.StringSubstitutor | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| import rx.Single | import rx.Single | ||||||
| import rx.schedulers.Schedulers | import rx.schedulers.Schedulers | ||||||
| import uy.kohesive.injekt.Injekt | import uy.kohesive.injekt.Injekt | ||||||
| @ -65,10 +49,6 @@ import java.security.MessageDigest | |||||||
| import java.util.Locale | import java.util.Locale | ||||||
| 
 | 
 | ||||||
| open class Komga(private val suffix: String = "") : ConfigurableSource, UnmeteredSource, HttpSource() { | open class Komga(private val suffix: String = "") : ConfigurableSource, UnmeteredSource, HttpSource() { | ||||||
| <<<<<<< HEAD |  | ||||||
|     override fun popularMangaRequest(page: Int): Request = |  | ||||||
|         GET("$baseUrl/api/v1/series?page=${page - 1}&deleted=false&sort=metadata.titleSort,asc", headers) |  | ||||||
| ======= |  | ||||||
| 
 | 
 | ||||||
|     override val name by lazy { "Komga${displayName.ifBlank { suffix }.let { if (it.isNotBlank()) " ($it)" else "" }}" } |     override val name by lazy { "Komga${displayName.ifBlank { suffix }.let { if (it.isNotBlank()) " ($it)" else "" }}" } | ||||||
| 
 | 
 | ||||||
| @ -118,31 +98,23 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|             "", |             "", | ||||||
|             FilterList(SeriesSort()), |             FilterList(SeriesSort()), | ||||||
|         ) |         ) | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| 
 | 
 | ||||||
|     override fun popularMangaParse(response: Response): MangasPage = |     override fun popularMangaParse(response: Response): MangasPage = | ||||||
|         processSeriesPage(response) |         processSeriesPage(response) | ||||||
| 
 | 
 | ||||||
|     override fun latestUpdatesRequest(page: Int): Request = |     override fun latestUpdatesRequest(page: Int): Request = | ||||||
| <<<<<<< HEAD |  | ||||||
|         GET("$baseUrl/api/v1/series/latest?page=${page - 1}&deleted=false", headers) |  | ||||||
| ======= |  | ||||||
|         searchMangaRequest( |         searchMangaRequest( | ||||||
|             page, |             page, | ||||||
|             "", |             "", | ||||||
|             FilterList(SeriesSort(Filter.Sort.Selection(2, false))), |             FilterList(SeriesSort(Filter.Sort.Selection(2, false))), | ||||||
|         ) |         ) | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| 
 | 
 | ||||||
|     override fun latestUpdatesParse(response: Response): MangasPage = |     override fun latestUpdatesParse(response: Response): MangasPage = | ||||||
|         processSeriesPage(response) |         processSeriesPage(response) | ||||||
| 
 | 
 | ||||||
|     override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { |     override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { | ||||||
| <<<<<<< HEAD |  | ||||||
| ======= |  | ||||||
|         runCatching { fetchFilterOptions() } |         runCatching { fetchFilterOptions() } | ||||||
| 
 | 
 | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|         val collectionId = (filters.find { it is CollectionSelect } as? CollectionSelect)?.let { |         val collectionId = (filters.find { it is CollectionSelect } as? CollectionSelect)?.let { | ||||||
|             it.values[it.state].id |             it.values[it.state].id | ||||||
|         } |         } | ||||||
| @ -153,11 +125,7 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|             else -> "series" |             else -> "series" | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| <<<<<<< HEAD |  | ||||||
|         val url = "$baseUrl/api/v1/$type?search=$query&page=${page - 1}&deleted=false".toHttpUrlOrNull()!!.newBuilder() |  | ||||||
| ======= |  | ||||||
|         val url = "$baseUrl/api/v1/$type?search=$query&page=${page - 1}&deleted=false".toHttpUrl().newBuilder() |         val url = "$baseUrl/api/v1/$type?search=$query&page=${page - 1}&deleted=false".toHttpUrl().newBuilder() | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| 
 | 
 | ||||||
|         filters.forEach { filter -> |         filters.forEach { filter -> | ||||||
|             when (filter) { |             when (filter) { | ||||||
| @ -178,65 +146,29 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 is LibraryGroup -> { |                 is LibraryGroup -> { | ||||||
| <<<<<<< HEAD |  | ||||||
|                     val libraryToInclude = mutableListOf<String>() |  | ||||||
|                     filter.state.forEach { content -> |  | ||||||
|                         if (content.state) { |  | ||||||
|                             libraryToInclude.add(content.id) |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
| ======= |  | ||||||
|                     val libraryToInclude = filter.state.filter { it.state }.map { it.id } |                     val libraryToInclude = filter.state.filter { it.state }.map { it.id } | ||||||
| 
 | 
 | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|                     if (libraryToInclude.isNotEmpty()) { |                     if (libraryToInclude.isNotEmpty()) { | ||||||
|                         url.addQueryParameter("library_id", libraryToInclude.joinToString(",")) |                         url.addQueryParameter("library_id", libraryToInclude.joinToString(",")) | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 is StatusGroup -> { |                 is StatusGroup -> { | ||||||
| <<<<<<< HEAD |  | ||||||
|                     val statusToInclude = mutableListOf<String>() |  | ||||||
|                     filter.state.forEach { content -> |  | ||||||
|                         if (content.state) { |  | ||||||
|                             statusToInclude.add(content.name.uppercase(Locale.ROOT)) |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
| ======= |  | ||||||
|                     val statusToInclude = filter.state.filter { it.state }.map { it.name.uppercase(Locale.ROOT) } |                     val statusToInclude = filter.state.filter { it.state }.map { it.name.uppercase(Locale.ROOT) } | ||||||
| 
 | 
 | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|                     if (statusToInclude.isNotEmpty()) { |                     if (statusToInclude.isNotEmpty()) { | ||||||
|                         url.addQueryParameter("status", statusToInclude.joinToString(",")) |                         url.addQueryParameter("status", statusToInclude.joinToString(",")) | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 is GenreGroup -> { |                 is GenreGroup -> { | ||||||
| <<<<<<< HEAD |  | ||||||
|                     val genreToInclude = mutableListOf<String>() |  | ||||||
|                     filter.state.forEach { content -> |  | ||||||
|                         if (content.state) { |  | ||||||
|                             genreToInclude.add(content.name) |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
| ======= |  | ||||||
|                     val genreToInclude = filter.state.filter { it.state }.map { it.name } |                     val genreToInclude = filter.state.filter { it.state }.map { it.name } | ||||||
| 
 | 
 | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|                     if (genreToInclude.isNotEmpty()) { |                     if (genreToInclude.isNotEmpty()) { | ||||||
|                         url.addQueryParameter("genre", genreToInclude.joinToString(",")) |                         url.addQueryParameter("genre", genreToInclude.joinToString(",")) | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 is TagGroup -> { |                 is TagGroup -> { | ||||||
| <<<<<<< HEAD |  | ||||||
|                     val tagToInclude = mutableListOf<String>() |  | ||||||
|                     filter.state.forEach { content -> |  | ||||||
|                         if (content.state) { |  | ||||||
|                             tagToInclude.add(content.name) |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
| ======= |  | ||||||
|                     val tagToInclude = filter.state.filter { it.state }.map { it.name } |                     val tagToInclude = filter.state.filter { it.state }.map { it.name } | ||||||
| 
 | 
 | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|                     if (tagToInclude.isNotEmpty()) { |                     if (tagToInclude.isNotEmpty()) { | ||||||
|                         url.addQueryParameter("tag", tagToInclude.joinToString(",")) |                         url.addQueryParameter("tag", tagToInclude.joinToString(",")) | ||||||
|                     } |                     } | ||||||
| @ -253,34 +185,13 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 is AuthorGroup -> { |                 is AuthorGroup -> { | ||||||
| <<<<<<< HEAD |  | ||||||
|                     val authorToInclude = mutableListOf<AuthorDto>() |  | ||||||
|                     filter.state.forEach { content -> |  | ||||||
|                         if (content.state) { |  | ||||||
|                             authorToInclude.add(content.author) |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
| ======= |  | ||||||
|                     val authorToInclude = filter.state.filter { it.state }.map { it.author } |                     val authorToInclude = filter.state.filter { it.state }.map { it.author } | ||||||
| 
 | 
 | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|                     authorToInclude.forEach { |                     authorToInclude.forEach { | ||||||
|                         url.addQueryParameter("author", "${it.name},${it.role}") |                         url.addQueryParameter("author", "${it.name},${it.role}") | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|                 is Filter.Sort -> { |                 is Filter.Sort -> { | ||||||
| <<<<<<< HEAD |  | ||||||
|                     var sortCriteria = when (filter.state?.index) { |  | ||||||
|                         0 -> if (type == "series") "metadata.titleSort" else "name" |  | ||||||
|                         1 -> "createdDate" |  | ||||||
|                         2 -> "lastModifiedDate" |  | ||||||
|                         else -> "" |  | ||||||
|                     } |  | ||||||
|                     if (sortCriteria.isNotEmpty()) { |  | ||||||
|                         sortCriteria += "," + if (filter.state?.ascending!!) "asc" else "desc" |  | ||||||
|                         url.addQueryParameter("sort", sortCriteria) |  | ||||||
|                     } |  | ||||||
| ======= |  | ||||||
|                     val state = filter.state ?: return@forEach |                     val state = filter.state ?: return@forEach | ||||||
| 
 | 
 | ||||||
|                     val sortCriteria = when (state.index) { |                     val sortCriteria = when (state.index) { | ||||||
| @ -291,47 +202,17 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|                     } + "," + if (state.ascending) "asc" else "desc" |                     } + "," + if (state.ascending) "asc" else "desc" | ||||||
| 
 | 
 | ||||||
|                     url.addQueryParameter("sort", sortCriteria) |                     url.addQueryParameter("sort", sortCriteria) | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|                 } |                 } | ||||||
|                 else -> {} |                 else -> {} | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
| <<<<<<< HEAD |  | ||||||
|         return GET(url.toString(), headers) |  | ||||||
| ======= |  | ||||||
|         return GET(url.build(), headers) |         return GET(url.build(), headers) | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     override fun searchMangaParse(response: Response): MangasPage = |     override fun searchMangaParse(response: Response): MangasPage = | ||||||
|         processSeriesPage(response) |         processSeriesPage(response) | ||||||
| 
 | 
 | ||||||
| <<<<<<< HEAD |  | ||||||
|     override fun fetchMangaDetails(manga: SManga): Observable<SManga> { |  | ||||||
|         return client.newCall(GET(manga.url, headers)) |  | ||||||
|             .asObservable() |  | ||||||
|             .map { response -> |  | ||||||
|                 mangaDetailsParse(response).apply { initialized = true } |  | ||||||
|             } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override fun mangaDetailsRequest(manga: SManga): Request = |  | ||||||
|         GET(manga.url.replaceFirst("api/v1/", "", ignoreCase = true), headers) |  | ||||||
| 
 |  | ||||||
|     override fun mangaDetailsParse(response: Response): SManga { |  | ||||||
|         return response.body.use { body -> |  | ||||||
|             if (response.fromReadList()) { |  | ||||||
|                 val readList = json.decodeFromString<ReadListDto>(body.string()) |  | ||||||
|                 readList.toSManga() |  | ||||||
|             } else { |  | ||||||
|                 val series = json.decodeFromString<SeriesDto>(body.string()) |  | ||||||
|                 series.toSManga() |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| ======= |  | ||||||
|     override fun getMangaUrl(manga: SManga) = manga.url.replace("/api/v1", "") |     override fun getMangaUrl(manga: SManga) = manga.url.replace("/api/v1", "") | ||||||
| 
 | 
 | ||||||
|     override fun mangaDetailsRequest(manga: SManga) = GET(manga.url) |     override fun mangaDetailsRequest(manga: SManga) = GET(manga.url) | ||||||
| @ -350,31 +231,19 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
| 
 | 
 | ||||||
|     override fun getChapterUrl(chapter: SChapter) = chapter.url.replace("/api/v1/books", "/book") |     override fun getChapterUrl(chapter: SChapter) = chapter.url.replace("/api/v1/books", "/book") | ||||||
| 
 | 
 | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|     override fun chapterListRequest(manga: SManga): Request = |     override fun chapterListRequest(manga: SManga): Request = | ||||||
|         GET("${manga.url}/books?unpaged=true&media_status=READY&deleted=false", headers) |         GET("${manga.url}/books?unpaged=true&media_status=READY&deleted=false", headers) | ||||||
| 
 | 
 | ||||||
|     override fun chapterListParse(response: Response): List<SChapter> { |     override fun chapterListParse(response: Response): List<SChapter> { | ||||||
| <<<<<<< HEAD |  | ||||||
|         val responseBody = response.body |  | ||||||
|         val page = responseBody.use { json.decodeFromString<PageWrapperDto<BookDto>>(it.string()).content } |  | ||||||
| ======= |  | ||||||
|         val page = response.parseAs<PageWrapperDto<BookDto>>().content |         val page = response.parseAs<PageWrapperDto<BookDto>>().content | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| 
 | 
 | ||||||
|         val r = page.mapIndexed { index, book -> |         val r = page.mapIndexed { index, book -> | ||||||
|             SChapter.create().apply { |             SChapter.create().apply { | ||||||
|                 chapter_number = if (!response.fromReadList()) book.metadata.numberSort else index + 1F |                 chapter_number = if (!response.fromReadList()) book.metadata.numberSort else index + 1F | ||||||
| <<<<<<< HEAD |  | ||||||
|                 name = "${if (!response.fromReadList()) "${book.metadata.number} - " else "${book.seriesTitle} ${book.metadata.number}: "}${book.metadata.title} (${book.size})" |  | ||||||
| ======= |  | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|                 url = "$baseUrl/api/v1/books/${book.id}" |                 url = "$baseUrl/api/v1/books/${book.id}" | ||||||
|                 scanlator = book.metadata.authors.groupBy({ it.role }, { it.name })["translator"]?.joinToString() |                 scanlator = book.metadata.authors.groupBy({ it.role }, { it.name })["translator"]?.joinToString() | ||||||
|                 date_upload = book.metadata.releaseDate?.let { parseDate(it) } |                 date_upload = book.metadata.releaseDate?.let { parseDate(it) } | ||||||
|                     ?: parseDateTime(book.fileLastModified) |                     ?: parseDateTime(book.fileLastModified) | ||||||
| <<<<<<< HEAD |  | ||||||
| ======= |  | ||||||
| 
 | 
 | ||||||
|                 val values = hashMapOf( |                 val values = hashMapOf( | ||||||
|                     "title" to book.metadata.title, |                     "title" to book.metadata.title, | ||||||
| @ -388,7 +257,6 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|                 val sub = StringSubstitutor(values, "{", "}") |                 val sub = StringSubstitutor(values, "{", "}") | ||||||
| 
 | 
 | ||||||
|                 name = (if (!response.fromReadList()) "" else "${book.seriesTitle} ") + sub.replace(chapterNameTemplate) |                 name = (if (!response.fromReadList()) "" else "${book.seriesTitle} ") + sub.replace(chapterNameTemplate) | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         return r.sortedByDescending { it.chapter_number } |         return r.sortedByDescending { it.chapter_number } | ||||||
| @ -398,13 +266,8 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|         GET("${chapter.url}/pages") |         GET("${chapter.url}/pages") | ||||||
| 
 | 
 | ||||||
|     override fun pageListParse(response: Response): List<Page> { |     override fun pageListParse(response: Response): List<Page> { | ||||||
| <<<<<<< HEAD |  | ||||||
|         val responseBody = response.body |  | ||||||
|         val pages = responseBody.use { json.decodeFromString<List<PageDto>>(it.string()) } |  | ||||||
| ======= |  | ||||||
|         val pages = response.parseAs<List<PageDto>>() |         val pages = response.parseAs<List<PageDto>>() | ||||||
| 
 | 
 | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|         return pages.map { |         return pages.map { | ||||||
|             val url = "${response.request.url}/${it.number}" + |             val url = "${response.request.url}/${it.number}" + | ||||||
|                 if (!supportedImageTypes.contains(it.mediaType)) { |                 if (!supportedImageTypes.contains(it.mediaType)) { | ||||||
| @ -413,124 +276,13 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|                     "" |                     "" | ||||||
|                 } |                 } | ||||||
|             Page( |             Page( | ||||||
| <<<<<<< HEAD |  | ||||||
|                 index = it.number - 1, |  | ||||||
| ======= |  | ||||||
|                 index = it.number, |                 index = it.number, | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|                 imageUrl = url, |                 imageUrl = url, | ||||||
|             ) |             ) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| <<<<<<< HEAD |  | ||||||
|     override fun getMangaUrl(manga: SManga) = manga.url.replace("/api/v1", "") |  | ||||||
| 
 |  | ||||||
|     override fun getChapterUrl(chapter: SChapter) = chapter.url.replace("/api/v1/books", "/book") |  | ||||||
| 
 |  | ||||||
|     private fun processSeriesPage(response: Response): MangasPage { |  | ||||||
|         val responseBody = response.body |  | ||||||
|         return responseBody.use { body -> |  | ||||||
|             if (response.fromReadList()) { |  | ||||||
|                 with(json.decodeFromString<PageWrapperDto<ReadListDto>>(body.string())) { |  | ||||||
|                     MangasPage(content.map { it.toSManga() }, !last) |  | ||||||
|                 } |  | ||||||
|             } else { |  | ||||||
|                 with(json.decodeFromString<PageWrapperDto<SeriesDto>>(body.string())) { |  | ||||||
|                     MangasPage(content.map { it.toSManga() }, !last) |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private fun SeriesDto.toSManga(): SManga = |  | ||||||
|         SManga.create().apply { |  | ||||||
|             title = metadata.title |  | ||||||
|             url = "$baseUrl/api/v1/series/$id" |  | ||||||
|             thumbnail_url = "$url/thumbnail" |  | ||||||
|             status = when { |  | ||||||
|                 metadata.status == "ENDED" && metadata.totalBookCount != null && booksCount < metadata.totalBookCount -> SManga.PUBLISHING_FINISHED |  | ||||||
|                 metadata.status == "ENDED" -> SManga.COMPLETED |  | ||||||
|                 metadata.status == "ONGOING" -> SManga.ONGOING |  | ||||||
|                 metadata.status == "ABANDONED" -> SManga.CANCELLED |  | ||||||
|                 metadata.status == "HIATUS" -> SManga.ON_HIATUS |  | ||||||
|                 else -> SManga.UNKNOWN |  | ||||||
|             } |  | ||||||
|             genre = (metadata.genres + metadata.tags + booksMetadata.tags).distinct().joinToString(", ") |  | ||||||
|             description = metadata.summary.ifBlank { booksMetadata.summary } |  | ||||||
|             booksMetadata.authors.groupBy { it.role }.let { map -> |  | ||||||
|                 author = map["writer"]?.map { it.name }?.distinct()?.joinToString() |  | ||||||
|                 artist = map["penciller"]?.map { it.name }?.distinct()?.joinToString() |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     private fun ReadListDto.toSManga(): SManga = |  | ||||||
|         SManga.create().apply { |  | ||||||
|             title = name |  | ||||||
|             description = summary |  | ||||||
|             url = "$baseUrl/api/v1/readlists/$id" |  | ||||||
|             thumbnail_url = "$url/thumbnail" |  | ||||||
|             status = SManga.UNKNOWN |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     private fun Response.fromReadList() = request.url.toString().contains("/api/v1/readlists") |  | ||||||
| 
 |  | ||||||
|     private fun parseDate(date: String?): Long = |  | ||||||
|         if (date == null) { |  | ||||||
|             0 |  | ||||||
|         } else { |  | ||||||
|             try { |  | ||||||
|                 KomgaHelper.formatterDate.parse(date)?.time ?: 0 |  | ||||||
|             } catch (ex: Exception) { |  | ||||||
|                 0 |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     private fun parseDateTime(date: String?): Long = |  | ||||||
|         if (date == null) { |  | ||||||
|             0 |  | ||||||
|         } else { |  | ||||||
|             try { |  | ||||||
|                 KomgaHelper.formatterDateTime.parse(date)?.time ?: 0 |  | ||||||
|             } catch (ex: Exception) { |  | ||||||
|                 try { |  | ||||||
|                     KomgaHelper.formatterDateTimeMilli.parse(date)?.time ?: 0 |  | ||||||
|                 } catch (ex: Exception) { |  | ||||||
|                     0 |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|     override fun imageUrlParse(response: Response): String = "" |  | ||||||
| 
 |  | ||||||
|     private class TypeSelect : Filter.Select<String>("Search for", arrayOf(TYPE_SERIES, TYPE_READLISTS)) |  | ||||||
|     private class LibraryFilter(val id: String, name: String) : Filter.CheckBox(name, false) |  | ||||||
|     private class LibraryGroup(libraries: List<LibraryFilter>) : Filter.Group<LibraryFilter>("Libraries", libraries) |  | ||||||
|     private class CollectionSelect(collections: List<CollectionFilterEntry>) : Filter.Select<CollectionFilterEntry>("Collection", collections.toTypedArray()) |  | ||||||
|     private class SeriesSort : Filter.Sort("Sort", arrayOf("Alphabetically", "Date added", "Date updated"), Selection(0, true)) |  | ||||||
|     private class StatusFilter(name: String) : Filter.CheckBox(name, false) |  | ||||||
|     private class StatusGroup(filters: List<StatusFilter>) : Filter.Group<StatusFilter>("Status", filters) |  | ||||||
|     private class UnreadFilter : Filter.CheckBox("Unread", false) |  | ||||||
|     private class InProgressFilter : Filter.CheckBox("In Progress", false) |  | ||||||
|     private class ReadFilter : Filter.CheckBox("Read", false) |  | ||||||
|     private class GenreFilter(genre: String) : Filter.CheckBox(genre, false) |  | ||||||
|     private class GenreGroup(genres: List<GenreFilter>) : Filter.Group<GenreFilter>("Genres", genres) |  | ||||||
|     private class TagFilter(tag: String) : Filter.CheckBox(tag, false) |  | ||||||
|     private class TagGroup(tags: List<TagFilter>) : Filter.Group<TagFilter>("Tags", tags) |  | ||||||
|     private class PublisherFilter(publisher: String) : Filter.CheckBox(publisher, false) |  | ||||||
|     private class PublisherGroup(publishers: List<PublisherFilter>) : Filter.Group<PublisherFilter>("Publishers", publishers) |  | ||||||
|     private class AuthorFilter(val author: AuthorDto) : Filter.CheckBox(author.name, false) |  | ||||||
|     private class AuthorGroup(role: String, authors: List<AuthorFilter>) : Filter.Group<AuthorFilter>(role, authors) |  | ||||||
| 
 |  | ||||||
|     private data class CollectionFilterEntry( |  | ||||||
|         val name: String, |  | ||||||
|         val id: String? = null, |  | ||||||
|     ) { |  | ||||||
|         override fun toString() = name |  | ||||||
|     } |  | ||||||
| ======= |  | ||||||
|     override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() |     override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException() | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| 
 | 
 | ||||||
|     override fun getFilterList(): FilterList { |     override fun getFilterList(): FilterList { | ||||||
|         val filters = try { |         val filters = try { | ||||||
| @ -546,31 +298,22 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|                 TagGroup(tags.map { TagFilter(it) }), |                 TagGroup(tags.map { TagFilter(it) }), | ||||||
|                 PublisherGroup(publishers.map { PublisherFilter(it) }), |                 PublisherGroup(publishers.map { PublisherFilter(it) }), | ||||||
|             ).also { list -> |             ).also { list -> | ||||||
| <<<<<<< HEAD |  | ||||||
| ======= |  | ||||||
|                 if (collections.isEmpty() && libraries.isEmpty() && genres.isEmpty() && tags.isEmpty() && publishers.isEmpty()) { |                 if (collections.isEmpty() && libraries.isEmpty() && genres.isEmpty() && tags.isEmpty() && publishers.isEmpty()) { | ||||||
|                     list.add(0, Filter.Header("Press 'Reset' to show filtering options")) |                     list.add(0, Filter.Header("Press 'Reset' to show filtering options")) | ||||||
|                     list.add(1, Filter.Separator()) |                     list.add(1, Filter.Separator()) | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|                 list.addAll(authors.map { (role, authors) -> AuthorGroup(role, authors.map { AuthorFilter(it) }) }) |                 list.addAll(authors.map { (role, authors) -> AuthorGroup(role, authors.map { AuthorFilter(it) }) }) | ||||||
|                 list.add(SeriesSort()) |                 list.add(SeriesSort()) | ||||||
|             } |             } | ||||||
|         } catch (e: Exception) { |         } catch (e: Exception) { | ||||||
| <<<<<<< HEAD |  | ||||||
|             Log.e(LOG_TAG, "error while creating filter list", e) |  | ||||||
| ======= |  | ||||||
|             Log.e(logTag, "error while creating filter list", e) |             Log.e(logTag, "error while creating filter list", e) | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|             emptyList() |             emptyList() | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return FilterList(filters) |         return FilterList(filters) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| <<<<<<< HEAD |  | ||||||
| ======= |  | ||||||
|     override fun setupPreferenceScreen(screen: PreferenceScreen) { |     override fun setupPreferenceScreen(screen: PreferenceScreen) { | ||||||
|         if (suffix.isBlank()) { |         if (suffix.isBlank()) { | ||||||
|             ListPreference(screen.context).apply { |             ListPreference(screen.context).apply { | ||||||
| @ -652,7 +395,6 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|         }.also(screen::addPreference) |         }.also(screen::addPreference) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|     private var libraries = emptyList<LibraryDto>() |     private var libraries = emptyList<LibraryDto>() | ||||||
|     private var collections = emptyList<CollectionDto>() |     private var collections = emptyList<CollectionDto>() | ||||||
|     private var genres = emptySet<String>() |     private var genres = emptySet<String>() | ||||||
| @ -660,77 +402,6 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|     private var publishers = emptySet<String>() |     private var publishers = emptySet<String>() | ||||||
|     private var authors = emptyMap<String, List<AuthorDto>>() // roles to list of authors |     private var authors = emptyMap<String, List<AuthorDto>>() // roles to list of authors | ||||||
| 
 | 
 | ||||||
| <<<<<<< HEAD |  | ||||||
|     // keep the previous ID when lang was "en", so that preferences and manga bindings are not lost |  | ||||||
|     override val id by lazy { |  | ||||||
|         val key = "komga${if (suffix.isNotBlank()) " ($suffix)" else ""}/en/$versionId" |  | ||||||
|         val bytes = MessageDigest.getInstance("MD5").digest(key.toByteArray()) |  | ||||||
|         (0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) }.reduce(Long::or) and Long.MAX_VALUE |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private val displayName by lazy { preferences.displayName } |  | ||||||
|     final override val baseUrl by lazy { preferences.baseUrl } |  | ||||||
|     private val username by lazy { preferences.username } |  | ||||||
|     private val password by lazy { preferences.password } |  | ||||||
|     private val json: Json by injectLazy() |  | ||||||
| 
 |  | ||||||
|     override fun headersBuilder(): Headers.Builder = |  | ||||||
|         Headers.Builder() |  | ||||||
|             .add("User-Agent", "TachiyomiKomga/${AppInfo.getVersionName()}") |  | ||||||
| 
 |  | ||||||
|     private val preferences: SharedPreferences by lazy { |  | ||||||
|         Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     override val name = "Komga${displayName.ifBlank { suffix }.let { if (it.isNotBlank()) " ($it)" else "" }}" |  | ||||||
|     override val lang = "all" |  | ||||||
|     override val supportsLatest = true |  | ||||||
|     private val LOG_TAG = "extension.all.komga${if (suffix.isNotBlank()) ".$suffix" else ""}" |  | ||||||
| 
 |  | ||||||
|     override val client: OkHttpClient = |  | ||||||
|         network.client.newBuilder() |  | ||||||
|             .authenticator { _, response -> |  | ||||||
|                 if (response.request.header("Authorization") != null) { |  | ||||||
|                     null // Give up, we've already failed to authenticate. |  | ||||||
|                 } else { |  | ||||||
|                     response.request.newBuilder() |  | ||||||
|                         .addHeader("Authorization", Credentials.basic(username, password)) |  | ||||||
|                         .build() |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             .dns(Dns.SYSTEM) // don't use DNS over HTTPS as it breaks IP addressing |  | ||||||
|             .build() |  | ||||||
| 
 |  | ||||||
|     override fun setupPreferenceScreen(screen: PreferenceScreen) { |  | ||||||
|         screen.addEditTextPreference( |  | ||||||
|             title = "Source display name", |  | ||||||
|             default = suffix, |  | ||||||
|             summary = displayName.ifBlank { "Here you can change the source displayed suffix" }, |  | ||||||
|             key = PREF_DISPLAYNAME, |  | ||||||
|         ) |  | ||||||
|         screen.addEditTextPreference( |  | ||||||
|             title = "Address", |  | ||||||
|             default = ADDRESS_DEFAULT, |  | ||||||
|             summary = baseUrl.ifBlank { "The server address" }, |  | ||||||
|             inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_URI, |  | ||||||
|             validate = { it.toHttpUrlOrNull() != null }, |  | ||||||
|             validationMessage = "The URL is invalid or malformed", |  | ||||||
|             key = PREF_ADDRESS, |  | ||||||
|         ) |  | ||||||
|         screen.addEditTextPreference( |  | ||||||
|             title = "Username", |  | ||||||
|             default = USERNAME_DEFAULT, |  | ||||||
|             summary = username.ifBlank { "The user account email" }, |  | ||||||
|             key = PREF_USERNAME, |  | ||||||
|         ) |  | ||||||
|         screen.addEditTextPreference( |  | ||||||
|             title = "Password", |  | ||||||
|             default = PASSWORD_DEFAULT, |  | ||||||
|             summary = if (password.isBlank()) "The user account password" else "*".repeat(password.length), |  | ||||||
|             inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD, |  | ||||||
|             key = PREF_PASSWORD, |  | ||||||
|         ) |  | ||||||
| ======= |  | ||||||
|     private class TypeSelect : Filter.Select<String>("Search for", arrayOf(TYPE_SERIES, TYPE_READLISTS)) |     private class TypeSelect : Filter.Select<String>("Search for", arrayOf(TYPE_SERIES, TYPE_READLISTS)) | ||||||
|     private class LibraryFilter(val id: String, name: String) : Filter.CheckBox(name, false) |     private class LibraryFilter(val id: String, name: String) : Filter.CheckBox(name, false) | ||||||
|     private class LibraryGroup(libraries: List<LibraryFilter>) : Filter.Group<LibraryFilter>("Libraries", libraries) |     private class LibraryGroup(libraries: List<LibraryFilter>) : Filter.Group<LibraryFilter>("Libraries", libraries) | ||||||
| @ -755,7 +426,6 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|         val id: String? = null, |         val id: String? = null, | ||||||
|     ) { |     ) { | ||||||
|         override fun toString() = name |         override fun toString() = name | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private fun PreferenceScreen.addEditTextPreference( |     private fun PreferenceScreen.addEditTextPreference( | ||||||
| @ -817,125 +487,6 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|         addPreference(preference) |         addPreference(preference) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| <<<<<<< HEAD |  | ||||||
|     private val SharedPreferences.displayName |  | ||||||
|         get() = getString(PREF_DISPLAYNAME, "")!! |  | ||||||
| 
 |  | ||||||
|     private val SharedPreferences.baseUrl |  | ||||||
|         get() = getString(PREF_ADDRESS, ADDRESS_DEFAULT)!!.removeSuffix("/") |  | ||||||
| 
 |  | ||||||
|     private val SharedPreferences.username |  | ||||||
|         get() = getString(PREF_USERNAME, USERNAME_DEFAULT)!! |  | ||||||
| 
 |  | ||||||
|     private val SharedPreferences.password |  | ||||||
|         get() = getString(PREF_PASSWORD, PASSWORD_DEFAULT)!! |  | ||||||
| 
 |  | ||||||
|     init { |  | ||||||
|         if (baseUrl.isNotBlank()) { |  | ||||||
|             Single.fromCallable { |  | ||||||
|                 try { |  | ||||||
|                     client.newCall(GET("$baseUrl/api/v1/libraries", headers)).execute().use { response -> |  | ||||||
|                         libraries = try { |  | ||||||
|                             val responseBody = response.body |  | ||||||
|                             responseBody.use { json.decodeFromString(it.string()) } |  | ||||||
|                         } catch (e: Exception) { |  | ||||||
|                             Log.e(LOG_TAG, "error while decoding JSON for libraries filter", e) |  | ||||||
|                             emptyList() |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } catch (e: Exception) { |  | ||||||
|                     Log.e(LOG_TAG, "error while loading libraries for filters", e) |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 try { |  | ||||||
|                     client.newCall(GET("$baseUrl/api/v1/collections?unpaged=true", headers)).execute().use { response -> |  | ||||||
|                         collections = try { |  | ||||||
|                             val responseBody = response.body |  | ||||||
|                             responseBody.use { json.decodeFromString<PageWrapperDto<CollectionDto>>(it.string()).content } |  | ||||||
|                         } catch (e: Exception) { |  | ||||||
|                             Log.e(LOG_TAG, "error while decoding JSON for collections filter", e) |  | ||||||
|                             emptyList() |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } catch (e: Exception) { |  | ||||||
|                     Log.e(LOG_TAG, "error while loading collections for filters", e) |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 try { |  | ||||||
|                     client.newCall(GET("$baseUrl/api/v1/genres", headers)).execute().use { response -> |  | ||||||
|                         genres = try { |  | ||||||
|                             val responseBody = response.body |  | ||||||
|                             responseBody.use { json.decodeFromString(it.string()) } |  | ||||||
|                         } catch (e: Exception) { |  | ||||||
|                             Log.e(LOG_TAG, "error while decoding JSON for genres filter", e) |  | ||||||
|                             emptySet() |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } catch (e: Exception) { |  | ||||||
|                     Log.e(LOG_TAG, "error while loading genres for filters", e) |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 try { |  | ||||||
|                     client.newCall(GET("$baseUrl/api/v1/tags", headers)).execute().use { response -> |  | ||||||
|                         tags = try { |  | ||||||
|                             response.body.use { json.decodeFromString(it.string()) } |  | ||||||
|                         } catch (e: Exception) { |  | ||||||
|                             Log.e(LOG_TAG, "error while decoding JSON for tags filter", e) |  | ||||||
|                             emptySet() |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } catch (e: Exception) { |  | ||||||
|                     Log.e(LOG_TAG, "error while loading tags for filters", e) |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 try { |  | ||||||
|                     client.newCall(GET("$baseUrl/api/v1/publishers", headers)).execute().use { response -> |  | ||||||
|                         publishers = try { |  | ||||||
|                             response.body.use { json.decodeFromString(it.string()) } |  | ||||||
|                         } catch (e: Exception) { |  | ||||||
|                             Log.e(LOG_TAG, "error while decoding JSON for publishers filter", e) |  | ||||||
|                             emptySet() |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } catch (e: Exception) { |  | ||||||
|                     Log.e(LOG_TAG, "error while loading publishers for filters", e) |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 try { |  | ||||||
|                     client.newCall(GET("$baseUrl/api/v1/authors", headers)).execute().use { response -> |  | ||||||
|                         authors = try { |  | ||||||
|                             response.body |  | ||||||
|                                 .use { json.decodeFromString<List<AuthorDto>>(it.string()) } |  | ||||||
|                                 .groupBy { it.role } |  | ||||||
|                         } catch (e: Exception) { |  | ||||||
|                             Log.e(LOG_TAG, "error while decoding JSON for authors filter", e) |  | ||||||
|                             emptyMap() |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } catch (e: Exception) { |  | ||||||
|                     Log.e(LOG_TAG, "error while loading authors for filters", e) |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|                 .subscribeOn(Schedulers.io()) |  | ||||||
|                 .observeOn(Schedulers.io()) |  | ||||||
|                 .subscribe( |  | ||||||
|                     {}, |  | ||||||
|                     { tr -> |  | ||||||
|                         Log.e(LOG_TAG, "error while doing initial calls", tr) |  | ||||||
|                     }, |  | ||||||
|                 ) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     companion object { |  | ||||||
|         private const val PREF_DISPLAYNAME = "Source display name" |  | ||||||
|         private const val PREF_ADDRESS = "Address" |  | ||||||
|         private const val ADDRESS_DEFAULT = "" |  | ||||||
|         private const val PREF_USERNAME = "Username" |  | ||||||
|         private const val USERNAME_DEFAULT = "" |  | ||||||
|         private const val PREF_PASSWORD = "Password" |  | ||||||
|         private const val PASSWORD_DEFAULT = "" |  | ||||||
| ======= |  | ||||||
|     private var fetchFiltersFailed = false |     private var fetchFiltersFailed = false | ||||||
| 
 | 
 | ||||||
|     private var fetchFiltersAttempts = 0 |     private var fetchFiltersAttempts = 0 | ||||||
| @ -1054,7 +605,6 @@ open class Komga(private val suffix: String = "") : ConfigurableSource, Unmetere | |||||||
|         private const val PREF_PASSWORD = "Password" |         private const val PREF_PASSWORD = "Password" | ||||||
|         private const val PREF_CHAPTER_NAME_TEMPLATE = "Chapter name template" |         private const val PREF_CHAPTER_NAME_TEMPLATE = "Chapter name template" | ||||||
|         private const val PREF_CHAPTER_NAME_TEMPLATE_DEFAULT = "{number} - {title} ({size})" |         private const val PREF_CHAPTER_NAME_TEMPLATE_DEFAULT = "{number} - {title} ({size})" | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| 
 | 
 | ||||||
|         private val supportedImageTypes = listOf("image/jpeg", "image/png", "image/gif", "image/webp", "image/jxl", "image/heif", "image/avif") |         private val supportedImageTypes = listOf("image/jpeg", "image/png", "image/gif", "image/webp", "image/jxl", "image/heif", "image/avif") | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,15 +4,6 @@ import eu.kanade.tachiyomi.source.Source | |||||||
| import eu.kanade.tachiyomi.source.SourceFactory | import eu.kanade.tachiyomi.source.SourceFactory | ||||||
| 
 | 
 | ||||||
| class KomgaFactory : SourceFactory { | class KomgaFactory : SourceFactory { | ||||||
| <<<<<<< HEAD |  | ||||||
| 
 |  | ||||||
|     override fun createSources(): List<Source> = |  | ||||||
|         listOf( |  | ||||||
|             Komga(), |  | ||||||
|             Komga("2"), |  | ||||||
|             Komga("3"), |  | ||||||
|         ) |  | ||||||
| ======= |  | ||||||
|     override fun createSources(): List<Source> { |     override fun createSources(): List<Source> { | ||||||
|         val firstKomga = Komga("") |         val firstKomga = Komga("") | ||||||
|         val komgaCount = firstKomga.preferences.getString(Komga.PREF_EXTRA_SOURCES_COUNT, Komga.PREF_EXTRA_SOURCES_DEFAULT)!!.toInt() |         val komgaCount = firstKomga.preferences.getString(Komga.PREF_EXTRA_SOURCES_COUNT, Komga.PREF_EXTRA_SOURCES_DEFAULT)!!.toInt() | ||||||
| @ -20,5 +11,4 @@ class KomgaFactory : SourceFactory { | |||||||
|         // Komga(""), Komga("2"), Komga("3"), ... |         // Komga(""), Komga("2"), Komga("3"), ... | ||||||
|         return listOf(firstKomga) + (0 until komgaCount).map { Komga("${it + 2}") } |         return listOf(firstKomga) + (0 until komgaCount).map { Komga("${it + 2}") } | ||||||
|     } |     } | ||||||
| >>>>>>> d52b3e572 (Add Komga (#579)) |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -24,11 +24,7 @@ You can visit the [LANraragi](https://github.com/Difegue/LANraragi) github page | |||||||
| Make sure that your LANraragi server and extension are on the newest version. | Make sure that your LANraragi server and extension are on the newest version. | ||||||
| 
 | 
 | ||||||
| ### Can I add more than one LANraragi server or user? | ### Can I add more than one LANraragi server or user? | ||||||
| <<<<<<< HEAD |  | ||||||
| No, currently there is only support for 1 instances in Tachiyomi, if you need more instances please open a feature request on [tachiyomi-extensions](https://github.com/tachiyomiorg/tachiyomi-extensions/issues/new/choose) repo. |  | ||||||
| ======= |  | ||||||
| No, currently there is only support for 1 instances in Tachiyomi, if you need more instances please open a feature request on [extensions](https://github.com/tachiyomiorg/extensions/issues/new/choose) repo. | No, currently there is only support for 1 instances in Tachiyomi, if you need more instances please open a feature request on [extensions](https://github.com/tachiyomiorg/extensions/issues/new/choose) repo. | ||||||
| >>>>>>> 4dac8de22 (Add LANraragi (#702)) |  | ||||||
| 
 | 
 | ||||||
| ### Can I test the LANraragi extension before setting up my own server? | ### Can I test the LANraragi extension before setting up my own server? | ||||||
| Yes, you can try it out with the DEMO server `https://lrr.tvc-16.science`. | Yes, you can try it out with the DEMO server `https://lrr.tvc-16.science`. | ||||||
|  | |||||||
| @ -1,11 +1,7 @@ | |||||||
| ext { | ext { | ||||||
|     extName = 'LANraragi' |     extName = 'LANraragi' | ||||||
|     extClass = '.LANraragiFactory' |     extClass = '.LANraragiFactory' | ||||||
| <<<<<<< HEAD |  | ||||||
|     extVersionCode = 15 |  | ||||||
| ======= |  | ||||||
|     extVersionCode = 16 |     extVersionCode = 16 | ||||||
| >>>>>>> 4dac8de22 (Add LANraragi (#702)) |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| apply from: "$rootDir/common.gradle" | apply from: "$rootDir/common.gradle" | ||||||
|  | |||||||
| @ -6,10 +6,7 @@ import android.net.Uri | |||||||
| import android.text.InputType | import android.text.InputType | ||||||
| import android.util.Base64 | import android.util.Base64 | ||||||
| import android.widget.Toast | import android.widget.Toast | ||||||
| <<<<<<< HEAD |  | ||||||
| ======= |  | ||||||
| import androidx.preference.ListPreference | import androidx.preference.ListPreference | ||||||
| >>>>>>> 4dac8de22 (Add LANraragi (#702)) |  | ||||||
| import eu.kanade.tachiyomi.network.GET | import eu.kanade.tachiyomi.network.GET | ||||||
| import eu.kanade.tachiyomi.network.asObservableSuccess | import eu.kanade.tachiyomi.network.asObservableSuccess | ||||||
| import eu.kanade.tachiyomi.source.ConfigurableSource | import eu.kanade.tachiyomi.source.ConfigurableSource | ||||||
| @ -276,11 +273,7 @@ open class LANraragi(private val suffix: String = "") : ConfigurableSource, Unme | |||||||
|         (0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) }.reduce(Long::or) and Long.MAX_VALUE |         (0..7).map { bytes[it].toLong() and 0xff shl 8 * (7 - it) }.reduce(Long::or) and Long.MAX_VALUE | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| <<<<<<< HEAD |  | ||||||
|     private val preferences: SharedPreferences by lazy { |  | ||||||
| ======= |  | ||||||
|     internal val preferences: SharedPreferences by lazy { |     internal val preferences: SharedPreferences by lazy { | ||||||
| >>>>>>> 4dac8de22 (Add LANraragi (#702)) |  | ||||||
|         Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) |         Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -290,8 +283,6 @@ open class LANraragi(private val suffix: String = "") : ConfigurableSource, Unme | |||||||
|     private fun getPrefCustomLabel(): String = preferences.getString(CUSTOM_LABEL_KEY, suffix)!!.ifBlank { suffix } |     private fun getPrefCustomLabel(): String = preferences.getString(CUSTOM_LABEL_KEY, suffix)!!.ifBlank { suffix } | ||||||
| 
 | 
 | ||||||
|     override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { |     override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) { | ||||||
| <<<<<<< HEAD |  | ||||||
| ======= |  | ||||||
|         if (suffix == "1") { |         if (suffix == "1") { | ||||||
|             ListPreference(screen.context).apply { |             ListPreference(screen.context).apply { | ||||||
|                 key = EXTRA_SOURCES_COUNT_KEY |                 key = EXTRA_SOURCES_COUNT_KEY | ||||||
| @ -313,7 +304,6 @@ open class LANraragi(private val suffix: String = "") : ConfigurableSource, Unme | |||||||
|                 } |                 } | ||||||
|             }.also(screen::addPreference) |             }.also(screen::addPreference) | ||||||
|         } |         } | ||||||
| >>>>>>> 4dac8de22 (Add LANraragi (#702)) |  | ||||||
|         screen.addPreference(screen.editTextPreference(HOSTNAME_KEY, "Hostname", HOSTNAME_DEFAULT, baseUrl, refreshSummary = true)) |         screen.addPreference(screen.editTextPreference(HOSTNAME_KEY, "Hostname", HOSTNAME_DEFAULT, baseUrl, refreshSummary = true)) | ||||||
|         screen.addPreference(screen.editTextPreference(APIKEY_KEY, "API Key", "", "Required if No-Fun Mode is enabled.", true)) |         screen.addPreference(screen.editTextPreference(APIKEY_KEY, "API Key", "", "Required if No-Fun Mode is enabled.", true)) | ||||||
|         screen.addPreference(screen.editTextPreference(CUSTOM_LABEL_KEY, "Custom Label", "", "Show the given label for the source instead of the default.")) |         screen.addPreference(screen.editTextPreference(CUSTOM_LABEL_KEY, "Custom Label", "", "Show the given label for the source instead of the default.")) | ||||||
| @ -490,13 +480,10 @@ open class LANraragi(private val suffix: String = "") : ConfigurableSource, Unme | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     companion object { |     companion object { | ||||||
| <<<<<<< HEAD |  | ||||||
| ======= |  | ||||||
|         internal const val EXTRA_SOURCES_COUNT_KEY = "extraSourcesCount" |         internal const val EXTRA_SOURCES_COUNT_KEY = "extraSourcesCount" | ||||||
|         internal const val EXTRA_SOURCES_COUNT_DEFAULT = "2" |         internal const val EXTRA_SOURCES_COUNT_DEFAULT = "2" | ||||||
|         private val EXTRA_SOURCES_ENTRIES = (0..10).map { it.toString() }.toTypedArray() |         private val EXTRA_SOURCES_ENTRIES = (0..10).map { it.toString() }.toTypedArray() | ||||||
| 
 | 
 | ||||||
| >>>>>>> 4dac8de22 (Add LANraragi (#702)) |  | ||||||
|         private const val HOSTNAME_DEFAULT = "http://127.0.0.1:3000" |         private const val HOSTNAME_DEFAULT = "http://127.0.0.1:3000" | ||||||
|         private const val HOSTNAME_KEY = "hostname" |         private const val HOSTNAME_KEY = "hostname" | ||||||
|         private const val APIKEY_KEY = "apiKey" |         private const val APIKEY_KEY = "apiKey" | ||||||
|  | |||||||
| @ -4,14 +4,6 @@ import eu.kanade.tachiyomi.source.Source | |||||||
| import eu.kanade.tachiyomi.source.SourceFactory | import eu.kanade.tachiyomi.source.SourceFactory | ||||||
| 
 | 
 | ||||||
| class LANraragiFactory : SourceFactory { | class LANraragiFactory : SourceFactory { | ||||||
| <<<<<<< HEAD |  | ||||||
|     override fun createSources(): List<Source> = |  | ||||||
|         listOf( |  | ||||||
|             LANraragi("1"), |  | ||||||
|             LANraragi("2"), |  | ||||||
|             LANraragi("3"), |  | ||||||
|         ) |  | ||||||
| ======= |  | ||||||
|     override fun createSources(): List<Source> { |     override fun createSources(): List<Source> { | ||||||
|         val firstLrr = LANraragi("1") |         val firstLrr = LANraragi("1") | ||||||
|         val lrrCount = firstLrr.preferences.getString(LANraragi.EXTRA_SOURCES_COUNT_KEY, LANraragi.EXTRA_SOURCES_COUNT_DEFAULT)!!.toInt() |         val lrrCount = firstLrr.preferences.getString(LANraragi.EXTRA_SOURCES_COUNT_KEY, LANraragi.EXTRA_SOURCES_COUNT_DEFAULT)!!.toInt() | ||||||
| @ -23,5 +15,4 @@ class LANraragiFactory : SourceFactory { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| >>>>>>> 4dac8de22 (Add LANraragi (#702)) |  | ||||||
| } | } | ||||||
|  | |||||||