Repository: Automattic/pocket-casts-android
Pull request #3963: Rename "Similar shows" tab to "You might like"
Author: login: geekygecko
Labels: name: [Type] Feature
description: Adding a new feature.
name: [Project] Recommendations
Created: 2025-05-07T03:20:02Z | Merged: 2025-05-07T21:26:29Z

## Description

The name of the recommendations list on the podcast page changed from "Similar shows" to "You might like". I have also changed the variable names so future changes aren't confusing.

Internal discussion: p1746504797556169-slack-C08FYE3MUGN

I have also included a fix for a fatal crash. It would happen when you tapped into a podcast and quickly tapped the back button. It seemed to be related to throwing an exception from the Coroutine.

## Testing Instructions
1. Open a popular podcast's page
2. ✅ Check the name of the tab has changed

## Screenshots 

| Before | After |
| --- | --- |
| ![Screenshot_20250507_124932](https://github.com/user-attachments/assets/bffbac66-21ee-48d1-9c15-0af719ce5f78) | ![Screenshot_20250507_124721](https://github.com/user-attachments/assets/a2481915-95a8-40ee-bc94-5253fe30a003)  | 

## Checklist
- [x] If this is a user-facing change, I have added an entry in CHANGELOG.md
- [x] Ensure the linter passes (`./gradlew spotlessApply` to automatically apply formatting/linting)
- [x] I have considered whether it makes sense to add tests for my changes
- [x] All strings that need to be localized are in `modules/services/localization/src/main/res/values/strings.xml`
- [x] Any jetpack compose components I added or changed are covered by compose previews
- [x] I have updated (or requested that someone edit) [the spreadsheet](https://docs.google.com/spreadsheets/d/107jqrutZhU0fVZJ19SBqxxVKbV2NWSdQC9MFYdLiAxc/edit?usp=sharing) to reflect any new or changed analytics.


Diff:
diff --git a/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/PodcastAdapter.kt b/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/PodcastAdapter.kt
index 7fb560b787e..479f9b5860f 100644
--- a/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/PodcastAdapter.kt
+++ b/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/PodcastAdapter.kt
@@ -46,13 +46,13 @@ import au.com.shiftyjelly.pocketcasts.podcasts.view.podcast.adapter.DividerLineV
 import au.com.shiftyjelly.pocketcasts.podcasts.view.podcast.adapter.NoBookmarkViewHolder
 import au.com.shiftyjelly.pocketcasts.podcasts.view.podcast.adapter.PaddingViewHolder
 import au.com.shiftyjelly.pocketcasts.podcasts.view.podcast.adapter.PodrollViewHolder
-import au.com.shiftyjelly.pocketcasts.podcasts.view.podcast.adapter.SimilarPodcastViewHolder
+import au.com.shiftyjelly.pocketcasts.podcasts.view.podcast.adapter.RecommendedPodcastViewHolder
 import au.com.shiftyjelly.pocketcasts.podcasts.view.podcast.adapter.TabsViewHolder
 import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.PodcastRatingsViewModel
 import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.PodcastRatingsViewModel.RatingState
 import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.PodcastRatingsViewModel.RatingTappedSource
 import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.PodcastViewModel.PodcastTab
-import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.podcast.SimilarPodcastsResult
+import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.podcast.RecommendationsResult
 import au.com.shiftyjelly.pocketcasts.preferences.Settings
 import au.com.shiftyjelly.pocketcasts.preferences.model.ArtworkConfiguration.Element
 import au.com.shiftyjelly.pocketcasts.repositories.download.DownloadManager
@@ -149,8 +149,8 @@ class PodcastAdapter(
     private val onClickCategory: (Podcast) -> Unit,
     private val onClickWebsite: (Podcast) -> Unit,
     private val onArtworkAvailable: (Podcast) -> Unit,
-    private val onSimilarPodcastClicked: (String, String) -> Unit,
-    private val onSimilarPodcastSubscribeClicked: (String, String) -> Unit,
+    private val onRecommendedPodcastClicked: (String, String) -> Unit,
+    private val onRecommendedPodcastSubscribeClicked: (String, String) -> Unit,
     private val onPodrollHeaderClicked: () -> Unit,
     private val onPodrollPodcastClicked: (String) -> Unit,
     private val onPodrollPodcastSubscribeClicked: (String) -> Unit,
@@ -195,7 +195,7 @@ class PodcastAdapter(
     data class PaddingRow(
         val padding: Dp,
     )
-    data class SimilarPodcast(
+    data class RecommendedPodcast(
         val listDate: String,
         val podcast: DiscoverPodcast,
         val onRowClick: (podcastUuid: String, listDate: String) -> Unit,
@@ -214,7 +214,7 @@ class PodcastAdapter(
         private const val VIEW_TYPE_BOOKMARK_UPSELL = 103
         private const val VIEW_TYPE_NO_BOOKMARK = 104
         const val VIEW_TYPE_PODCAST_HEADER = 105
-        private const val VIEW_TYPE_SIMILAR_PODCAST = 106
+        private const val VIEW_TYPE_RECOMMENDED_PODCAST = 106
         private const val VIEW_TYPE_PODROLL_HEADER = 107
         private const val VIEW_TYPE_DIVIDER_LINE = 108
         private const val VIEW_TYPE_PADDING_ROW = 109
@@ -286,7 +286,7 @@ class PodcastAdapter(
             VIEW_TYPE_BOOKMARK_HEADER -> BookmarkHeaderViewHolder(ComposeView(parent.context), theme)
             VIEW_TYPE_BOOKMARK_UPSELL -> BookmarkUpsellViewHolder(ComposeView(parent.context), onGetBookmarksClicked, theme)
             VIEW_TYPE_NO_BOOKMARK -> NoBookmarkViewHolder(ComposeView(parent.context), theme, onHeadsetSettingsClicked)
-            VIEW_TYPE_SIMILAR_PODCAST -> SimilarPodcastViewHolder(ComposeView(parent.context), theme)
+            VIEW_TYPE_RECOMMENDED_PODCAST -> RecommendedPodcastViewHolder(ComposeView(parent.context), theme)
             VIEW_TYPE_PODROLL_HEADER -> PodrollViewHolder(ComposeView(parent.context), theme)
             VIEW_TYPE_DIVIDER_LINE -> DividerLineViewHolder(ComposeView(parent.context), theme)
             VIEW_TYPE_PADDING_ROW -> PaddingViewHolder(ComposeView(parent.context))
@@ -328,7 +328,7 @@ class PodcastAdapter(
             is BookmarkHeaderViewHolder -> holder.bind(getItem(position) as BookmarkHeader)
             is BookmarkUpsellViewHolder -> holder.bind()
             is NoBookmarkViewHolder -> holder.bind()
-            is SimilarPodcastViewHolder -> holder.bind(getItem(position) as SimilarPodcast)
+            is RecommendedPodcastViewHolder -> holder.bind(getItem(position) as RecommendedPodcast)
             is PodrollViewHolder -> holder.bind(getItem(position) as PodrollHeaderRow)
             is DividerLineViewHolder -> holder.bind()
             is PaddingViewHolder -> holder.bind(getItem(position) as PaddingRow)
@@ -596,22 +596,22 @@ class PodcastAdapter(
         submitList(content)
     }
 
-    fun setSimilarPodcasts(
-        similarPodcasts: SimilarPodcastsResult,
+    fun setRecommendations(
+        result: RecommendationsResult,
         tabs: List<PodcastTab>,
     ) {
         val content = buildList {
             add(Podcast())
-            add(TabsHeader(tabs = tabs, selectedTab = PodcastTab.SIMILAR_SHOWS, onTabClicked = onTabClicked))
-            if (similarPodcasts is SimilarPodcastsResult.Success) {
-                val list = similarPodcasts.listFeed
+            add(TabsHeader(tabs = tabs, selectedTab = PodcastTab.RECOMMENDATIONS, onTabClicked = onTabClicked))
+            if (result is RecommendationsResult.Success) {
+                val list = result.listFeed
                 // Podroll
                 val podroll = list.podroll
                 if (!podroll.isNullOrEmpty()) {
                     add(PodrollHeaderRow(onClick = onPodrollHeaderClicked))
                     podroll.forEachIndexed { index, podcast ->
                         add(
-                            SimilarPodcast(
+                            RecommendedPodcast(
                                 listDate = list.date ?: "",
                                 podcast = podcast,
                                 onRowClick = { podcastUuid, _ -> onPodrollPodcastClicked(podcastUuid) },
@@ -623,15 +623,15 @@ class PodcastAdapter(
                     add(DividerLineRow)
                 }
                 add(PaddingRow(12.dp))
-                // Recommended similar podcasts
+                // Recommended podcasts
                 val podcasts = list.podcasts
                 podcasts?.forEachIndexed { index, podcast ->
                     add(
-                        SimilarPodcast(
+                        RecommendedPodcast(
                             listDate = list.date ?: "",
                             podcast = podcast,
-                            onRowClick = onSimilarPodcastClicked,
-                            onSubscribeClick = onSimilarPodcastSubscribeClicked,
+                            onRowClick = onRecommendedPodcastClicked,
+                            onSubscribeClick = onRecommendedPodcastSubscribeClicked,
                         ),
                     )
                 }
@@ -662,7 +662,7 @@ class PodcastAdapter(
             is BookmarkHeader -> VIEW_TYPE_BOOKMARK_HEADER
             is BookmarkUpsell -> VIEW_TYPE_BOOKMARK_UPSELL
             is NoBookmarkMessage -> VIEW_TYPE_NO_BOOKMARK
-            is SimilarPodcast -> VIEW_TYPE_SIMILAR_PODCAST
+            is RecommendedPodcast -> VIEW_TYPE_RECOMMENDED_PODCAST
             is PodrollHeaderRow -> VIEW_TYPE_PODROLL_HEADER
             is DividerLineRow -> VIEW_TYPE_DIVIDER_LINE
             is PaddingRow -> VIEW_TYPE_PADDING_ROW
@@ -684,7 +684,7 @@ class PodcastAdapter(
             is DividerRow -> item.groupIndex.toLong()
             is PodcastEpisode -> item.adapterId
             is BookmarkItemData -> item.bookmark.adapterId
-            is SimilarPodcast -> item.podcast.adapterId
+            is RecommendedPodcast -> item.podcast.adapterId
             is PodrollHeaderRow -> Long.MAX_VALUE - 8
             is DividerLineRow -> Long.MAX_VALUE - 9
             is PaddingRow -> Long.MAX_VALUE - 10
diff --git a/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/PodcastFragment.kt b/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/PodcastFragment.kt
index f5134b52c37..0fc1dd4a140 100644
--- a/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/PodcastFragment.kt
+++ b/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/PodcastFragment.kt
@@ -816,13 +816,13 @@ class PodcastFragment : BaseFragment() {
                     updateStausBarForBackground()
                 }
             },
-            onSimilarPodcastClicked = { podcastUuid, listDate ->
-                viewModel.onSimilarPodcastClicked(podcastUuid = podcastUuid, listDate = listDate)
+            onRecommendedPodcastClicked = { podcastUuid, listDate ->
+                viewModel.onRecommendedPodcastClicked(podcastUuid = podcastUuid, listDate = listDate)
                 val fragment = newInstance(podcastUuid = podcastUuid, fromListUuid = "recommendations_podcast", sourceView = sourceView)
                 (activity as FragmentHostListener).addFragment(fragment)
             },
-            onSimilarPodcastSubscribeClicked = { podcastUuid, listDate ->
-                viewModel.onSimilarPodcastSubscribeClicked(podcastUuid = podcastUuid, listDate = listDate)
+            onRecommendedPodcastSubscribeClicked = { podcastUuid, listDate ->
+                viewModel.onRecommendedPodcastSubscribeClicked(podcastUuid = podcastUuid, listDate = listDate)
             },
             onPodrollHeaderClicked = {
                 showPodrollInformationModal()
@@ -1091,9 +1091,9 @@ class PodcastFragment : BaseFragment() {
 
                             adapter?.notifyDataSetChanged()
                         }
-                        PodcastTab.SIMILAR_SHOWS -> {
-                            adapter?.setSimilarPodcasts(
-                                similarPodcasts = state.similarPodcasts,
+                        PodcastTab.RECOMMENDATIONS -> {
+                            adapter?.setRecommendations(
+                                result = state.recommendations,
                                 tabs = state.tabs,
                             )
                         }
diff --git a/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/adapter/SimilarPodcastViewHolder.kt b/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/adapter/RecommendedPodcastViewHolder.kt
similarity index 92%
rename from modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/adapter/SimilarPodcastViewHolder.kt
rename to modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/adapter/RecommendedPodcastViewHolder.kt
index 6b497088762..4e3fd2a6d9e 100644
--- a/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/adapter/SimilarPodcastViewHolder.kt
+++ b/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/view/podcast/adapter/RecommendedPodcastViewHolder.kt
@@ -7,12 +7,12 @@ import au.com.shiftyjelly.pocketcasts.compose.podcast.ListPodcastSubscribeRow
 import au.com.shiftyjelly.pocketcasts.podcasts.view.podcast.PodcastAdapter
 import au.com.shiftyjelly.pocketcasts.ui.theme.Theme
 
-class SimilarPodcastViewHolder(
+class RecommendedPodcastViewHolder(
     private val composeView: ComposeView,
     private val theme: Theme,
 ) : RecyclerView.ViewHolder(composeView) {
 
-    fun bind(data: PodcastAdapter.SimilarPodcast) {
+    fun bind(data: PodcastAdapter.RecommendedPodcast) {
         composeView.setContent {
             AppTheme(theme.activeTheme) {
                 val uuid = data.podcast.uuid
diff --git a/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/PodcastViewModel.kt b/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/PodcastViewModel.kt
index 1864dcdb6ab..a9b97a96206 100644
--- a/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/PodcastViewModel.kt
+++ b/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/PodcastViewModel.kt
@@ -22,8 +22,8 @@ import au.com.shiftyjelly.pocketcasts.podcasts.helper.search.BookmarkSearchHandl
 import au.com.shiftyjelly.pocketcasts.podcasts.helper.search.EpisodeSearchHandler
 import au.com.shiftyjelly.pocketcasts.podcasts.helper.search.SearchHandler
 import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.PodcastViewModel.PodcastTab
-import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.podcast.SimilarPodcastHandler
-import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.podcast.SimilarPodcastsResult
+import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.podcast.RecommendationsHandler
+import au.com.shiftyjelly.pocketcasts.podcasts.viewmodel.podcast.RecommendationsResult
 import au.com.shiftyjelly.pocketcasts.preferences.Settings
 import au.com.shiftyjelly.pocketcasts.preferences.model.BookmarksSortType
 import au.com.shiftyjelly.pocketcasts.preferences.model.BookmarksSortTypeForPodcast
@@ -84,7 +84,7 @@ class PodcastViewModel
     private val bookmarkManager: BookmarkManager,
     private val episodeSearchHandler: EpisodeSearchHandler,
     private val bookmarkSearchHandler: BookmarkSearchHandler,
-    private val similarPodcastHandler: SimilarPodcastHandler,
+    private val recommendationsHandler: RecommendationsHandler,
     val multiSelectEpisodesHelper: MultiSelectEpisodesHelper,
     val multiSelectBookmarksHelper: MultiSelectBookmarksHelper,
     private val settings: Settings,
@@ -175,7 +175,7 @@ class PodcastViewModel
                     )
                 }.toFlowable(BackpressureStrategy.LATEST)
             }
-            .loadEpisodesAndBookmarks(episodeManager, bookmarkManager, similarPodcastHandler, settings)
+            .loadEpisodesAndBookmarks(episodeManager, bookmarkManager, recommendationsHandler, settings)
             .doOnNext {
                 if (it is UiState.Loaded) {
                     val groups = it.podcast.grouping.formGroups(it.episodes, it.podcast, resources)
@@ -286,9 +286,7 @@ class PodcastViewModel
         when (getCurrentTab()) {
             PodcastTab.EPISODES -> episodeSearchHandler.searchQueryUpdated(newValue)
             PodcastTab.BOOKMARKS -> bookmarkSearchHandler.searchQueryUpdated(newValue)
-            PodcastTab.SIMILAR_SHOWS -> {
-                // No search for similar shows
-            }
+            PodcastTab.RECOMMENDATIONS -> Unit // No search for the recommendations tab
         }
     }
 
@@ -465,9 +463,7 @@ class PodcastViewModel
         when (uiState.showTab) {
             PodcastTab.EPISODES -> multiSelectEpisodesHelper.deselectAllInList(uiState.episodes)
             PodcastTab.BOOKMARKS -> multiSelectBookmarksHelper.deselectAllInList(uiState.bookmarks)
-            PodcastTab.SIMILAR_SHOWS -> {
-                // No multi select for similar shows
-            }
+            PodcastTab.RECOMMENDATIONS -> Unit // No multi select for the recommendations tab
         }
     }
 
@@ -524,9 +520,7 @@ class PodcastViewModel
         when (uiState.showTab) {
             PodcastTab.EPISODES -> multiSelectEpisodesHelper.selectAllInList(uiState.episodes)
             PodcastTab.BOOKMARKS -> multiSelectBookmarksHelper.selectAllInList(uiState.bookmarks)
-            PodcastTab.SIMILAR_SHOWS -> {
-                // No multi select for similar shows
-            }
+            PodcastTab.RECOMMENDATIONS -> Unit // No multi select for recommendations tab
         }
     }
 
@@ -630,10 +624,10 @@ class PodcastViewModel
         analyticsTracker.track(AnalyticsEvent.PODCAST_SCREEN_FUNDING_TAPPED, mapOf("podcast_uuid" to podcastUuid))
     }
 
-    fun onSimilarPodcastSubscribeClicked(podcastUuid: String, listDate: String) {
+    fun onRecommendedPodcastSubscribeClicked(podcastUuid: String, listDate: String) {
         podcastManager.subscribeToPodcast(podcastUuid = podcastUuid, sync = true)
         analyticsTracker.track(
-            event = AnalyticsEvent.PODCAST_SCREEN_SIMILAR_SHOW_SUBSCRIBED,
+            event = AnalyticsEvent.PODCAST_SCREEN_YOU_MIGHT_LIKE_SUBSCRIBED,
             properties = mapOf(
                 "podcast_uuid" to podcastUuid,
                 "list_datetime" to listDate,
@@ -641,9 +635,9 @@ class PodcastViewModel
         )
     }
 
-    fun onSimilarPodcastClicked(podcastUuid: String, listDate: String) {
+    fun onRecommendedPodcastClicked(podcastUuid: String, listDate: String) {
         analyticsTracker.track(
-            event = AnalyticsEvent.PODCAST_SCREEN_SIMILAR_SHOW_TAPPED,
+            event = AnalyticsEvent.PODCAST_SCREEN_YOU_MIGHT_LIKE_TAPPED,
             properties = mapOf(
                 "podcast_uuid" to podcastUuid,
                 "list_datetime" to listDate,
@@ -679,9 +673,9 @@ class PodcastViewModel
             labelResId = LR.string.bookmarks,
             analyticsValue = "bookmarks",
         ),
-        SIMILAR_SHOWS(
-            labelResId = LR.string.similar_shows,
-            analyticsValue = "similar_shows",
+        RECOMMENDATIONS(
+            labelResId = LR.string.you_might_like,
+            analyticsValue = "you_might_like",
         ),
     }
 
@@ -690,7 +684,7 @@ class PodcastViewModel
             val podcast: Podcast,
             val episodes: List<PodcastEpisode>,
             val bookmarks: List<Bookmark>,
-            val similarPodcasts: SimilarPodcastsResult,
+            val recommendations: RecommendationsResult,
             val showingArchived: Boolean,
             val episodeCount: Int,
             val archivedCount: Int,
@@ -750,7 +744,7 @@ private data class CombinedEpisodeAndBookmarkData(
 private fun Flowable<CombinedEpisodeAndBookmarkData>.loadEpisodesAndBookmarks(
     episodeManager: EpisodeManager,
     bookmarkManager: BookmarkManager,
-    similarPodcastHandler: SimilarPodcastHandler,
+    recommendationsHandler: RecommendationsHandler,
     settings: Settings,
 ): Flowable<PodcastViewModel.UiState> {
     return this.switchMap { (podcast, showArchived, episodeSearchResults, bookmarkSearchResults) ->
@@ -761,8 +755,8 @@ private fun Flowable<CombinedEpisodeAndBookmarkData>.loadEpisodesAndBookmarks(
         Flowable.combineLatest(
             episodeManager.findEpisodesByPodcastOrderedRxFlowable(podcast)
                 .doOnNext {
-                    // load the similar podcasts after the episodes have been loaded
-                    similarPodcastHandler.setEnabled(true)
+                    // load the recommendations after the episodes have been loaded
+                    recommendationsHandler.setEnabled(true)
                 }
                 .map {
                     val sortFunction = podcast.grouping.sortFunction
@@ -783,8 +777,8 @@ private fun Flowable<CombinedEpisodeAndBookmarkData>.loadEpisodesAndBookmarks(
                     { bookmarkSearchResults.searchUuids?.contains(it.uuid) ?: false },
                     searchResults = bookmarkSearchResults,
                 ),
-            similarPodcastHandler.getSimilarPodcastListFlowable(podcast),
-        ) { (searchList, episodeList), (bookmarks, _), similarPodcasts ->
+            recommendationsHandler.getRecommendationsFlowable(podcast),
+        ) { (searchList, episodeList), (bookmarks, _), recommendations ->
             val episodeCount = episodeList.size
             val archivedCount = episodeList.count { it.isArchived }
             val showArchivedWithSearch = episodeSearchResults.searchUuids != null || showArchived
@@ -818,14 +812,14 @@ private fun Flowable<CombinedEpisodeAndBookmarkData>.loadEpisodesAndBookmarks(
                 .filter { tab ->
                     tab == PodcastTab.EPISODES ||
                         tab == PodcastTab.BOOKMARKS ||
-                        (tab == PodcastTab.SIMILAR_SHOWS && similarPodcasts is SimilarPodcastsResult.Success)
+                        (tab == PodcastTab.RECOMMENDATIONS && recommendations is RecommendationsResult.Success)
                 }
 
             val state: PodcastViewModel.UiState = PodcastViewModel.UiState.Loaded(
                 podcast = podcast,
                 episodes = filteredList,
                 bookmarks = bookmarks,
-                similarPodcasts = similarPodcasts,
+                recommendations = recommendations,
                 showingArchived = showArchivedWithSearch,
                 episodeCount = episodeCount,
                 archivedCount = archivedCount,
diff --git a/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/SimilarPodcastHandler.kt b/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/RecommendationsHandler.kt
similarity index 72%
rename from modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/SimilarPodcastHandler.kt
rename to modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/RecommendationsHandler.kt
index e6d4ffb223c..bd6f62a8940 100644
--- a/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/SimilarPodcastHandler.kt
+++ b/modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/RecommendationsHandler.kt
@@ -8,18 +8,18 @@ import au.com.shiftyjelly.pocketcasts.utils.featureflag.Feature
 import au.com.shiftyjelly.pocketcasts.utils.featureflag.FeatureFlag
 import io.reactivex.BackpressureStrategy
 import io.reactivex.Flowable
-import io.reactivex.Single
+import io.reactivex.Maybe
 import io.reactivex.subjects.BehaviorSubject
 import javax.inject.Inject
-import kotlinx.coroutines.rx2.rxSingle
+import kotlinx.coroutines.rx2.rxMaybe
 import timber.log.Timber
 
-sealed class SimilarPodcastsResult {
-    data class Success(val listFeed: ListFeed) : SimilarPodcastsResult()
-    object Empty : SimilarPodcastsResult()
+sealed class RecommendationsResult {
+    data class Success(val listFeed: ListFeed) : RecommendationsResult()
+    data object Empty : RecommendationsResult()
 }
 
-class SimilarPodcastHandler @Inject constructor(
+class RecommendationsHandler @Inject constructor(
     private val listRepository: ListRepository,
     private val podcastManager: PodcastManager,
 ) {
@@ -35,34 +35,33 @@ class SimilarPodcastHandler @Inject constructor(
         return enabledObservable.toFlowable(BackpressureStrategy.LATEST)
     }
 
-    fun getSimilarPodcastListFlowable(podcast: Podcast): Flowable<SimilarPodcastsResult> {
+    fun getRecommendationsFlowable(podcast: Podcast): Flowable<RecommendationsResult> {
         return isEnabledFlowable()
             .distinctUntilChanged()
             .switchMap { enabled ->
                 if (enabled) {
-                    getSimilarPodcastListSingle(podcast)
+                    getRecommendationsMaybe(podcast)
                         .toFlowable()
                         .addSubscribedStatusFlowable()
                         .map { listFeed ->
                             if (listFeed.podcasts.isNullOrEmpty()) {
-                                SimilarPodcastsResult.Empty
+                                RecommendationsResult.Empty
                             } else {
-                                SimilarPodcastsResult.Success(listFeed)
+                                RecommendationsResult.Success(listFeed)
                             }
                         }
                         .onErrorReturn { error ->
-                            Timber.e(error, "Error loading similar podcasts")
-                            SimilarPodcastsResult.Empty
+                            Timber.e(error, "Error loading recommendations")
+                            RecommendationsResult.Empty
                         }
                 } else {
-                    Flowable.just(SimilarPodcastsResult.Empty)
+                    Flowable.just(RecommendationsResult.Empty)
                 }
             }
     }
 
-    private fun getSimilarPodcastListSingle(podcast: Podcast): Single<ListFeed> = rxSingle {
-        listRepository.getSimilarPodcasts(podcast.uuid)
-            ?: error("Failed to load similar podcasts")
+    private fun getRecommendationsMaybe(podcast: Podcast): Maybe<ListFeed> = rxMaybe {
+        listRepository.getPodcastRecommendations(podcast.uuid)
     }
 
     private fun Flowable<ListFeed>.addSubscribedStatusFlowable(): Flowable<ListFeed> {
diff --git a/modules/features/podcasts/src/test/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/SimilarPodcastHandlerTest.kt b/modules/features/podcasts/src/test/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/RecommendationsHandlerTest.kt
similarity index 87%
rename from modules/features/podcasts/src/test/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/SimilarPodcastHandlerTest.kt
rename to modules/features/podcasts/src/test/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/RecommendationsHandlerTest.kt
index 4b13917308e..3d5120985ef 100644
--- a/modules/features/podcasts/src/test/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/SimilarPodcastHandlerTest.kt
+++ b/modules/features/podcasts/src/test/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/RecommendationsHandlerTest.kt
@@ -22,14 +22,14 @@ import org.junit.Test
 import org.mockito.kotlin.mock
 import org.mockito.kotlin.whenever
 
-class SimilarPodcastHandlerTest {
+class RecommendationsHandlerTest {
 
     @get:Rule
     val featureFlagRule = InMemoryFeatureFlagRule()
 
     private lateinit var listWebService: ListWebService
     private lateinit var podcastManager: PodcastManager
-    private lateinit var similarPodcasts: SimilarPodcastHandler
+    private lateinit var recommendations: RecommendationsHandler
     private lateinit var testPodcast: Podcast
     private lateinit var testListFeed: ListFeed
     private lateinit var testDiscoverPodcasts: List<DiscoverPodcast>
@@ -39,7 +39,7 @@ class SimilarPodcastHandlerTest {
         listWebService = mock()
         val listRepository = ListRepository(listWebService = listWebService, syncManager = null, platform = "android")
         podcastManager = mock()
-        similarPodcasts = SimilarPodcastHandler(listRepository, podcastManager)
+        recommendations = RecommendationsHandler(listRepository, podcastManager)
 
         testPodcast = Podcast(uuid = UUID.randomUUID().toString())
         testDiscoverPodcasts = listOf(
@@ -54,9 +54,9 @@ class SimilarPodcastHandlerTest {
         // feature flag is disabled
         FeatureFlag.setEnabled(feature = Feature.RECOMMENDATIONS, enabled = false)
 
-        similarPodcasts.setEnabled(true)
+        recommendations.setEnabled(true)
 
-        val list = similarPodcasts.getSimilarPodcastListFlowable(testPodcast)
+        val list = recommendations.getRecommendationsFlowable(testPodcast)
             .test()
             .awaitCount(1)
             .assertNoErrors()
@@ -64,13 +64,13 @@ class SimilarPodcastHandlerTest {
             .first()
 
         // no podcasts should be found
-        assertTrue(list is SimilarPodcastsResult.Empty)
+        assertTrue(list is RecommendationsResult.Empty)
     }
 
     @Test
     fun testEnabledAndFeatureFlagOnPodcastsFetched() = runTest {
         FeatureFlag.setEnabled(feature = Feature.RECOMMENDATIONS, enabled = true)
-        similarPodcasts.setEnabled(true)
+        recommendations.setEnabled(true)
 
         // expected URL for the list recommendation
         val listUrl = "${Settings.SERVER_API_URL}/recommendations/podcast/${testPodcast.uuid}"
@@ -82,7 +82,7 @@ class SimilarPodcastHandlerTest {
         whenever(podcastManager.podcastSubscriptionsRxFlowable()).thenReturn(Flowable.just(emptyList()))
 
         // call the method to test
-        val list = similarPodcasts.getSimilarPodcastListFlowable(testPodcast)
+        val list = recommendations.getRecommendationsFlowable(testPodcast)
             .test()
             .awaitCount(1)
             .assertNoErrors()
@@ -90,9 +90,9 @@ class SimilarPodcastHandlerTest {
             .first()
 
         // check that the podcasts are fetched correctly
-        assertTrue(list is SimilarPodcastsResult.Success)
+        assertTrue(list is RecommendationsResult.Success)
 
-        val podcasts = (list as SimilarPodcastsResult.Success).listFeed.podcasts
+        val podcasts = (list as RecommendationsResult.Success).listFeed.podcasts
         assertEquals(testListFeed.podcasts?.size, podcasts?.size)
 
         // check that the subscribed status is set correctly
diff --git a/modules/services/analytics/src/main/java/au/com/shiftyjelly/pocketcasts/analytics/AnalyticsEvent.kt b/modules/services/analytics/src/main/java/au/com/shiftyjelly/pocketcasts/analytics/AnalyticsEvent.kt
index c503fa8ceed..1ba848fa077 100644
--- a/modules/services/analytics/src/main/java/au/com/shiftyjelly/pocketcasts/analytics/AnalyticsEvent.kt
+++ b/modules/services/analytics/src/main/java/au/com/shiftyjelly/pocketcasts/analytics/AnalyticsEvent.kt
@@ -238,8 +238,8 @@ enum class AnalyticsEvent(val key: String) {
     PODCAST_SCREEN_CATEGORY_TAPPED("podcast_screen_category_tapped"),
     PODCAST_SCREEN_PODCAST_DETAILS_LINK_TAPPED("podcast_screen_podcast_details_link_tapped"),
     PODCAST_SCREEN_FUNDING_TAPPED("podcast_screen_funding_tapped"),
-    PODCAST_SCREEN_SIMILAR_SHOW_TAPPED("podcast_screen_similar_show_tapped"),
-    PODCAST_SCREEN_SIMILAR_SHOW_SUBSCRIBED("podcast_screen_similar_show_subscribed"),
+    PODCAST_SCREEN_YOU_MIGHT_LIKE_TAPPED("podcast_screen_you_might_like_tapped"),
+    PODCAST_SCREEN_YOU_MIGHT_LIKE_SUBSCRIBED("podcast_screen_you_might_like_subscribed"),
     PODCAST_SCREEN_PODROLL_PODCAST_TAPPED("podcast_screen_podroll_podcast_tapped"),
     PODCAST_SCREEN_PODROLL_PODCAST_SUBSCRIBED("podcast_screen_podroll_podcast_subscribed"),
     PODCAST_SCREEN_PODROLL_INFORMATION_MODEL_SHOWN("podcast_screen_podroll_information_model_shown"),
diff --git a/modules/services/localization/src/main/res/values/strings.xml b/modules/services/localization/src/main/res/values/strings.xml
index 045f1be3d14..c00c058b9fd 100644
--- a/modules/services/localization/src/main/res/values/strings.xml
+++ b/modules/services/localization/src/main/res/values/strings.xml
@@ -87,7 +87,7 @@
     <string name="search_episodes_not_found_title">No episodes found</string>
     <string name="search_episodes_not_found_summary">We couldn\'t find any episode for that search. Try another keyword.</string>
     <string name="selected">Selected</string>
-    <string name="similar_shows">Similar Shows</string>
+    <string name="you_might_like">You might like</string>
     <string name="sort_newest_to_oldest">Newest to oldest</string>
     <string name="sort_oldest_to_newest">Oldest to newest</string>
     <string name="not_selected">Not selected</string>
diff --git a/modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/lists/ListRepository.kt b/modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/lists/ListRepository.kt
index 66c6dec52f4..09d670f5b32 100644
--- a/modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/lists/ListRepository.kt
+++ b/modules/services/repositories/src/main/java/au/com/shiftyjelly/pocketcasts/repositories/lists/ListRepository.kt
@@ -43,7 +43,7 @@ class ListRepository(
         return listWebService.getCategoriesList(url)
     }
 
-    suspend fun getSimilarPodcasts(podcastUuid: String): ListFeed? {
+    suspend fun getPodcastRecommendations(podcastUuid: String): ListFeed? {
         return getListFeed(url = "${Settings.SERVER_API_URL}/recommendations/podcast/$podcastUuid")
     }
 }


Reviews:
user: login: geekygecko
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-07T04:32:49Z
user: login: sztomek
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-07T11:27:44Z
user: login: geekygecko
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-07T12:15:12Z

Review comments:
diff_hunk: @@ -35,34 +35,33 @@ class SimilarPodcastHandler @Inject constructor(
         return enabledObservable.toFlowable(BackpressureStrategy.LATEST)
     }
 
-    fun getSimilarPodcastListFlowable(podcast: Podcast): Flowable<SimilarPodcastsResult> {
+    fun getYouMightLikeListFlowable(podcast: Podcast): Flowable<YouMightLikeResult> {
         return isEnabledFlowable()
             .distinctUntilChanged()
             .switchMap { enabled ->
                 if (enabled) {
-                    getSimilarPodcastListSingle(podcast)
+                    getYouMightLikeListMaybe(podcast)
                         .toFlowable()
                         .addSubscribedStatusFlowable()
                         .map { listFeed ->
                             if (listFeed.podcasts.isNullOrEmpty()) {
-                                SimilarPodcastsResult.Empty
+                                YouMightLikeResult.Empty
                             } else {
-                                SimilarPodcastsResult.Success(listFeed)
+                                YouMightLikeResult.Success(listFeed)
                             }
                         }
                         .onErrorReturn { error ->
-                            Timber.e(error, "Error loading similar podcasts")
-                            SimilarPodcastsResult.Empty
+                            Timber.e(error, "Error loading 'You might like' podcasts")
+                            YouMightLikeResult.Empty
                         }
                 } else {
-                    Flowable.just(SimilarPodcastsResult.Empty)
+                    Flowable.just(YouMightLikeResult.Empty)
                 }
             }
     }
 
-    private fun getSimilarPodcastListSingle(podcast: Podcast): Single<ListFeed> = rxSingle {
-        listRepository.getSimilarPodcasts(podcast.uuid)
-            ?: error("Failed to load similar podcasts")
+    private fun getYouMightLikeListMaybe(podcast: Podcast): Maybe<ListFeed> = rxMaybe {
+        listRepository.getYouMightLikePodcasts(podcast.uuid)
     }
path: modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/podcast/YouMightLikeHandler.kt
user: login: geekygecko
body: Here was the fix for the crash. 
created_at: 2025-05-07T04:32:48Z
author_association: MEMBER
diff_hunk: @@ -524,8 +524,8 @@ class PodcastViewModel
         when (uiState.showTab) {
             PodcastTab.EPISODES -> multiSelectEpisodesHelper.selectAllInList(uiState.episodes)
             PodcastTab.BOOKMARKS -> multiSelectBookmarksHelper.selectAllInList(uiState.bookmarks)
-            PodcastTab.SIMILAR_SHOWS -> {
-                // No multi select for similar shows
+            PodcastTab.YOU_MIGHT_LIKE -> {
+                // No multi select for you might like tab
path: modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/PodcastViewModel.kt
user: login: sztomek
body: 💡 instead of an empty clause, you could use `PodcastTab.YOU_MIGHT_LIKE -> Unit // No multi select for you might like tab`
created_at: 2025-05-07T11:26:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -524,8 +524,8 @@ class PodcastViewModel
         when (uiState.showTab) {
             PodcastTab.EPISODES -> multiSelectEpisodesHelper.selectAllInList(uiState.episodes)
             PodcastTab.BOOKMARKS -> multiSelectBookmarksHelper.selectAllInList(uiState.bookmarks)
-            PodcastTab.SIMILAR_SHOWS -> {
-                // No multi select for similar shows
+            PodcastTab.YOU_MIGHT_LIKE -> {
+                // No multi select for you might like tab
path: modules/features/podcasts/src/main/java/au/com/shiftyjelly/pocketcasts/podcasts/viewmodel/PodcastViewModel.kt
user: login: geekygecko
body: Thanks for the tip, I have changed that. 
created_at: 2025-05-07T12:15:12Z
author_association: MEMBER

PR comments:
user: login: wpmobilebot
created_at: 2025-05-07T03:22:41Z
body: <!-- REUSE_ID: app-prototype-build-link -->

<details><summary>📲 You can test the changes from this Pull Request in <b>📱 Mobile</b> by scanning the QR code below to install the corresponding build.</summary>
<table>
<tr>
  <td rowspan='4' width='260px'><img src='https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Fcdn.a8c-ci.services%2F8af446086b2a2e077ae6d4c1b8fadd0fdea615fb%2Fpocketcasts-app-prototype-build-pr3963-5a788c2.apk' width='250' height='250' /></td>
  <td><b>App Name</b></td><td> 📱 Mobile</td>
</tr>
<tr><td><b>Build Type</b></td><td>debugProd</td></tr>
<tr><td><b>Commit</b></td><td>5a788c29089cd9c1b25ae32031346f613e982acd</td></tr>
<tr><td><b>Direct Download</b></td><td><a href='https://cdn.a8c-ci.services/8af446086b2a2e077ae6d4c1b8fadd0fdea615fb/pocketcasts-app-prototype-build-pr3963-5a788c2.apk'><code>pocketcasts-app-prototype-build-pr3963-5a788c2.apk</code></a></td></tr>
</table>

</details>
<details><summary>📲 You can test the changes from this Pull Request in <b>🚗 Automotive</b> by scanning the QR code below to install the corresponding build.</summary>
<table>
<tr>
  <td rowspan='4' width='260px'><img src='https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Fcdn.a8c-ci.services%2F4ee1b6d78a0959a907f50a696d705f8c75f56c77%2Fpocketcasts-automotive-prototype-build-pr3963-5a788c2.apk' width='250' height='250' /></td>
  <td><b>App Name</b></td><td> 🚗 Automotive</td>
</tr>
<tr><td><b>Build Type</b></td><td>debugProd</td></tr>
<tr><td><b>Commit</b></td><td>5a788c29089cd9c1b25ae32031346f613e982acd</td></tr>
<tr><td><b>Direct Download</b></td><td><a href='https://cdn.a8c-ci.services/4ee1b6d78a0959a907f50a696d705f8c75f56c77/pocketcasts-automotive-prototype-build-pr3963-5a788c2.apk'><code>pocketcasts-automotive-prototype-build-pr3963-5a788c2.apk</code></a></td></tr>
</table>

</details>
<details><summary>📲 You can test the changes from this Pull Request in <b>⌚ Wear</b> by scanning the QR code below to install the corresponding build.</summary>
<table>
<tr>
  <td rowspan='4' width='260px'><img src='https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Fcdn.a8c-ci.services%2Ffed995626e931f22c8a6527d801082253889a6fc%2Fpocketcasts-wear-prototype-build-pr3963-5a788c2.apk' width='250' height='250' /></td>
  <td><b>App Name</b></td><td> ⌚ Wear</td>
</tr>
<tr><td><b>Build Type</b></td><td>debugProd</td></tr>
<tr><td><b>Commit</b></td><td>5a788c29089cd9c1b25ae32031346f613e982acd</td></tr>
<tr><td><b>Direct Download</b></td><td><a href='https://cdn.a8c-ci.services/fed995626e931f22c8a6527d801082253889a6fc/pocketcasts-wear-prototype-build-pr3963-5a788c2.apk'><code>pocketcasts-wear-prototype-build-pr3963-5a788c2.apk</code></a></td></tr>
</table>

</details>

author_association: COLLABORATOR