PageRenderTime 46ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/Providers/Search-NewzNab.ps1

https://gitlab.com/migration-sandbox/NZB-powershell
Powershell | 201 lines | 141 code | 37 blank | 23 comment | 6 complexity | 6fd402954d63e48d55cf8566b42916d6 MD5 | raw file
  1. # Functions for searching and downloading from NewzNab indexers (actually written for GeekSeek, but should work)
  2. function Search-Newznab
  3. {
  4. [CmdletBinding(DefaultParameterSetName="General")]
  5. [OutputType([array])]
  6. Param
  7. (
  8. # API URL of NewzNab
  9. [Parameter(Mandatory=$true)]
  10. [String]
  11. $NewzNab,
  12. # API key of NewzNab
  13. [Parameter(Mandatory=$true)]
  14. [String]
  15. $APIKey,
  16. #String to search for
  17. [Parameter(Mandatory=$false)]
  18. [string]
  19. $searchString,
  20. # Language of release
  21. [Parameter(Mandatory=$false)]
  22. [string]
  23. $language,
  24. # amount of days of retention you have
  25. [int]
  26. $retentionDays=2000,
  27. # Params for TV Episodes
  28. [parameter(Mandatory=$false,ParameterSetName = "TV")]
  29. [switch]$TV,
  30. # Season string, e.g S13 or 13 for the item being queried - forcing an int for simplicity
  31. [parameter(Mandatory=$false,ParameterSetName = "TV")]
  32. [int]
  33. $Season,
  34. # Episode string, e.g E13 or 13 for the item being queried - forcing an int for simplicity
  35. [parameter(Mandatory=$false,ParameterSetName = "TV")]
  36. [int]
  37. $Episode,
  38. # TVRage id of the item being queried
  39. [parameter(Mandatory=$false,ParameterSetName = "TV")]
  40. $TVRageId,
  41. #TVDB id of the item being queried
  42. [parameter(Mandatory=$false,ParameterSetName = "TV")]
  43. $TVDBId,
  44. # Params for Movies
  45. [parameter(Mandatory=$false,ParameterSetName = "Movie")]
  46. [switch]
  47. $Movie,
  48. # IMDB id of the item being queried e.g. 0058935
  49. [parameter(Mandatory=$false,ParameterSetName = "Movie")]
  50. [int]
  51. $IMDBId,
  52. # Params for Music
  53. # Artist name (URL/UTF-8 encoded). Case insensitive
  54. [parameter(Mandatory=$false, ParameterSetName = "Music")]
  55. [switch]
  56. $Music,
  57. [parameter(Mandatory=$false, ParameterSetName = "Music")]
  58. [string]
  59. $Artist,
  60. # Album title (URL/UTF-8 encoded). Case insensitive
  61. [parameter(Mandatory=$false, ParameterSetName = "Music")]
  62. [string]
  63. $Album,
  64. # Publisher/Label name (URL/UTF-8 encoded). Case insensitive
  65. [parameter(Mandatory=$false, ParameterSetName = "Music")]
  66. [string]
  67. $Label,
  68. #Four digit year of release
  69. [parameter(Mandatory=$false, ParameterSetName = "Music")]
  70. [ValidateRange(1000,2525)]
  71. [int]
  72. $Year,
  73. # Genre of Release
  74. [parameter(Mandatory=$false, ParameterSetName = "Movie")]
  75. [parameter(ParameterSetName = "Music")]
  76. [string]
  77. $Genre,
  78. # Params for Books
  79. [parameter(Mandatory=$false, ParameterSetName = "Book")]
  80. [switch]
  81. $Book,
  82. # Author name (URL/UTF-8 encoded). Case insensitive
  83. [parameter(Mandatory=$false, ParameterSetName = "Book")]
  84. [string]
  85. $Author,
  86. [parameter(Mandatory=$false, ParameterSetName = "guid")]
  87. [string]
  88. $id
  89. )
  90. $NewzNabURL = $NewzNab+"api?apikey=$APIKey"
  91. # Build out query string
  92. if($searchString -ne "")
  93. {
  94. Write-Verbose "Addding search string $searchString"
  95. $encodedSearchString = Invoke-URLEncoding -unencodedString $searchString
  96. $searchURL = $NewzNabURL+"&q=$($encodedSearchString)"
  97. }
  98. else
  99. {
  100. $searchString = "PropertySearch"
  101. $searchURL = $NewzNabURL
  102. }
  103. Write-Verbose "Searching $NewzNab for `"$searchString`""
  104. $ParamSet = @{
  105. book = "&t=book"
  106. movie = "&t=movie"
  107. music = "&t=music"
  108. tv = "&t=tvsearch"
  109. general = "&t=search"
  110. guid = "&t=details"
  111. }
  112. $searchURL += $ParamSet.($psCmdlet.ParameterSetName)
  113. $SearchOptions = @{
  114. TVDBId = 'tvdbid'
  115. TVRageId = 'rid'
  116. Season = 'season'
  117. Episode = 'ep'
  118. Author = 'Author'
  119. imdbid = 'imdbid'
  120. genre = 'genre'
  121. artist = 'artist'
  122. album = 'album'
  123. label = 'label'
  124. year = 'year'
  125. language = 'language'
  126. id = 'id'
  127. }
  128. foreach($key in $PSBoundParameters.keys)
  129. {
  130. if($SearchOptions.($key))
  131. {
  132. Write-Verbose "Adding $($SearchOptions.($key))"
  133. $searchURL += "&{0}={1}" -f $SearchOptions.($key), $PSBoundParameters.($key)
  134. }
  135. }
  136. Write-Verbose "SearchURL = $searchURL"
  137. $searchResults = Invoke-RestMethod $searchURL
  138. # Clean up the metadata and create a new array
  139. $cleanResults = @()
  140. $newznabRegex = "http(s)?:\/\/[\s\S]+\/(\w+\.php\?guid=)?"
  141. foreach($searchResult in $searchResults)
  142. {
  143. Write-Verbose "guid = $($searchResult.guid."#text")"
  144. $cleanObject = New-Object System.Object
  145. if($searchResults.count -gt 0) {
  146. $cleanObject | Add-Member -type NoteProperty -name Index -Value $searchResults.indexOf($searchResult)
  147. }
  148. else {
  149. $cleanObject | Add-Member -type NoteProperty -name Index -Value 0
  150. }
  151. $cleanObject | Add-Member -type NoteProperty -name SearchString -Value $searchString
  152. $cleanObject | Add-Member -type NoteProperty -name title -Value $searchResult.title
  153. $cleanObject | Add-Member -type NoteProperty -name link -Value $searchResult.link
  154. $cleanObject | Add-Member -type NoteProperty -name pubDate -Value $([DateTime]::Parse($searchResult.pubDate))
  155. $cleanObject | Add-Member -type NoteProperty -name category -Value $searchResult.category
  156. $cleanObject | Add-Member -type NoteProperty -name Description -Value $searchResult.description
  157. $cleanObject | Add-Member -type NoteProperty -name NonFriendlySize -Value $($searchResult).attr[2].value
  158. $cleanObject | Add-Member -type NoteProperty -name FriendlySize -Value ("{0:N0}" -f (($($searchResult).attr[2].value)/1Mb))
  159. $cleanObject | Add-Member -type NoteProperty -name guid -Value ($searchResult.guid.'#text' -replace $newznabRegex,"")
  160. $cleanResults += $cleanObject
  161. }
  162. $cleanResults = ($cleanResults | Where-Object {$_.pubDate -gt ((Get-Date).AddDays("-$retentionDays"))})
  163. return $cleanResults
  164. }