functionstrut
Goto Top

Google drive komplexer upload per batch oder powershell

Ich stehe vor einer großen herausforderung.

und zwar wollte ich meine private Filmsammlung auf google drive auslagern. Dabei möchte ich das die vorhandenen Filmdateien aus den Ordnern nach google drive hochgeladen werden und dann der freigegebene Link zum anschauen in eine txt datei exportiert wird die den gleichen Namen trägt wie die videodatei die hochgeladen wurde.

Also die Ordnerstruktur wäre:

C:/Stadtbahn1/film.avi
C:/Stadtbahn2/aufnahme.avi
C:/Stadtbahn3/video.avi
etc...
...

es sollte jetzt also nach und nach die .avi datei nach google drive hochgeladen werden, und danach der Shared Link abgefragt werden. Dieser sieht in etwa so aus https://drive.google.com/file/d/0B4EC67MaIdzcTzc4RElIXUlhVWc/

davon dann nur das 0B4EC67MaIdzcTzc4RElIXUlhVWc in eine txt datei schreiben/exortieren die den gleichen namen trägt wie die .avi datei. In diesem Beispiel film.txt oder aufnahme.txt

anschließend muss die videodatei gelöscht werden und die jeweilige txt datei in das jeweilige verzeichnis kopiert werden.


is sowas überhaupt möglich???

Hoffe mir kann jemand helfen face-smile

Content-Key: 306319

Url: https://administrator.de/contentid/306319

Printed on: April 26, 2024 at 12:04 o'clock

Member: H41mSh1C0R
H41mSh1C0R Jun 05, 2016 at 18:22:12 (UTC)
Goto Top
Jupp möglich ist es über die Google Drive API. =)
Member: colinardo
colinardo Jun 05, 2016 updated at 19:29:15 (UTC)
Goto Top
Bei Interesse meldst dich bei mir für ein Angebot.

Per Powershell habe ich das hier ja für Google-Mail via Rest-API schon mal gezeigt.
Powershell: Googlemail (GMail) nativ mit Powershell verwalten

Grüße Uwe
Member: colinardo
colinardo Jun 06, 2016 updated at 13:57:51 (UTC)
Goto Top
Kommt bestimmt mal wieder null Rückmeldung wie in allen seinen Threads ...
Member: H41mSh1C0R
H41mSh1C0R Jun 06, 2016 at 14:57:06 (UTC)
Goto Top
Kommt Zeit kommt Tat kommt der Hamster aus dem Rad. *ggg*
Member: colinardo
colinardo Jun 08, 2016 updated at 10:17:10 (UTC)
Goto Top
Da hier vom TO nichts kommt kommt eben mal was von mir. Vielleicht kann ja jemand anderes was damit anfangen.

Zur Anpassung siehe Thread zur GMail-Verwaltung oben. Das Hochladen der Files, das anschließende Löschen und Erstellen der Textdateien findet in den letzten 4 Zeilen statt.
<#
    ######################################
    ###### Google-Drive-Funktionen #######
    ######################################
    -> benötigt wird mind. PS Version 3.0
#>

if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}  

# ANPASSUNGEN HIER VORNEHMEN ===========================================================

# Client API Zugangsdaten hier eintragen
$client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com'  
$client_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'  
# Array der Bereiche die autorisiert werden sollen (In diesem Beispiel erhält die Anwendung Vollzugriff auf alle Google-Drive Funktionen)
$global:scopes = @('https://www.googleapis.com/auth/drive')  
# Pfad in dem das Refresh-Token gespeichert wird mit dem man ein neues Access Token anfordert (Standardmäßig der Ordner in dem das Skript liegt)
$global:token_path = "$(Split-Path $PSCommandPath -Parent)\refresh.token"  
# E-Mail-Adresse des Google-Kontos
$global:gmail_email = 'userXYZ@gmail.com'  

# ENDE EINRICHTUNG =====================================================================

Add-Type -AssemblyName System.Windows.Forms
<# 
    -------------------------------------------------------------------------------------------
    Funktion: Haupt-Authentifizierungsfunktion (OAuth 2.0) für Zugriffe auf die Google-Dienste
    -------------------------------------------------------------------------------------------
#>
function Auth-Google(){
    # wenn kein Refresh-Token vorhanden ist, initiale Authorization starten ...
    if ((Test-Path $global:token_path)){
        $content = gc $global:token_path -TotalCount 1
        if ($content.length -gt 0){$global:refresh_token = $content}
    }
    if(!$global:refresh_token){
        $url = "https://accounts.google.com/o/oauth2/auth?scope=$($global:scopes -join " ")&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=$client_id"  
        # Manuelle Authorization mit Userinteraktion
        write-host "Starting Authorization Request in Browser ... (Please Login into your Google-Account, and accept the authorization request, copy the returned code and close the Browser-Window !" -ForegroundColor Green  
        Start-Process "iexplore.exe" -ArgumentList $url -Wait  
        $authcode = [System.Windows.Forms.Clipboard]::GetText()
        
        # Get Auth-Code via IE Automation, fully automated.
        #$authcode = Get-AuthCode $url

        $requestbody = @{
        "code"=$authcode  
        "client_id"=$client_id  
        "client_secret"=$client_secret  
        "redirect_uri"='urn:ietf:wg:oauth:2.0:oob'  
        "grant_type"="authorization_code"  
        }
    
        $result = Invoke-RestMethod 'https://www.googleapis.com/oauth2/v3/token' -Method Post -Body $requestbody  
        $global:refresh_token = $result.refresh_token
        set-content $global:token_path -Value $global:refresh_token
        $global:access_token = $result.access_token
        $global:token_expires = $result.expires_in
        $global:token_created = get-date
        return $true
    }else{
        # kein access_token vorhanden => neues access_token via refresh holen
        if (!$global:access_token){
            write-host "Refreshing access_token ..."  
            $requestbody = @{
            "refresh_token"=$global:refresh_token  
            "client_id"=$client_id  
            "client_secret"=$client_secret  
            "grant_type"="refresh_token"  
            }
            Try{
                $tokenrequest = Invoke-RestMethod 'https://www.googleapis.com/oauth2/v3/token' -Method Post -Body $requestbody -EA Stop  
                $global:access_token = $tokenrequest.access_token
                $global:token_created = get-date
                $global:token_expires = $tokenrequest.expires_in
                return $true
            }catch{
                write-host $_.Exception.Message
                return $false
            }
        }else{
            # access_token vorhanden, überprüfe ob es abgelaufen ist
            if((((get-date) - $global:token_created).TotalSeconds) -ge $global:token_expires){
                # access_token ist abgelaufen => fordere ein neues an
                write-host "Access Token has expired ..."  
                $global:access_token = ""  
                Auth-Google
            }else{
                # gültiges access_token vorhanden
                return $true
            }
        }
    }
}


function Get-GoogleFileProperties([string]$id, [string]$properties){
    try{
        Invoke-RestMethod "https://www.googleapis.com/drive/v3/files/0B_Oqbs4tcHfrSDBTVThoaHJZR0E?access_token=$($global:access_token)" -Method Get -Body @{fields=$properties}  
    }catch{
        throw $_.Exception.Message
    }
}

function Add-GoogleDriveFolder([string]$foldername){
    try{
    # Ordner erstellen
        $props = @{'name' = $foldername;'mimeType' = 'application/vnd.google-apps.folder'} | ConvertTo-Json  
        $uri = "https://www.googleapis.com/drive/v3/files/?access_token=$($global:access_token)"  
        return (Invoke-RestMethod -uri $uri -body $props -Method Post -ContentType "application/json")  
    }catch{
        throw $_.Exception.Message
    }
}


function Add-GoogleDriveSharedFile(){
param(
    [parameter(mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)][Alias('FullName')][string[]]$filepath,  
    [parameter()][string]$remotefolder
)
    begin{
        # Autorisierung
        if(!(Auth-Google)){
            return $false 
        }
         # Ordner suchen / erstellen
        if ($remotefolder){
            # Ordner suchen
            $folderID = Invoke-RestMethod "https://www.googleapis.com/drive/v3/files?access_token=$($global:access_token)" -Method Get -Body @{'q' = "name='$([System.Net.WebUtility]::UrlEncode($remotefolder))' and mimeType = 'application/vnd.google-apps.folder' and not trashed"}  
            if (!$folderID){
                # Ordner erstellen
                Add-GoogleDriveFolder $remotefolder
            }else{
                $folderID = $folderID.files.id
            }
        }
    }
    process{
        $filepath | %{
           try{
               
                # Datei hochladen
                write-host "Hochladen von Datei: '$_'" -F Green  
                $uri = "https://www.googleapis.com/upload/drive/v3/files?uploadType=media&access_token=$($global:access_token)"  
                $result = Invoke-RestMethod -uri $uri -InFile $_ -Method Post
    
                # metadata der Datei aktualisieren
                if ($result){
                    # Dateinamen aktualisieren
                    $props = @{
                        'name' = [System.IO.Path]::GetFileName($_)  
                    } | ConvertTo-Json
                    # Wenn Ordner angegeben wurde lege Parent-Folder fest
                    $parents = if($folderID){"&addParents=$folderID&removeParents=$((Get-GoogleFileProperties $result.id 'parents').parents -join ',')"}  
                    $uri = "https://www.googleapis.com/drive/v3/files/$($result.id)?access_token=$($global:access_token)$parents"  
                    $fileRes = Invoke-RestMethod -uri $uri -body $props -Method Patch -ContentType "application/json"  
        
                    # Berechtigungen setzen
                    $props = @{'role' = 'reader';'type' = 'anyone'} | ConvertTo-Json  
                    $uri = "https://www.googleapis.com/drive/v3/files/$($result.id)/permissions?access_token=$($global:access_token)"  
                    $permission = Invoke-RestMethod -uri $uri -body $props -Method Post -ContentType "application/json"  
                    # Daten ausgeben
                    [pscustomobject]@{'FilePath' = $_ ;'RemoteName' = $fileRes.name; 'ID' = $fileRes.id}  
                }
            }catch{
                write-host "Fehler beim Hochladen: $($_.Exception.Message)" -F Red  
            }
        }
    }
}

#Alle Videos eines Ordners hochladen, löschen und Textdatei mit ID des Files erstellen
gci 'C:\Ordner\*' -Include "*.avi","*.mp4" -recurse | Add-GoogleDriveSharedFile | %{  
    remove-Item $_.FilePath -Force
    Set-Content "$([System.IO.Path]::GetDirectoryName($_.FilePath))\$([System.IO.Path]::GetFileNameWithoutExtension($_.FilePath)).txt" -Value $_.ID  
}

Viel Spaß
Grüße Uwe
Member: colinardo
colinardo Jul 15, 2016 at 16:43:07 (UTC)
Goto Top
Kommt hier noch was ?
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen. Merci.