-
Star
(202)
You must be signed in to star a gist -
Fork
(32)
You must be signed in to fork a gist
-
-
Save MichaelPote/92fa6e65eacf26219022 to your computer and use it in GitHub Desktop.
| # | |
| # Himawari-8 Downloader | |
| # | |
| # | |
| # | |
| # This script will scrape the latest image from the Himawari-8 satellite, recombining the tiled image, | |
| # converting it to a JPG which is saved in My Pictures\Himawari\ and then set as the desktop background. | |
| # | |
| # http://himawari8.nict.go.jp/himawari8-image.htm | |
| # | |
| # | |
| $ts = New-TimeSpan -Hours -2 -Minutes -30 #Number of hours and minutes to add/subtract to the date. Adjust this to offset your system date to around about GMT (I think?) | |
| $now = ((Get-Date -Second 00) + $ts) | |
| $now = $now.AddMinutes(-($now.minute % 10)) | |
| $width = 550 | |
| $level = "4d" #Level can be 4d, 8d, 16d, 20d | |
| $numblocks = 4 #this apparently corresponds directly with the level, keep this exactly the same as level without the 'd' | |
| $time = $now.ToString("HHmmss") | |
| $year = $now.ToString("yyyy") | |
| $month = $now.ToString("MM") | |
| $day = $now.ToString("dd") | |
| #Create the folder My Pictures\Himawari\ if it doesnt exist | |
| $outpath = [Environment]::GetFolderPath("MyPictures") + "\Himawari\" | |
| if(!(Test-Path -Path $outpath )) | |
| { | |
| [void](New-Item -ItemType directory -Path $outpath) | |
| } | |
| #The filename that will be saved: | |
| #Uncomment this to have the files accumulate in the directory: | |
| #$outfile = "$year$month$day"+"_" + $time + ".jpg" | |
| #Use this to have the script just store the latest file only: | |
| $outfile = "latest.jpg" | |
| $url = "http://himawari8-dl.nict.go.jp/himawari8/img/D531106/$level/$width/$year/$month/$day/$time" | |
| [void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms") | |
| $image = New-Object System.Drawing.Bitmap(($width * $numblocks), ($width * $numblocks)) | |
| $graphics = [System.Drawing.Graphics]::FromImage($image) | |
| $graphics.Clear([System.Drawing.Color]::Black) | |
| for ($y = 0; $y -lt $numblocks; $y++) | |
| { | |
| for ($x = 0; $x -lt $numblocks; $x++) | |
| { | |
| $thisurl = $url + "_" + [String]$x + "_" + [String]$y + ".png" | |
| Write-Output "Downloading: $thisurl" | |
| try | |
| { | |
| $request = [System.Net.WebRequest]::create($thisurl) | |
| $response = $request.getResponse() | |
| $HTTP_Status = [int]$response.StatusCode | |
| If ($HTTP_Status -eq 200) | |
| { | |
| $imgblock = [System.Drawing.Image]::fromStream($response.getResponseStream()) | |
| $graphics.DrawImage($imgblock,($x*$width),($y*$width) , $width, $width) | |
| $imgblock.dispose() | |
| $response.Close() | |
| } | |
| } | |
| Catch | |
| { | |
| $ErrorMessage = $_.Exception.Message | |
| $FailedItem = $_.Exception.ItemName | |
| Write-Output "Failed! $ErrorMessage with $FailedItem" | |
| } | |
| } | |
| } | |
| $qualityEncoder = [System.Drawing.Imaging.Encoder]::Quality | |
| $encoderParams = New-Object System.Drawing.Imaging.EncoderParameters(1) | |
| # Set JPEG quality level here: 0 - 100 (inclusive bounds) | |
| $encoderParams.Param[0] = New-Object System.Drawing.Imaging.EncoderParameter($qualityEncoder, 90) | |
| $jpegCodecInfo = [System.Drawing.Imaging.ImageCodecInfo]::GetImageEncoders() | where {$_.MimeType -eq 'image/jpeg'} | |
| $image.save(($outpath + $outfile), $jpegCodecInfo, $encoderParams) | |
| $image.Dispose() | |
| <# | |
| Different settings for the wallpaper: | |
| Tile : | |
| key.SetValue(@"WallpaperStyle", "0") ; | |
| key.SetValue(@"TileWallpaper", "1") ; | |
| break; | |
| Center : | |
| key.SetValue(@"WallpaperStyle", "0") ; | |
| key.SetValue(@"TileWallpaper", "0") ; | |
| break; | |
| Stretch : | |
| key.SetValue(@"WallpaperStyle", "2") ; | |
| key.SetValue(@"TileWallpaper", "0") ; | |
| break; | |
| Fill : | |
| key.SetValue(@"WallpaperStyle", "10") ; | |
| key.SetValue(@"TileWallpaper", "0") ; | |
| break; | |
| Fit : | |
| key.SetValue(@"WallpaperStyle", "6") ; | |
| key.SetValue(@"TileWallpaper", "0") ; | |
| break; | |
| #> | |
| Write-Output "Setting Wallpaper..." | |
| Set-ItemProperty -path "HKCU:Control Panel\Desktop" -name Wallpaper -value ($outpath + $outfile) | |
| Set-ItemProperty -path "HKCU:Control Panel\Desktop" -name WallpaperStyle -value 6 | |
| Set-ItemProperty -path "HKCU:Control Panel\Desktop" -name TileWallpaper -value 0 | |
| Set-ItemProperty 'HKCU:\Control Panel\Colors' -name Background -Value "0 0 0" | |
| #rundll32.exe user32.dll, UpdatePerUserSystemParameters | |
| $setwallpapersource = @" | |
| using System.Runtime.InteropServices; | |
| public class wallpaper | |
| { | |
| public const int SetDesktopWallpaper = 20; | |
| public const int UpdateIniFile = 0x01; | |
| public const int SendWinIniChange = 0x02; | |
| [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] | |
| private static extern int SystemParametersInfo (int uAction, int uParam, string lpvParam, int fuWinIni); | |
| public static void SetWallpaper ( string path ) | |
| { | |
| SystemParametersInfo( SetDesktopWallpaper, 0, path, UpdateIniFile | SendWinIniChange ); | |
| } | |
| } | |
| "@ | |
| Add-Type -TypeDefinition $setwallpapersource | |
| [wallpaper]::SetWallpaper(($outpath + $outfile)) | |
| Write-Output "Done" |
Nice one :) I've made a slight change - there is a URL that provides the latest image details (http://himawari8-dl.nict.go.jp/himawari8/img/D531106/latest.json). I pull the date stamp from this and instead of using the current time (at the point I tried your script, it was just 'No Image' images being returned).
$ts = New-TimeSpan -Hours -2 -Minutes -30
You're GMT+2h30min?
$numblocks = $level -replace '\D' #automatically removes the 'd'
This will eliminate the user having to manually fix that.
GMT -2:30 is that Azores?
I created an NPM module for downloading images from the Himawari satellite. I used your code as inspiration and credited you in the readme. I also added support for @jbolster's solution for latest images.
Created a Windows Tray Application inspired by your code.
I had to add:
[void][reflection.assembly]::LoadWithPartialName("System.Drawing")
to get this to work (windows 10)
For those in EST, change the timespan to +5 hours and -30 minutes. You can see if it matches the real-time image here: http://himawari8.nict.go.jp/
how do i prevent that powershell keep popping up while he is downloading the tiles ?
i can set it as a wallpaper but it won't rejenerate in 10 min
Isn't it working right now?
Fantastic!