SeanutSwift/Sources/Commands/Search.swift

62 lines
2.3 KiB
Swift

// Search.swift
import Foundation
import ArgumentParser
import JellyfinAPI
extension Seanut {
struct SearchCommand: AsyncParsableCommand {
static var configuration = CommandConfiguration(
commandName: "search",
abstract: "Searches for <media-name>"
)
@OptionGroup var options: Seanut.CommonArguments
@Argument(help: "media query")
var query: String
static let columnWidth = 40
mutating func run() async {
Seanut.maybeSetLogger(options)
let client = JellyfinClient(
configuration: Seanut.generateJellyfinConfiguration(url: options.domain.toURL()!),
accessToken: Seanut.retrieveAccessToken(for: options.domain.toURL()!)
)
let parameters = Paths.GetItemsParameters(
isRecursive: true,
searchTerm: query,
fields: [.path, .childCount],
includeItemTypes: [.musicAlbum, .musicArtist, .movie, .book,
.playlist, .season, .series, .audio]
)
let result = try? await client.send(Paths.getItems(parameters: parameters))
guard let result = result else {
print("Unable to run request")
return
}
if let items = result.value.items {
print("Found \(items.count) results:")
let header = "ID".padding(toLength: SearchCommand.columnWidth, withPad: " ", startingAt: 0) +
"Type".padding(toLength: 15, withPad: " ", startingAt: 0) +
"Name".padding(toLength: SearchCommand.columnWidth, withPad: " ", startingAt: 0)
print(header)
for i in items {
let item = i.id!.padding(toLength: SearchCommand.columnWidth, withPad: " ", startingAt: 0) +
i.type!.rawValue.padding(toLength: 15, withPad: " ", startingAt: 0) +
i.name!.padding(toLength: SearchCommand.columnWidth, withPad: " ", startingAt: 0)
print(item)
}
} else {
print("Found no results. Please try your query again...")
}
}
}
}