// Search.swift import Foundation import ArgumentParser import JellyfinAPI extension Seanut { struct SearchCommand: AsyncParsableCommand { static var configuration = CommandConfiguration( commandName: "search", abstract: "Searches for " ) @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...") } } } }