203 lines
4.5 KiB
PowerShell
203 lines
4.5 KiB
PowerShell
|
[CmdletBinding()]
|
||
|
param (
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[string]
|
||
|
$ApiKey='18224187-6d4fdb0c31aebbab0f814ab5d',
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[string]
|
||
|
$Keyword,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[string]
|
||
|
$Id,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[ValidateSet('all', 'photo', 'illustration', 'vector')]
|
||
|
[string]
|
||
|
$Type,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[ValidateSet('all', 'horizontal', 'vertical')]
|
||
|
[string]
|
||
|
$Orientation,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[ValidateSet(
|
||
|
'backgrounds',
|
||
|
'fashion',
|
||
|
'nature',
|
||
|
'science',
|
||
|
'education',
|
||
|
'feelings',
|
||
|
'health',
|
||
|
'people',
|
||
|
'religion',
|
||
|
'places',
|
||
|
'animals',
|
||
|
'industry',
|
||
|
'computer',
|
||
|
'food',
|
||
|
'sports',
|
||
|
'transportation',
|
||
|
'travel',
|
||
|
'buildings',
|
||
|
'business',
|
||
|
'music'
|
||
|
)]
|
||
|
[string]
|
||
|
$Category,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[int]
|
||
|
$MinWidth=0,
|
||
|
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[int]
|
||
|
$MinHeight=0,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[ValidateSet(
|
||
|
"grayscale",
|
||
|
"transparent",
|
||
|
"red",
|
||
|
"orange",
|
||
|
"yellow",
|
||
|
"green",
|
||
|
"turquoise",
|
||
|
"blue",
|
||
|
"lilac",
|
||
|
"pink",
|
||
|
"white",
|
||
|
"gray",
|
||
|
"black",
|
||
|
"brown"
|
||
|
)]
|
||
|
[string[]]
|
||
|
$Colors,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[bool]
|
||
|
$EditorsChoiceOnly=$false,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[bool]
|
||
|
$SafeForWorkOnly=$false,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[ValidateSet("popular", "latest")]
|
||
|
[string]
|
||
|
$Order='popular',
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[int]
|
||
|
$Page=1,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[ValidateRange(3, 200)]
|
||
|
[int]
|
||
|
$Size=50,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[string]
|
||
|
$OutFile,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[string]
|
||
|
$OutDir,
|
||
|
|
||
|
[Parameter(Mandatory=$false)]
|
||
|
[bool]
|
||
|
$OutDirWithType=$true
|
||
|
)
|
||
|
|
||
|
if ($OutDir -and -not $OutFile) {
|
||
|
$OutFile
|
||
|
}
|
||
|
|
||
|
function Save-Hit {
|
||
|
param (
|
||
|
[Parameter()]
|
||
|
[PSCustomObject]
|
||
|
$hit
|
||
|
)
|
||
|
|
||
|
$FilePath = $OutFile
|
||
|
if (-not $FilePath) {
|
||
|
$FilePath = $OutDir
|
||
|
if ($OutDirWithType) {
|
||
|
$FilePath = Join-Path $FilePath ($hit.type -replace '\W+','_' )
|
||
|
}
|
||
|
if (-not (Test-Path $FilePath)) {
|
||
|
New-Item -ItemType Directory $FilePath | Out-Null
|
||
|
}
|
||
|
$FileName = ($hit.id.ToString() + '_' +
|
||
|
($hit.tags -split ", " | %{ $_ -replace '\s+','-' } | Join-String -Separator '_') +
|
||
|
'.' + $hit.largeImageURL.Split('.')[-1])
|
||
|
$FilePath = Join-Path $FilePath $FileName
|
||
|
}
|
||
|
$msg = "saving $($hit.id) to $FilePath"
|
||
|
Write-Host $msg.PadRight(100) -NoNewline
|
||
|
if (Test-Path $FilePath) {
|
||
|
Write-Host "[SKIP]"
|
||
|
} else {
|
||
|
$job = Start-Job -ScriptBlock {
|
||
|
try {
|
||
|
Invoke-WebRequest -TimeoutSec 5 -Uri $args[0] -OutFile $args[1]
|
||
|
$true
|
||
|
} catch {
|
||
|
$false
|
||
|
}
|
||
|
} -ArgumentList $hit.largeImageURL,$FilePath
|
||
|
$fg = 'red'
|
||
|
$tx = '[TIMEOUTED]'
|
||
|
if (Wait-Job $job -Timeout 20) {
|
||
|
$ok = Receive-Job $job
|
||
|
$fg = $ok ? 'green' : 'red'
|
||
|
$tx = $ok ? '[OK]' : '[Failed]'
|
||
|
}
|
||
|
Remove-Job -force $job
|
||
|
Write-Host -ForegroundColor $fg $tx
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
[System.Net.ServicePointManager]::MaxServicePointIdleTime = 5
|
||
|
$Res = Invoke-WebRequest -TimeoutSec 5 -Uri https://pixabay.com/api/ -Body @{
|
||
|
key = $ApiKey;
|
||
|
q = $Keyword;
|
||
|
id = $Id;
|
||
|
image_type = $Type;
|
||
|
orientation = $Orientation;
|
||
|
category = $Category;
|
||
|
min_width = $MinWidth;
|
||
|
min_height = $MinHeight;
|
||
|
colors = $Colors;
|
||
|
editors_choice = $EditorsChoiceOnly;
|
||
|
safesearch = $SafeForWorkOnly;
|
||
|
order = $Order;
|
||
|
page = $Page;
|
||
|
per_page = $Size;
|
||
|
} | ConvertFrom-Json
|
||
|
|
||
|
Write-Host "Total $($res.total) Accessible $($res.totalHits)"
|
||
|
|
||
|
$Listing = -not $OutFile -and -not $OutDir
|
||
|
|
||
|
if ($Res.hits.Length -eq 1) {
|
||
|
if ($Listing) {
|
||
|
$Res.hits[0]
|
||
|
} else {
|
||
|
Save-Hit $Res.hits[0]
|
||
|
}
|
||
|
} else {
|
||
|
if ($Listing) {
|
||
|
$Res.hits | Select-Object -Property id,type,largeImageURL | Format-Table
|
||
|
} else {
|
||
|
$Res.hits | %{ Save-Hit $_ }
|
||
|
# Save-Hit $Res.hits[0]
|
||
|
}
|
||
|
}
|