56

Podcast verwalten mit Powershell

Meta

Erstellt: 27. Mai 2019
Modifiziert: 27. Mai 2019

Überblick

Ich hole mir regelmässig auf dem Internet Podcasts ab, primär um die Zeit auf dem Arbeitsweg sinnvoll zu nutzen. Diesen Vorgang habe ich automatisiert. Früher einmal mit „Windows Scripting Host” VBScript, dieses Jahr habe ich die Lösung mit Powershell entwickelt.

Einleitung

RSS Reader hat es genug. Mein Ziel war es, Podcasts die den Inhalt als Mediadatei wie MP3 anbieten, so zu nutzen, dass die Mediendatei lokal gespeichert werden kann. Sobald die Datei lokal gespeichert sind, kann ich sie in der Cloud, auf dem Handy oder einem USB Stick speichern. “Offline” Daten sind mein Fundament für die Nutzung von Medien. Für diesen „Use Case” habe ich die das nachfolgenden Skripts geschrieben.

Hintergrund

Taglib DLL

Damit Powershell mit MP3 Dateien umgehen kann, binde ich die Bibliothek «tag-lib» ein. Die DLL kann hier downgeloaded werden.

Skript

Skript 1: psdl-main.ps1

Wie kann mit dem Skript „psdl-main.ps1” Podcasts auf die Festplatte kopiert werden? Nach dem download mit der rechten Maustaste anklicken (Ein Doppelklick öffnet den Notepad (Editor)) und „Run with Powershell” bzw. „Ausführen mit Powershell” wählen.

Skript öffnen

Wahrscheinlich wird Windows nachfragen (Sicherheitshinweis), ob es OK ist dieses Skript auszuführen.

Skript öffnen

Wenn die Ausführung nicht abgebrochen wurde, sieht man im Powershell Fenster, dass eine Eingabe erwartet wird.

Skript öffnen

Beispielsweise findet man die Links zu den Podcasts des Schweizer Fernsehens hier.

Skript öffnen

Ich kopiere nun von einer Podcast Website einen Link mit dem Dateitypen „.XML“ und kopiere diesen in die Zwischenablage und füge ihn in das Eingabefensters des Powershell Skriptes. Alternativ kann ich das Skript auch direkt über das PowerShell CLI starten.

Skript öffnen

Das Skript überprüft, ob auf dem Laufwerk C: (das wird als gegeben vorausgesetzt) ein Verzeichnis „Temp“ existiert. Wenn nicht, wird es erstellt. Im Verzeichnis „Temp“ wird das Verzeichnis „mypodcast“ geprüft und erstellt. In diesem Verzeichnis wird nun für jeden Link den man eingegeben hat, ein Verzeichnis erstellt. Der Name des Verzeichnis leitet das Programm aus dem Namen der XML Datei her.

Skript öffnen

Skript öffnen

Im nächsten Abschnitt ist der Source Code zu sehen, falls jemand das Skript erweitern oder ergänzen will.

Code


 #Name:                        podcast downloaden  
 #Autor:                       Peter Gyger  
 #Version:                     1.1  
 #Datum der letzten Änderung:  22.3.2019  
 #prüfen ob eine URL eingegeben wurde. Bsp.: http://pod.drs.ch/jazz\_collection\_mpx.xml  

Param  
 (  
 [Parameter(Mandatory=$True)]  
 [ValidateNotNull()]  
$fileURL)  

if (!$fileURL) {exit}  

$web = New-Object System.Xml.XmlDocument  
$web.Load($fileURL)  
$fileslash = $fileURL.LastIndexOf("/") +1  
$fileName =$fileURL.substring($fileslash)  
$dirname = $fileName.substring(0,$fileName.Length -4)  

 #Überprüfen ob das Verzeichnis c:\temp\ und Unterverzeichnis mypodcast existiert  
If (!(Test-Path c:\temp))  
 {  
    write-host c-temp erstellen  
    New-Item c:\temp -ItemType directory  
 }  

If (!(Test-Path c:\temp\mypodcast))
 {
    write-host c-temp mypodcast
    New-Item c:\temp\mypodcast -ItemType directory
 }

Set-Location c:\temp\mypodcast

#Verzeichnis mit dem Namen des Podcasts erstellen
$dirname = $fileName.substring(0,$fileName.Length -4)

If (!(Test-Path c:\temp\mypodcast\$dirname))
{
    Write-Host neues verzeichnis erstellen
    write-host $dirname
    New-Item c:\temp\mypodcast\$dirname -ItemType directory
}
Set-Location c:\temp\mypodcast\$dirname

# \*\*\* Teil 2 \*\*\* #
#Dateien aus der Datei extrahieren

#[xml]$xmldata = Get-Content -path $fileNamefull
#$max =$xmldata.rss.channel.item.Count
$max =$web.rss.channel.item.Count

$webclient = New-Object System.Net.WebClient
# load the TagLib# assembly into PowerShelL
[Reflection.Assembly]::LoadFrom("C:\Temp\mypodcast\taglib-sharp.dll")

#kalenderwoche ermitteln
$kw = Get-Date -uFormat %V
$kw = $kw + " - "

$i = 0
do
{
  $fileURL = $web.rss.channel.item[$i].guid
  $mp3name = "c:\temp\mypodcast\$dirname\" +$kw +$fileURL.Substring(35)
  If (!(Test-Path c:\temp\mypodcast\$dirname\$mp3name))
{
    write-host $mp3name
    write-host "Die Datei $mp3name wird erstellt"
    $webclient.DownloadFile($fileURL,$mp3name)
    $media = [TagLib.File]::Create($mp3name)

   # set the tags
    #$media.Tag.Genre = "Podcast"
    $media.Tag.Album = $dirname
    $media.Tag.Comment = "Neu"
    $media.Save()
}
  $i++
} while ($i -lt $max)

Get-ChildItem \*.mp3
Set-Location c:\temp\mypodcast  

Quellen

Fazit

Der fehlerfreie Ablauf des Programmes kann aus naheliegenden Gründen nicht garantiert werden. Fehler oder Hinweise werde ich jedoch zeitnah in diesen Post einfliessen lassen.

Letzte Änderung May 25, 2019