diff --git a/app/src/main/java/exh/metadata/metadata/EHentaiSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/EHentaiSearchMetadata.kt
index 003e04603..3b300ece9 100644
--- a/app/src/main/java/exh/metadata/metadata/EHentaiSearchMetadata.kt
+++ b/app/src/main/java/exh/metadata/metadata/EHentaiSearchMetadata.kt
@@ -51,16 +51,14 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
         val cover = thumbnailUrl
 
         // No title bug?
-        val title = if (Injekt.get<PreferencesHelper>().useJapaneseTitle().get()) {
-            altTitle ?: title
-        } else {
-            title
-        }
+        val title = altTitle
+            ?.takeIf { Injekt.get<PreferencesHelper>().useJapaneseTitle().get() }
+            ?: title
 
         // Set artist (if we can find one)
-        val artist = tags.ofNamespace(EH_ARTIST_NAMESPACE).let { tags ->
-            if (tags.isNotEmpty()) tags.joinToString(transform = { it.name }) else null
-        }
+        val artist = tags.ofNamespace(EH_ARTIST_NAMESPACE)
+            .ifEmpty { null }
+            ?.joinToString { it.name }
 
         // Copy tags -> genres
         val genres = tagsToGenreList()
@@ -92,25 +90,25 @@ class EHentaiSearchMetadata : RaisedSearchMetadata() {
     override fun getExtraInfoPairs(context: Context): List<Pair<String, String>> {
         return with(context) {
             listOfNotNull(
-                gId?.let { getString(R.string.id) to it },
-                gToken?.let { getString(R.string.token) to it },
-                exh?.let { getString(R.string.is_exhentai_gallery) to it.toString() },
-                thumbnailUrl?.let { getString(R.string.thumbnail_url) to it },
-                title?.let { getString(R.string.title) to it },
-                altTitle?.let { getString(R.string.alt_title) to it },
-                genre?.let { getString(R.string.genre) to it },
-                datePosted?.let { getString(R.string.date_posted) to MetadataUtil.EX_DATE_FORMAT.format(Date(it)) },
-                parent?.let { getString(R.string.parent) to it },
-                visible?.let { getString(R.string.visible) to it },
-                language?.let { getString(R.string.language) to it },
-                translated?.let { getString(R.string.translated) to it.toString() },
-                size?.let { getString(R.string.gallery_size) to MetadataUtil.humanReadableByteCount(it, true) },
-                length?.let { getString(R.string.page_count) to it.toString() },
-                favorites?.let { getString(R.string.total_favorites) to it.toString() },
-                ratingCount?.let { getString(R.string.total_ratings) to it.toString() },
-                averageRating?.let { getString(R.string.average_rating) to it.toString() },
-                aged.let { getString(R.string.aged) to it.toString() },
-                lastUpdateCheck.let { getString(R.string.last_update_check) to MetadataUtil.EX_DATE_FORMAT.format(Date(it)) },
+                getItem(gId) { getString(R.string.id) },
+                getItem(gToken) { getString(R.string.token) },
+                getItem(exh) { getString(R.string.is_exhentai_gallery) },
+                getItem(thumbnailUrl) { getString(R.string.thumbnail_url) },
+                getItem(title) { getString(R.string.title) },
+                getItem(altTitle) { getString(R.string.alt_title) },
+                getItem(genre) { getString(R.string.genre) },
+                getItem(datePosted, { MetadataUtil.EX_DATE_FORMAT.format(Date(it)) }) { getString(R.string.date_posted) },
+                getItem(parent) { getString(R.string.parent) },
+                getItem(visible) { getString(R.string.visible) },
+                getItem(language) { getString(R.string.language) },
+                getItem(translated) { getString(R.string.translated) },
+                getItem(size, { MetadataUtil.humanReadableByteCount(it, true) }) { getString(R.string.gallery_size) },
+                getItem(length) { getString(R.string.page_count) },
+                getItem(favorites) { getString(R.string.total_favorites) },
+                getItem(ratingCount) { getString(R.string.total_ratings) },
+                getItem(averageRating) { getString(R.string.average_rating) },
+                getItem(aged) { getString(R.string.aged) },
+                getItem(lastUpdateCheck, { MetadataUtil.EX_DATE_FORMAT.format(Date(it)) }) { getString(R.string.last_update_check) },
             )
         }
     }
diff --git a/app/src/main/java/exh/metadata/metadata/EightMusesSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/EightMusesSearchMetadata.kt
index 0609bdef2..5f1bda5f1 100644
--- a/app/src/main/java/exh/metadata/metadata/EightMusesSearchMetadata.kt
+++ b/app/src/main/java/exh/metadata/metadata/EightMusesSearchMetadata.kt
@@ -41,10 +41,9 @@ class EightMusesSearchMetadata : RaisedSearchMetadata() {
     override fun getExtraInfoPairs(context: Context): List<Pair<String, String>> {
         return with(context) {
             listOfNotNull(
-                title?.let { getString(R.string.title) to it },
-                path.nullIfEmpty()?.joinToString("/", prefix = "/")
-                    ?.let { getString(R.string.path) to it },
-                thumbnailUrl?.let { getString(R.string.thumbnail_url) to it },
+                getItem(title) { getString(R.string.title) },
+                getItem(path.nullIfEmpty(), { it.joinToString("/", prefix = "/") }) { getString(R.string.path) },
+                getItem(thumbnailUrl) { getString(R.string.thumbnail_url) },
             )
         }
     }
diff --git a/app/src/main/java/exh/metadata/metadata/HBrowseSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/HBrowseSearchMetadata.kt
index dc3685c8a..d15ac146c 100644
--- a/app/src/main/java/exh/metadata/metadata/HBrowseSearchMetadata.kt
+++ b/app/src/main/java/exh/metadata/metadata/HBrowseSearchMetadata.kt
@@ -48,11 +48,11 @@ class HBrowseSearchMetadata : RaisedSearchMetadata() {
     override fun getExtraInfoPairs(context: Context): List<Pair<String, String>> {
         return with(context) {
             listOfNotNull(
-                hbId?.let { getString(R.string.id) to it.toString() },
-                hbUrl?.let { getString(R.string.url) to it },
-                thumbnail?.let { getString(R.string.thumbnail_url) to it },
-                title?.let { getString(R.string.title) to it },
-                length?.let { getString(R.string.page_count) to it.toString() },
+                getItem(hbId) { getString(R.string.id) },
+                getItem(hbUrl) { getString(R.string.url) },
+                getItem(thumbnail) { getString(R.string.thumbnail_url) },
+                getItem(title) { getString(R.string.title) },
+                getItem(length) { getString(R.string.page_count) },
             )
         }
     }
diff --git a/app/src/main/java/exh/metadata/metadata/HitomiSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/HitomiSearchMetadata.kt
index 5fe57001a..b207954fd 100644
--- a/app/src/main/java/exh/metadata/metadata/HitomiSearchMetadata.kt
+++ b/app/src/main/java/exh/metadata/metadata/HitomiSearchMetadata.kt
@@ -59,13 +59,13 @@ class HitomiSearchMetadata : RaisedSearchMetadata() {
     override fun getExtraInfoPairs(context: Context): List<Pair<String, String>> {
         return with(context) {
             listOfNotNull(
-                hlId?.let { getString(R.string.id) to it },
-                title?.let { getString(R.string.title) to it },
-                thumbnailUrl?.let { getString(R.string.thumbnail_url) to it },
-                artists.nullIfEmpty()?.joinToString()?.let { getString(R.string.artist) to it },
-                genre?.let { getString(R.string.genre) to it },
-                language?.let { getString(R.string.language) to it },
-                uploadDate?.let { getString(R.string.date_posted) to MetadataUtil.EX_DATE_FORMAT.format(Date(it)) },
+                getItem(hlId) { getString(R.string.id) },
+                getItem(title) { getString(R.string.title) },
+                getItem(thumbnailUrl) { getString(R.string.thumbnail_url) },
+                getItem(artists.nullIfEmpty(), { it.joinToString() }) { getString(R.string.artist) },
+                getItem(genre) { getString(R.string.genre) },
+                getItem(language) { getString(R.string.language) },
+                getItem(uploadDate, { MetadataUtil.EX_DATE_FORMAT.format(Date(it)) }) { getString(R.string.date_posted) },
             )
         }
     }
diff --git a/app/src/main/java/exh/metadata/metadata/MangaDexSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/MangaDexSearchMetadata.kt
index 56d7fbe2e..6491e657a 100644
--- a/app/src/main/java/exh/metadata/metadata/MangaDexSearchMetadata.kt
+++ b/app/src/main/java/exh/metadata/metadata/MangaDexSearchMetadata.kt
@@ -77,24 +77,24 @@ class MangaDexSearchMetadata : RaisedSearchMetadata() {
     override fun getExtraInfoPairs(context: Context): List<Pair<String, String>> {
         return with(context) {
             listOfNotNull(
-                mdUuid?.let { getString(R.string.id) to it },
-                // mdUrl?.let { getString(R.string.url) to it },
-                cover?.let { getString(R.string.thumbnail_url) to it },
-                title?.let { getString(R.string.title) to it },
-                authors?.let { getString(R.string.author) to it.joinToString() },
-                artists?.let { getString(R.string.artist) to it.joinToString() },
-                langFlag?.let { getString(R.string.language) to it },
-                lastChapterNumber?.let { getString(R.string.last_chapter_number) to it.toString() },
-                rating?.let { getString(R.string.average_rating) to it.toString() },
-                // users?.let { getString(R.string.total_ratings) to it },
-                status?.let { getString(R.string.status) to it.toString() },
-                // missing_chapters?.let { getString(R.string.missing_chapters) to it },
-                followStatus?.let { getString(R.string.follow_status) to it.toString() },
-                anilistId?.let { getString(R.string.anilist_id) to it },
-                kitsuId?.let { getString(R.string.kitsu_id) to it },
-                myAnimeListId?.let { getString(R.string.mal_id) to it },
-                mangaUpdatesId?.let { getString(R.string.manga_updates_id) to it },
-                animePlanetId?.let { getString(R.string.anime_planet_id) to it },
+                getItem(mdUuid) { getString(R.string.id) },
+                // getItem(mdUrl) { getString(R.string.url) },
+                getItem(cover) { getString(R.string.thumbnail_url) },
+                getItem(title) { getString(R.string.title) },
+                getItem(authors, { it.joinToString() }) { getString(R.string.author) },
+                getItem(artists, { it.joinToString() }) { getString(R.string.artist) },
+                getItem(langFlag) { getString(R.string.language) },
+                getItem(lastChapterNumber) { getString(R.string.last_chapter_number) },
+                getItem(rating) { getString(R.string.average_rating) },
+                // getItem(users) { getString(R.string.total_ratings) },
+                getItem(status) { getString(R.string.status) },
+                // getItem(missing_chapters) { getString(R.string.missing_chapters) },
+                getItem(followStatus) { getString(R.string.follow_status) },
+                getItem(anilistId) { getString(R.string.anilist_id) },
+                getItem(kitsuId) { getString(R.string.kitsu_id) },
+                getItem(myAnimeListId) { getString(R.string.mal_id) },
+                getItem(mangaUpdatesId) { getString(R.string.manga_updates_id) },
+                getItem(animePlanetId) { getString(R.string.anime_planet_id) },
             )
         }
     }
diff --git a/app/src/main/java/exh/metadata/metadata/NHentaiSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/NHentaiSearchMetadata.kt
index 550c2c570..f1780f50c 100644
--- a/app/src/main/java/exh/metadata/metadata/NHentaiSearchMetadata.kt
+++ b/app/src/main/java/exh/metadata/metadata/NHentaiSearchMetadata.kt
@@ -88,17 +88,17 @@ class NHentaiSearchMetadata : RaisedSearchMetadata() {
     override fun getExtraInfoPairs(context: Context): List<Pair<String, String>> {
         return with(context) {
             listOfNotNull(
-                nhId?.let { getString(R.string.id) to it.toString() },
-                uploadDate?.let { getString(R.string.date_posted) to MetadataUtil.EX_DATE_FORMAT.format(Date(it * 1000)) },
-                favoritesCount?.let { getString(R.string.total_favorites) to it.toString() },
-                mediaId?.let { getString(R.string.media_id) to it },
-                japaneseTitle?.let { getString(R.string.japanese_title) to it },
-                englishTitle?.let { getString(R.string.english_title) to it },
-                shortTitle?.let { getString(R.string.short_title) to it },
-                coverImageType?.let { getString(R.string.cover_image_file_type) to it },
-                pageImageTypes.size.let { getString(R.string.page_count) to it.toString() },
-                thumbnailImageType?.let { getString(R.string.thumbnail_image_file_type) to it },
-                scanlator?.let { getString(R.string.scanlator) to it },
+                getItem(nhId) { getString(R.string.id) },
+                getItem(uploadDate, { MetadataUtil.EX_DATE_FORMAT.format(Date(it * 1000)) }) { getString(R.string.date_posted) },
+                getItem(favoritesCount) { getString(R.string.total_favorites) },
+                getItem(mediaId) { getString(R.string.media_id) },
+                getItem(japaneseTitle) { getString(R.string.japanese_title) },
+                getItem(englishTitle) { getString(R.string.english_title) },
+                getItem(shortTitle) { getString(R.string.short_title) },
+                getItem(coverImageType) { getString(R.string.cover_image_file_type) },
+                getItem(pageImageTypes.size) { getString(R.string.page_count) },
+                getItem(thumbnailImageType) { getString(R.string.thumbnail_image_file_type) },
+                getItem(scanlator) { getString(R.string.scanlator) },
             )
         }
     }
diff --git a/app/src/main/java/exh/metadata/metadata/PervEdenSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/PervEdenSearchMetadata.kt
index 0c419e1ba..71bbb4bef 100644
--- a/app/src/main/java/exh/metadata/metadata/PervEdenSearchMetadata.kt
+++ b/app/src/main/java/exh/metadata/metadata/PervEdenSearchMetadata.kt
@@ -67,17 +67,16 @@ class PervEdenSearchMetadata : RaisedSearchMetadata() {
     override fun getExtraInfoPairs(context: Context): List<Pair<String, String>> {
         return with(context) {
             listOfNotNull(
-                pvId?.let { getString(R.string.id) to it },
-                url?.let { getString(R.string.url) to it },
-                thumbnailUrl?.let { getString(R.string.thumbnail_url) to it },
-                title?.let { getString(R.string.title) to it },
-                altTitles.nullIfEmpty()?.joinToString()
-                    ?.let { getString(R.string.alt_titles) to it },
-                artist?.let { getString(R.string.artist) to it },
-                genre?.let { getString(R.string.genre) to it },
-                rating?.let { getString(R.string.average_rating) to it.toString() },
-                status?.let { getString(R.string.status) to it },
-                lang?.let { getString(R.string.language) to it },
+                getItem(pvId) { getString(R.string.id) },
+                getItem(url) { getString(R.string.url) },
+                getItem(thumbnailUrl) { getString(R.string.thumbnail_url) },
+                getItem(title) { getString(R.string.title) },
+                getItem(altTitles.nullIfEmpty(), { it.joinToString() }) { getString(R.string.alt_titles) },
+                getItem(artist) { getString(R.string.artist) },
+                getItem(genre) { getString(R.string.genre) },
+                getItem(rating) { getString(R.string.average_rating) },
+                getItem(status) { getString(R.string.status) },
+                getItem(lang) { getString(R.string.language) },
             )
         }
     }
diff --git a/app/src/main/java/exh/metadata/metadata/PururinSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/PururinSearchMetadata.kt
index 2cea3e332..f466d7011 100644
--- a/app/src/main/java/exh/metadata/metadata/PururinSearchMetadata.kt
+++ b/app/src/main/java/exh/metadata/metadata/PururinSearchMetadata.kt
@@ -56,16 +56,16 @@ class PururinSearchMetadata : RaisedSearchMetadata() {
     override fun getExtraInfoPairs(context: Context): List<Pair<String, String>> {
         return with(context) {
             listOfNotNull(
-                prId?.let { getString(R.string.id) to it.toString() },
-                title?.let { getString(R.string.title) to it },
-                altTitle?.let { getString(R.string.alt_title) to it },
-                thumbnailUrl?.let { getString(R.string.thumbnail_url) to it },
-                uploaderDisp?.let { getString(R.string.uploader_capital) to it },
-                uploader?.let { getString(R.string.uploader) to it },
-                pages?.let { getString(R.string.page_count) to it.toString() },
-                fileSize?.let { getString(R.string.gallery_size) to it },
-                ratingCount?.let { getString(R.string.total_ratings) to it.toString() },
-                averageRating?.let { getString(R.string.average_rating) to it.toString() },
+                getItem(prId) { getString(R.string.id) },
+                getItem(title) { getString(R.string.title) },
+                getItem(altTitle) { getString(R.string.alt_title) },
+                getItem(thumbnailUrl) { getString(R.string.thumbnail_url) },
+                getItem(uploaderDisp) { getString(R.string.uploader_capital) },
+                getItem(uploader) { getString(R.string.uploader) },
+                getItem(pages) { getString(R.string.page_count) },
+                getItem(fileSize) { getString(R.string.gallery_size) },
+                getItem(ratingCount) { getString(R.string.total_ratings) },
+                getItem(averageRating) { getString(R.string.average_rating) },
             )
         }
     }
diff --git a/app/src/main/java/exh/metadata/metadata/TsuminoSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/TsuminoSearchMetadata.kt
index e19a6ed8b..2bbd26966 100644
--- a/app/src/main/java/exh/metadata/metadata/TsuminoSearchMetadata.kt
+++ b/app/src/main/java/exh/metadata/metadata/TsuminoSearchMetadata.kt
@@ -69,20 +69,20 @@ class TsuminoSearchMetadata : RaisedSearchMetadata() {
     override fun getExtraInfoPairs(context: Context): List<Pair<String, String>> {
         return with(context) {
             listOfNotNull(
-                tmId?.let { getString(R.string.id) to it.toString() },
-                title?.let { getString(R.string.title) to it },
-                uploader?.let { getString(R.string.uploader) to it },
-                uploadDate?.let { getString(R.string.date_posted) to MetadataUtil.EX_DATE_FORMAT.format(Date(it)) },
-                length?.let { getString(R.string.page_count) to it.toString() },
-                ratingString?.let { getString(R.string.rating_string) to it },
-                averageRating?.let { getString(R.string.average_rating) to it.toString() },
-                userRatings?.let { getString(R.string.total_ratings) to it.toString() },
-                favorites?.let { getString(R.string.total_favorites) to it.toString() },
-                category?.let { getString(R.string.genre) to it },
-                collection?.let { getString(R.string.collection) to it },
-                group?.let { getString(R.string.group) to it },
-                parody.nullIfEmpty()?.joinToString()?.let { getString(R.string.parodies) to it },
-                character.nullIfEmpty()?.joinToString()?.let { getString(R.string.characters) to it },
+                getItem(tmId) { getString(R.string.id) },
+                getItem(title) { getString(R.string.title) },
+                getItem(uploader) { getString(R.string.uploader) },
+                getItem(uploadDate, { MetadataUtil.EX_DATE_FORMAT.format(Date(it)) }) { getString(R.string.date_posted) },
+                getItem(length) { getString(R.string.page_count) },
+                getItem(ratingString) { getString(R.string.rating_string) },
+                getItem(averageRating) { getString(R.string.average_rating) },
+                getItem(userRatings) { getString(R.string.total_ratings) },
+                getItem(favorites) { getString(R.string.total_favorites) },
+                getItem(category) { getString(R.string.genre) },
+                getItem(collection) { getString(R.string.collection) },
+                getItem(group) { getString(R.string.group) },
+                getItem(parody.nullIfEmpty(), { it.joinToString() }) { getString(R.string.parodies) },
+                getItem(character.nullIfEmpty(), { it.joinToString() }) { getString(R.string.characters) },
             )
         }
     }
diff --git a/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt b/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt
index b1d3322f7..ac8092fd0 100644
--- a/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt
+++ b/app/src/main/java/exh/metadata/metadata/base/RaisedSearchMetadata.kt
@@ -54,6 +54,15 @@ abstract class RaisedSearchMetadata {
         if (newTitle != null) titles += RaisedTitle(newTitle, type)
     }
 
+    fun <T : Any> getItem(
+        item: T?,
+        toString: (T) -> String = Any::toString,
+        block: (T) -> String,
+    ): Pair<String, String>? {
+        item ?: return null
+        return block(item) to toString(item)
+    }
+
     open fun copyTo(manga: SManga) {
         val infoManga = createMangaInfo(manga.toMangaInfo()).toSManga()
         manga.copyFrom(infoManga)