使用 Powershell 将视频上传到 Google Photos 时出现错误 3(适用于图片)
Error 3 uploading video to Google Photos with Powershell (Works for pictures)
我正在使用以下代码使用 Powershell 将照片和视频上传到 Google 照片。该代码非常适用于图片,但在上传视频时会失败(当通过浏览器上传时,Google 照片接受)。
尝试上传视频时,原始字节上传会成功,但 mediaItems.batchCreate
会失败 status.code 3
和 status.message "Failed: There was an error while trying to create this media item."
这可能是由于 header 中错误的 MIME 类型造成的吗?
Function GP-UploadMedia (){
<#
.SYNOPSIS
Uploads a Google Photos media (picture/video)
.Description
Parameters:
- album id
- media path
Returns:
- picture id
#>
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[string]$album_id,
[Parameter(Mandatory=$true)]
[string]$media_path
)
# refresh tokens if required
G-RefreshTokens
# 1st step: upload raw bytes
$requestUri = "https://photoslibrary.googleapis.com/v1/uploads"
$mime_type = [System.Web.MimeMapping]::GetMimeMapping($media_path);
$Headers = @{
Authorization = "Bearer $($Global:Tokens.access_token)";
ContentType = "application/octet-stream";
"X-Goog-Upload-Content-Type" = $mime_type;
"X-Goog-Upload-Protocol" = "raw";
}
$body = $media_path;
try {
$upload_token = Invoke-RestMethod -Headers $Headers -InFile $body -Uri $requestUri -Method POST
}
catch {
# Something went wrong. Investigate!
dieOnError ([System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream()));
}
# refresh tokens if required
G-RefreshTokens
# 2nd step: pair raw bytes to Google Photo media (picture/video)
$requestUri = "https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate"
$Headers = @{
Authorization = "Bearer $($Global:Tokens.access_token)";
}
$body = [PSCustomObject]@{
albumId = $album_id;
newMediaItems = @(
[PSCustomObject]@{
description = "";
simpleMediaItem = [PSCustomObject]@{
fileName = (Split-Path $media_path -leaf);
uploadToken = $upload_token;
}
}
)
}
$myJson = $body|ConvertTo-Json -Depth 4
try {
$Response = Invoke-RestMethod -Headers $Headers -Body ($myJson) -Uri $requestUri -Method POST -ContentType "application/json; charset=utf-8";
}
catch {
# Something went wrong. Investigate!
dieOnError ([System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream()));
}
return $Response.newMediaItemResults.MediaItem.id;
}
虽然我不确定这是否是您问题的直接解决方案,但是当您的脚本如下修改时,是否是您问题的直接解决方案?这种情况请修改“第一步:上传原始字节”的请求头如下。
发件人:
ContentType = "application/octet-stream";
收件人:
"Content-Type" = "application/octet-stream";
注:
- 当我测试你的脚本时,我可以复制与你相同的情况。而且,当我用上述修改修改你的脚本时,我可以确认问题可以解决。所以,请测试以上修改。
我正在使用以下代码使用 Powershell 将照片和视频上传到 Google 照片。该代码非常适用于图片,但在上传视频时会失败(当通过浏览器上传时,Google 照片接受)。
尝试上传视频时,原始字节上传会成功,但 mediaItems.batchCreate
会失败 status.code 3
和 status.message "Failed: There was an error while trying to create this media item."
这可能是由于 header 中错误的 MIME 类型造成的吗?
Function GP-UploadMedia (){
<#
.SYNOPSIS
Uploads a Google Photos media (picture/video)
.Description
Parameters:
- album id
- media path
Returns:
- picture id
#>
[CmdletBinding()]
param (
[Parameter(Mandatory=$true)]
[string]$album_id,
[Parameter(Mandatory=$true)]
[string]$media_path
)
# refresh tokens if required
G-RefreshTokens
# 1st step: upload raw bytes
$requestUri = "https://photoslibrary.googleapis.com/v1/uploads"
$mime_type = [System.Web.MimeMapping]::GetMimeMapping($media_path);
$Headers = @{
Authorization = "Bearer $($Global:Tokens.access_token)";
ContentType = "application/octet-stream";
"X-Goog-Upload-Content-Type" = $mime_type;
"X-Goog-Upload-Protocol" = "raw";
}
$body = $media_path;
try {
$upload_token = Invoke-RestMethod -Headers $Headers -InFile $body -Uri $requestUri -Method POST
}
catch {
# Something went wrong. Investigate!
dieOnError ([System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream()));
}
# refresh tokens if required
G-RefreshTokens
# 2nd step: pair raw bytes to Google Photo media (picture/video)
$requestUri = "https://photoslibrary.googleapis.com/v1/mediaItems:batchCreate"
$Headers = @{
Authorization = "Bearer $($Global:Tokens.access_token)";
}
$body = [PSCustomObject]@{
albumId = $album_id;
newMediaItems = @(
[PSCustomObject]@{
description = "";
simpleMediaItem = [PSCustomObject]@{
fileName = (Split-Path $media_path -leaf);
uploadToken = $upload_token;
}
}
)
}
$myJson = $body|ConvertTo-Json -Depth 4
try {
$Response = Invoke-RestMethod -Headers $Headers -Body ($myJson) -Uri $requestUri -Method POST -ContentType "application/json; charset=utf-8";
}
catch {
# Something went wrong. Investigate!
dieOnError ([System.IO.StreamReader]::new($_.Exception.Response.GetResponseStream()));
}
return $Response.newMediaItemResults.MediaItem.id;
}
虽然我不确定这是否是您问题的直接解决方案,但是当您的脚本如下修改时,是否是您问题的直接解决方案?这种情况请修改“第一步:上传原始字节”的请求头如下。
发件人:
ContentType = "application/octet-stream";
收件人:
"Content-Type" = "application/octet-stream";
注:
- 当我测试你的脚本时,我可以复制与你相同的情况。而且,当我用上述修改修改你的脚本时,我可以确认问题可以解决。所以,请测试以上修改。