Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions Ruddarr/Dependencies/Toast.swift
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ extension Toast {
case seasonSearchQueued
case episodeSearchQueued
case monitoredSearchQueued
case missingMoviesSearchQueued
case missingEpisodesSearchQueued
case libraryRefreshQueued
case movieDeleted
case seriesDeleted
case fileDeleted
Expand Down Expand Up @@ -103,6 +106,12 @@ extension Toast {
custom(text: String(localized: "Episode Search Queued"), icon: "checkmark.circle.fill")
case .monitoredSearchQueued:
custom(text: String(localized: "Monitored Search Queued"), icon: "checkmark.circle.fill")
case .missingMoviesSearchQueued:
custom(text: String(localized: "Missing Movies Search Queued"), icon: "checkmark.circle.fill")
case .missingEpisodesSearchQueued:
custom(text: String(localized: "Missing Episodes Search Queued"), icon: "checkmark.circle.fill")
case .libraryRefreshQueued:
custom(text: String(localized: "Library Refresh Queued"), icon: "checkmark.circle.fill")
case .movieDeleted:
custom(text: String(localized: "Movie Deleted"), icon: "checkmark.circle.fill")
case .seriesDeleted:
Expand Down
50 changes: 50 additions & 0 deletions Ruddarr/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -2350,6 +2350,16 @@
}
}
},
"Library Refresh Queued" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Library Refresh Queued"
}
}
}
},
"Light" : {
"comment" : "Light appearance/mode",
"localizations" : {
Expand Down Expand Up @@ -2547,6 +2557,26 @@
}
}
},
"Missing Episodes Search Queued" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Missing Episodes Search Queued"
}
}
}
},
"Missing Movies Search Queued" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Missing Movies Search Queued"
}
}
}
},
"Monitor" : {
"comment" : "Label of picker of what to monitor (movie, collection, etc.)",
"localizations" : {
Expand Down Expand Up @@ -4307,6 +4337,16 @@
}
}
},
"Search All Missing" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Search All Missing"
}
}
}
},
"Search for Movie" : {
"localizations" : {
"en" : {
Expand Down Expand Up @@ -5199,6 +5239,16 @@
}
}
},
"Update Library" : {
"localizations" : {
"en" : {
"stringUnit" : {
"state" : "translated",
"value" : "Update Library"
}
}
}
},
"URL" : {
"localizations" : {
"en" : {
Expand Down
12 changes: 12 additions & 0 deletions Ruddarr/Models/Instances/InstanceCommand.swift
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import SwiftUI

enum InstanceCommand {
case refreshMoviesLibrary
case missingMoviesSearch
case refreshMovie(_ ids: [Movie.ID])
case search(_ ids: [Movie.ID])

case refreshSeriesLibrary
case missingEpisodeSearch
case refreshSeries(_ series: Series.ID)
case seriesSearch(_ series: Series.ID)
case seasonSearch(_ series: Series.ID, season: Season.ID)
Expand All @@ -15,10 +19,18 @@ enum InstanceCommand {

var payload: any Payload {
switch self {
case .refreshMoviesLibrary:
RadarrPayload(name: "RefreshMovie")
case .missingMoviesSearch:
RadarrPayload(name: "MissingMoviesSearch")
case .refreshMovie(let ids):
RadarrPayload(name: "RefreshMovie", movieIds: ids)
case .search(let ids):
RadarrPayload(name: "MoviesSearch", movieIds: ids)
case .refreshSeriesLibrary:
SonarrPayload(name: "RefreshSeries")
case .missingEpisodeSearch:
SonarrPayload(name: "MissingEpisodeSearch")
case .refreshSeries(let series):
SonarrPayload(name: "RefreshSeries", seriesId: series)
case .seriesSearch(let series):
Expand Down
40 changes: 37 additions & 3 deletions Ruddarr/Views/Movies/MoviesView+Toolbar.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,50 @@ import SwiftUI

extension MoviesView {
@ToolbarContentBuilder
var toolbarSearchButton: some ToolbarContent {
var toolbarLibraryOptions: some ToolbarContent {
if !instance.isVoid {
ToolbarItem(placement: .primaryAction) {
NavigationLink(value: MoviesPath.search()) {
Image(systemName: "plus")
HStack {
toolbarContextMenu
toolbarSearchButton
}
}
}
}

var toolbarSearchButton: some View {
NavigationLink(value: MoviesPath.search()) {
Image(systemName: "plus")
}
}

var toolbarContextMenu: some View {
Menu {
Section {
refreshLibraryButton
searchAllMissingButton
}
} label: {
ToolbarActionButton()
}
}

var refreshLibraryButton: some View {
Button("Update Library", systemImage: "arrow.clockwise") {
Task {
await refreshLibrary()
}
}
}

var searchAllMissingButton: some View {
Button("Search All Missing", systemImage: "magnifyingglass") {
Task {
await searchAllMissing()
}
}
}

@ToolbarContentBuilder
var toolbarViewOptions: some ToolbarContent {
ToolbarItem(placement: .navigation) {
Expand Down
18 changes: 17 additions & 1 deletion Ruddarr/Views/MoviesView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ struct MoviesView: View {
toolbarInstancePicker
}

toolbarSearchButton
toolbarLibraryOptions
}
.scrollDismissesKeyboard(.immediately)
.searchable(
Expand Down Expand Up @@ -320,6 +320,22 @@ struct MoviesView: View {

scheduleNextRun(time: DispatchTime.now(), id: id)
}

func refreshLibrary() async {
guard await instance.movies.command(.refreshMoviesLibrary) else {
return
}

dependencies.toast.show(.libraryRefreshQueued)
}

func searchAllMissing() async {
guard await instance.movies.command(.missingMoviesSearch) else {
return
}

dependencies.toast.show(.missingMoviesSearchQueued)
}
}

#Preview("Offline") {
Expand Down
40 changes: 37 additions & 3 deletions Ruddarr/Views/Series/SeriesView+Toolbar.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,50 @@ import SwiftUI

extension SeriesView {
@ToolbarContentBuilder
var toolbarSearchButton: some ToolbarContent {
var toolbarLibraryOptions: some ToolbarContent {
if !instance.isVoid {
ToolbarItem(placement: .primaryAction) {
NavigationLink(value: SeriesPath.search()) {
Image(systemName: "plus")
HStack {
toolbarContextMenu
toolbarSearchButton
}
}
}
}

var toolbarSearchButton: some View {
NavigationLink(value: SeriesPath.search()) {
Image(systemName: "plus")
}
}

var toolbarContextMenu: some View {
Menu {
Section {
refreshLibraryButton
searchAllMissingButton
}
} label: {
ToolbarActionButton()
}
}

var refreshLibraryButton: some View {
Button("Update Library", systemImage: "arrow.clockwise") {
Task {
await refreshLibrary()
}
}
}

var searchAllMissingButton: some View {
Button("Search All Missing", systemImage: "magnifyingglass") {
Task {
await searchAllMissing()
}
}
}

@ToolbarContentBuilder
var toolbarViewOptions: some ToolbarContent {
ToolbarItem(placement: .navigation) {
Expand Down
18 changes: 17 additions & 1 deletion Ruddarr/Views/SeriesView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ struct SeriesView: View {
toolbarInstancePicker
}

toolbarSearchButton
toolbarLibraryOptions
}
.scrollDismissesKeyboard(.immediately)
.searchable(
Expand Down Expand Up @@ -344,6 +344,22 @@ struct SeriesView: View {

scheduleNextRun(time: DispatchTime.now(), seriesId, seasonId, episodeId)
}

func refreshLibrary() async {
guard await instance.series.command(.refreshSeriesLibrary) else {
return
}

dependencies.toast.show(.libraryRefreshQueued)
}

func searchAllMissing() async {
guard await instance.series.command(.missingEpisodeSearch) else {
return
}

dependencies.toast.show(.missingEpisodesSearchQueued)
}
}

#Preview("Offline") {
Expand Down