[gelöst] Youtube-dl script

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
ServiceLinuxStart
Beiträge: 43
Registriert: 01.01.2019 19:54:54

[gelöst] Youtube-dl script

Beitrag von ServiceLinuxStart » 29.03.2021 23:44:02

Hallo,

ich würde gerne Videos aus meinem Lieblingskanäle auf meinem Mediaserver spiegeln. Dazu habe ich ein kleines Script, welches zwar funktioniert, aber irgendwann zu unübersichtlich wird.
Würde mich über tipps freuen, wie ich das ganze kompakter umschreiben kann.

Code: Alles auswählen

#/bin/sh
lastdate=20210329
#---------------------------------------------------------------------------
fo001="Hund"
ch001="https://www.youtube.com/channel/Hund/videos"
#---------------------------------------------------------------------------
fo002="Katze"
ch002="https://www.youtube.com/channel/Katze/videos"
#---------------------------------------------------------------------------
fo003="Maus"
ch003="https://www.youtube.com/channel/Maus/videos"
#---------------------------------------------------------------------------
fo004="Hamster"
ch004="https://www.youtube.com/channel/Hamster/videos"
#---------------------------------------------------------------------------
fo005="Frosch"
ch005="https://www.youtube.com/channel/Frosch/videos"
#---------------------------------------------------------------------------
youtube-dl --dateafter $lastdate -f best -ciw -o /MediaServer/Youtube/"$fo001"/"%(title)s.%(ext)s" -i -w --playlist-end 3 $ch001
youtube-dl --dateafter $lastdate -f best -ciw -o /MediaServer/Youtube/"$fo002"/"%(title)s.%(ext)s" -i -w --playlist-end 3 $ch002
youtube-dl --dateafter $lastdate -f best -ciw -o /MediaServer/Youtube/"$fo003"/"%(title)s.%(ext)s" -i -w --playlist-end 3 $ch003
youtube-dl --dateafter $lastdate -f best -ciw -o /MediaServer/Youtube/"$fo004"/"%(title)s.%(ext)s" -i -w --playlist-end 3 $ch004
youtube-dl --dateafter $lastdate -f best -ciw -o /MediaServer/Youtube/"$fo005"/"%(title)s.%(ext)s" -i -w --playlist-end 3 $ch005
Vielen Dank

EDIT: Das ganze wird dann täglich per cron aufgerufen. Ordner und Channel sind zwar im Beispiel gleich, aber selten in der Realität. Hab absichtlich zwei Variablen
Zuletzt geändert von ServiceLinuxStart am 31.03.2021 20:48:00, insgesamt 1-mal geändert.

tobo
Beiträge: 2349
Registriert: 10.12.2008 10:51:41

Re: Youtube-dl script

Beitrag von tobo » 30.03.2021 00:27:41

Wie wäre das:

Code: Alles auswählen

#!/bin/sh

lastdate=20210329

for i in Hund Katze Maus Hamster Frosch; do
    youtube-dl --continue --ignore-errors --no-overwrites --dateafter "$lastdate" --format best --output "/MediaServer/Youtube/${i}/%(title)s.%(ext)s" --playlist-end 3 "https://www.youtube.com/channel/${i}/videos"
done

ServiceLinuxStart
Beiträge: 43
Registriert: 01.01.2019 19:54:54

Re: Youtube-dl script

Beitrag von ServiceLinuxStart » 30.03.2021 00:42:33

Danke, wäre genial, wenn die Channels so heißen würden, wie meine Ordner. Nur haben manche Kanäle irgendeine kennung in der URL. Deswegen nutze ich zwei Variablen.
Aber das ist genau der Weg, den ich mir vorgestellt habe.

ServiceLinuxStart
Beiträge: 43
Registriert: 01.01.2019 19:54:54

Re: Youtube-dl script

Beitrag von ServiceLinuxStart » 30.03.2021 00:48:17

Dachte mehr an sowas. Leider hauts nicht hin.

Code: Alles auswählen

fo001="Hund"
ch001="https://www.youtube.com/channel/Hund/videos"
#---------------------------------------------------------------------------
fo002="Katze"
ch002="https://www.youtube.com/channel/Katze/videos"
#---------------------------------------------------------------------------
...
#---------------------------------------------------------------------------

for ((i=001; i<=999; i++))

do
  youtube-dl --dateafter $lastdate -f best -ciw -o /MediaServer/Youtube/"$fo[$i]"/"%(title)s.%(ext)s" -i -w --playlist-end 3 $ch[$i]
done
 

Benutzeravatar
hikaru
Moderator
Beiträge: 13911
Registriert: 09.04.2008 12:48:59

Re: Youtube-dl script

Beitrag von hikaru » 30.03.2021 10:16:14

Das klingt für mich nach einem Fall für assoziative Arrays:

Code: Alles auswählen

$ declare -A Tier
$ Tier=(
> [Hund]="https://www.youtube.com/channel/Hund/videos"
> [Katze]="https://www.youtube.com/channel/Katze/videos"
> )
$ Tier+=([Maus]=https://www.youtube.com/channel/Maus/videos)
$ for i in ${!Tier[@]}; do echo $i ${Tier[$i]}; done
Katze https://www.youtube.com/channel/Katze/videos
Maus https://www.youtube.com/channel/Maus/videos
Hund https://www.youtube.com/channel/Hund/videos
(Ich verstehe aber die Sortierung des Outputs nicht.)

tobo
Beiträge: 2349
Registriert: 10.12.2008 10:51:41

Re: Youtube-dl script

Beitrag von tobo » 30.03.2021 10:17:34

Dann würde es sich vielleicht anbieten, dass du eine extra Datendatei anlegst, die die Beziehungen zwischen file und channel zeigt (stehen in derselben Zeile). Also z.B. eine kommaseparierende Datei data:

Code: Alles auswählen

f01,ch01
f02,ch02
f03,ch03
und darauf dann diesess Skript angewendet:

Code: Alles auswählen

#!/bin/sh

lastdate=20210329

while IFS="," read f ch; do
    youtube-dl --continue --ignore-errors --no-overwrites --dateafter "$lastdate" --format best --output "/MediaServer/Youtube/${f}/%(title)s.%(ext)s" --playlist-end 3 "https://www.youtube.com/channel/${ch}/videos"
done < data
Gerade bei höherem Datenvolumen ist eine extra Datei für die Daten eigentlich immer günstig!?

EDIT: Bei Verwendung einer Bash könnten natürlich auch Arrays benutzt werden.
Zuletzt geändert von tobo am 30.03.2021 10:22:21, insgesamt 1-mal geändert.

Benutzeravatar
hikaru
Moderator
Beiträge: 13911
Registriert: 09.04.2008 12:48:59

Re: Youtube-dl script

Beitrag von hikaru » 30.03.2021 10:21:35

tobo hat geschrieben: ↑ zum Beitrag ↑
30.03.2021 10:17:34
EDIT: Bei Verwendung einer Bash könnten natürlich auch Arrays benutzt werden.
Dass hier gar keine Bash gegeben ist hatte ich glatt übersehen. :oops:

tobo
Beiträge: 2349
Registriert: 10.12.2008 10:51:41

Re: Youtube-dl script

Beitrag von tobo » 30.03.2021 10:33:41

Ich weiß nicht ob die Bash ausgeschlossen ist - jedenfalls steht's da (syntaxfalsch).
Assoziative Arrays (-A) sind hash-basiert, die haben keine vorgegebene Reihenfolge. Du kannst aber auch indexbasierte Arrays anlegen (-a), welche ihre Ordnung behalten.

Benutzeravatar
hikaru
Moderator
Beiträge: 13911
Registriert: 09.04.2008 12:48:59

Re: Youtube-dl script

Beitrag von hikaru » 30.03.2021 10:58:12

tobo hat geschrieben: ↑ zum Beitrag ↑
30.03.2021 10:33:41
Assoziative Arrays (-A) sind hash-basiert, die haben keine vorgegebene Reihenfolge.
Ich weiß. Aber irgendeine implizite Sortierung hätte ich beim Output schon erwartet (fifo, lifo, alphabetisch - keine Ahnung, irgendwas halt).
tobo hat geschrieben: ↑ zum Beitrag ↑
30.03.2021 10:33:41
Du kannst aber auch indexbasierte Arrays anlegen (-a), welche ihre Ordnung behalten.
Das Schöne an assoziativen Arrays in diesem Beispiel ist halt, dass man den Key gleich für den Ordnernamen nutzen kann, wohingegen einem ja die Nummerierung eigentlich egal ist. Die ist ja nur Krücke um Key und Value zusammenzubringen.

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Youtube-dl script

Beitrag von Meillo » 30.03.2021 11:58:32


Diskussion zur Sortierreihenfolge von Hashes dorthin ausgelagert: viewtopic.php?f=34&t=180699
Use ed once in a while!

ServiceLinuxStart
Beiträge: 43
Registriert: 01.01.2019 19:54:54

Re: Youtube-dl script

Beitrag von ServiceLinuxStart » 30.03.2021 17:54:34

tobo hat geschrieben: ↑ zum Beitrag ↑
30.03.2021 10:33:41
Ich weiß nicht ob die Bash ausgeschlossen ist - jedenfalls steht's da (syntaxfalsch).
Assoziative Arrays (-A) sind hash-basiert, die haben keine vorgegebene Reihenfolge. Du kannst aber auch indexbasierte Arrays anlegen (-a), welche ihre Ordnung behalten.
Leider ja, sorry für den syntaxfehler

ServiceLinuxStart
Beiträge: 43
Registriert: 01.01.2019 19:54:54

Re: Youtube-dl script

Beitrag von ServiceLinuxStart » 31.03.2021 18:19:49

Dank der Hilfen hier, konnte ich es etwas kompakter schreiben.

Code: Alles auswählen

#/bin/bash
year=$(date +%Y)
lastdate=20210328

CHAN=("Hund" "Katze" "Maus" "Frosch")

tLen=${#CHAN[@]}

for (( i=0; i<${tLen}; i++ ));
do
  KEY=${CHAN[$i]}
  META=$(cat /MediaServer/Youtube/"${CHAN[$i]}"/meta.txt )
  youtube-dl --dateafter $lastdate -f best -ciw -o /MediaServer/Youtube/"$KEY"/"$year"/"%(title)s.%(ext)s" -i -w --playlist-end 2 $META
done

Code: Alles auswählen

user@MediaServer:~# cat /MediaServer/Youtube/Hund/meta.txt
https://www.youtube.com/c/LustigeHundeClips/videos
user@MediaServer:~#
Leider muss ich immer noch per ssh am MediaServer die CHAN liste erweitern.
Ideal wäre es, wenn ich im Verzeichniss Youtube einfach einen Ordner zb. "Fisch" erstelle, darin die meta.txt mit der youtube quelle hinzhufüge und Feritg.

Code: Alles auswählen

#So in etwa, (funktioniert leider nicht)
CHAN=$('ls -p /MediaServer/Youtube/ | grep "/"')
#auch mit einer channel.txt im Youtube verzeichniss funktioniert es nicht
CHAN="`cat "/MediaServer/Youtube/channel.txt"`"
Vielen Dank

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Youtube-dl script

Beitrag von JTH » 31.03.2021 19:10:47

Vorweg: Deiner Shebang-Zeile fehlt ein „!“ nach der „#“. Ohne das ! ist es nur ein nicht weiter beachteter Kommentar:

Code: Alles auswählen

#/bin/bash

Was du sonst suchst, ließe sich z.B. so lösen:

Code: Alles auswählen

#!/bin/bash
year=$(date +%Y)
lastdate=20210328

for chan_dir in /MediaServer/Youtube/*; do
  META=$(cat "$chan_dir/meta.txt" )
  youtube-dl --dateafter "$lastdate" -f best -ciw -o "$chan_dir/$year/%(title)s.%(ext)s" -i -w --playlist-end 2 $META
done
Die ganzen ls- und grep-Aufrufe braucht man häufig nicht. In einer Schleife eine Reihe von Unterordnern (oder auch Dateien) durchgehen, kann die Bash/sh auch selbst.

youtube-dl scheint einen Batch-Modus zu haben. Wahrscheinlich kannst du dir das Einlesen der meta.txt auch sparen, wenn die Datei einfach nur eine URL enthält (siehe Ende der Zeile):

Code: Alles auswählen

for chan_dir in /MediaServer/Youtube/*; do
  youtube-dl --dateafter "$lastdate" -f best -ciw -o "$chan_dir/$year/%(title)s.%(ext)s" -i -w --playlist-end 2 --batch-file "$chan_dir/meta.txt"
done

Falls du dort auch Ordner hast, die keine meta.txt enthalten, kannst du folgende Zeile als erste Zeile in der Schleife ergänzen, um so einen Ordner zu überspringen:

Code: Alles auswählen

  [[ -f "$chan_dir/meta.txt" ]] || continue
Manchmal bekannt als Just (another) Terminal Hacker.

ServiceLinuxStart
Beiträge: 43
Registriert: 01.01.2019 19:54:54

Re: Youtube-dl script

Beitrag von ServiceLinuxStart » 31.03.2021 20:45:57

JTH hat geschrieben: ↑ zum Beitrag ↑
31.03.2021 19:10:47
Vorweg: Deiner Shebang-Zeile fehlt ein „!“ nach der „#“. Ohne das ! ist es nur ein nicht weiter beachteter Kommentar:

Code: Alles auswählen

#/bin/bash

Was du sonst suchst, ließe sich z.B. so lösen:

Code: Alles auswählen

#!/bin/bash
year=$(date +%Y)
lastdate=20210328

for chan_dir in /MediaServer/Youtube/*; do
  META=$(cat "$chan_dir/meta.txt" )
  youtube-dl --dateafter "$lastdate" -f best -ciw -o "$chan_dir/$year/%(title)s.%(ext)s" -i -w --playlist-end 2 $META
done
Die ganzen ls- und grep-Aufrufe braucht man häufig nicht. In einer Schleife eine Reihe von Unterordnern (oder auch Dateien) durchgehen, kann die Bash/sh auch selbst.

youtube-dl scheint einen Batch-Modus zu haben. Wahrscheinlich kannst du dir das Einlesen der meta.txt auch sparen, wenn die Datei einfach nur eine URL enthält (siehe Ende der Zeile):

Code: Alles auswählen

for chan_dir in /MediaServer/Youtube/*; do
  youtube-dl --dateafter "$lastdate" -f best -ciw -o "$chan_dir/$year/%(title)s.%(ext)s" -i -w --playlist-end 2 --batch-file "$chan_dir/meta.txt"
done

Falls du dort auch Ordner hast, die keine meta.txt enthalten, kannst du folgende Zeile als erste Zeile in der Schleife ergänzen, um so einen Ordner zu überspringen:

Code: Alles auswählen

  [[ -f "$chan_dir/meta.txt" ]] || continue
Fantastisch. genau was ich wollte.
Problem gelöst & 1000 Dank

Antworten