62 lines
2.2 KiB
Swift
62 lines
2.2 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 {
|
||
|
|
||
|
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...")
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|