PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (BASH) - Release-Informationen per IMDB-ID



syrius
30.01.2016, 18:50
Hab hier heute was zusammen geschrieben um Informationen über Filme per BASH zu sammeln:




imdb () {
# execute: imdb "datei.nfo"
# execute debug: imdb "datei.nfo" "whatever"
proxy_user=""
proxy_pass=""
proxy_host=""
proxy_port=""
if ([ -n "${proxy_user}" ] && [ -n "${proxy_pass}" ] && [ -n "${proxy_host}" ] && [ -n "${proxy_port}" ]); then
​ PROXY_IF="-U ${proxy_user}:${proxy_pass} --socks5 ${proxy_host}:${proxy_port}"
else
​ unset PROXY_IF
fi
imdb_id=`tr '[\000-\011\013-\037\177-\377]' '.' < ${1} | grep -m1 -oE "tt[0-9]{7}"`
if [ -n "${imdb_id}" ]; then
apikey=""
omdb=`curl -sS ${PROXY_IF} -L "http://www.omdbapi.com/?i=${imdb_id}&plot=full&r=xml"`
movie_title=`echo "${omdb}" | cut -d\" -f8`
movie_title_de=`curl -sS ${PROXY_IF} -L "http://www.imdb.com/title/${imdb_id}/releaseinfo" | grep "German" -A1 | grep "</td>" | grep "<td>" | grep -v "German" | cut -d\> -f2 | cut -d\< -f1 | head -n1`
movie_year=`echo "${omdb}" | cut -d\" -f10`
movie_duration=`echo "${omdb}" | cut -d\" -f16`
movie_genre=`echo "${omdb}" | cut -d\" -f18`
movie_actor=`echo "${omdb}" | cut -d\" -f24`
movie_country=`echo "${omdb}" | cut -d\" -f30`
movie_poster=`echo "${omdb}" | cut -d\" -f34`
movie_rating=`echo "${omdb}" | cut -d\" -f38`
movie_votes=`echo "${omdb}" | cut -d\" -f40`
movie_type=`echo "${omdb}" | cut -d\" -f44`
themoviedb_temp=`curl -sS ${PROXY_IF} -L "https://api.themoviedb.org/3/find/${imdb_id}?api_key=${apikey}&external_source=imdb_id&language=de"`
themoviedb_plot=`echo "${themoviedb_temp}" | sed 's/","/\n"/g' | grep "overview" | cut -c 13- | sed 's/"//g' | sed 's/\\\//g'`
if [ -n "${2}" ]; then
echo "# DEBUG -----------------------------------------------------------------------"
echo "Titel : ${movie_title}"
echo "Titel (DE) : ${movie_title_de}"
echo "Jahr : ${movie_year}"
echo "Laufzeit : ${movie_duration}"
echo "Genre : ${movie_genre}"
echo "Schauspieler : ${movie_actor}"
echo "Land : ${movie_country}"
echo "Poster : ${movie_poster}"
echo "Bewertung : ${movie_rating}"
echo "Votes : ${movie_votes}"
echo "Typ : ${movie_type}"
echo "Plot : ${themoviedb_plot}"
echo "# /DEBUG ----------------------------------------------------------------------"
fi
else
echo "Die NFO gibt es nicht oder enthaelt keine IMDB-ID ..."
fi
}

Ausgabe: imdb "datei.nfo" "debug"

# DEBUG -----------------------------------------------------------------------
Titel : The Shawshank Redemption
Titel (DE) : Die Verurteilten
Jahr : 1994
Laufzeit : 142 min
Genre : Crime, Drama
Schauspieler : Tim Robbins, Morgan Freeman, Bob Gunton, William Sadler
Land : USA
Poster : http://ia.media-imdb.com/images/M/MV5BODU4MjU4NjIwNl5BMl5BanBnXkFtZTgwMDU2MjEyMDE@._ V1_SX300.jpg
Bewertung : 9.3
Votes : 1
Typ : movie
Plot : Das Shawshank Gefängnis in den 30ern: der wegen Mordes an seiner Frau verurteilte Andy Dufresne kommt als Neuling lebenslänglich hinter Gittern. Zurückhaltend wie er ist, ist er ständig das Ziel sexueller Angriffe, doch als er als Banker durchblicken läßt, daß er finanziell für den Direktor und die Wärter eine Menge tun kann, ist für seine Sicherheit gesorgt. Langsam aber sicher freundet er sich mit dem Langzeitinsassen Red an, baut die Gefängnisbibliothek auf und rückt nie von seiner Überzeugung ab, unschuldig zu sein. Viele Jahre vergehen, bis etwas geschieht, was sogar Reds Leben für immer verändern wird...
# /DEBUG ----------------------------------------------------------------------

apikey: Es muss zuvor ein Account erstellt und der Key eingetragen werden.

FLX
30.01.2016, 19:05
Ich sponsor mal den Regex um die IMDB Id in der nfo zu suchen



nfofile=$(cat *.nfo)
nfoIMDB=`echo "$nfofile" |grep -m1 -oE "tt[0-9]{7}"`

syrius
30.01.2016, 19:24
meine unprofessionelle Lösung - da ich REGEX nich abhab,

read_nfo = pfad/datei.nfo


cat "${read_nfo}" | grep "imdb.com" | sed 's/tt/\ntt/g' | sed 's/\//\n/g' | grep -v ":" | grep "tt"

Danke FLX, deine Variante findet bei mir auf jeden Fall Verwendung!

FLX
30.01.2016, 20:13
Dann ist es doch eine win:win Situation. Ich mag deinen iMDB/TMDB Crawler
und der bekommt auch sicher Verwendung sobald die Zeit es zulässt oder nen Script Recode ansteht :emoji41:

PS: bash ist toll :emoji56:

xavier61803
31.01.2016, 03:18
movie_votes=`echo "${omdb}" | cut -d\" -f40 | cut -d\, -f1`
Hat das nen tieferen Sinn, dass du bei den Votes alles nach der ersten Zahl entfernst?

syrius
31.01.2016, 10:20
Hat das nen tieferen Sinn, dass du bei den Votes alles nach der ersten Zahl entfernst?

Stimmt das ergibt keinen Sinn - fixxed.

syrius
31.01.2016, 15:41
nfoIMDB=`echo "$nfofile" |grep -m1 -oE "tt[0-9]{7}"`[/code]

Bei Binärdateien gibts da Probleme - eine Lösung anbei.

Ausgabe

cat "${nfo_name}" | grep -m1 -oE "tt[0-9]{7}"
Übereinstimmungen in Binärdatei (Standardeingabe).

Lösung

tr '[\000-\011\013-\037\177-\377]' '.' < ${nfo_name} | grep -m1 -oE "tt[0-9]{7}"

Zusatz
Wurde oben mit eingebaut - somit ändert sich die Ausführung wie folgt

imdb "datei.nfo" # ohne Ausgabe
imdb "datei.nfo" "debug" # mit Ausgabe

syrius
31.01.2016, 16:13
Wurde mal noch um Socks5 Proxy für Abfragen der Schnittstellen erweitert



proxy_user=""
proxy_pass=""
proxy_host=""
proxy_port=""
if ([ -n "${proxy_user}" ] && [ -n "${proxy_pass}" ] && [ -n "${proxy_host}" ] && [ -n "${proxy_port}" ]); then
​ PROXY_IF="-U ${proxy_user}:${proxy_pass} --socks5 ${proxy_host}:${proxy_port}"
else
​ unset PROXY_IF
fi

Die Variable "PROXY_IF" darf hinter cURL ruhig stehen bleiben - sofern sie gefüllt ist, werden die Daten über den Socks geleitet - andernfalls ist kein Proxy aktiv. Sinnig ist es natürlich die Proxy-Daten vor Aufruf einzulesen und nicht manuell hier innerhalb der Funktion anzupassen - das wurde lediglich zum Verständnis aufgenommen.

Arbeite sehr gern mit einer Proxy-Rotation. Zum Beispiel wenn man auf einem Server mehrere Adressen hat und diese per ipTables in Rotation laufen lässt. So kann ein Funktionsaufruf über die eine IP raus gehen, der nächste über die andere, usw... Nutze dazu "mocks proxy", adde dann meine IP-Adressen auf dem Server. cURL spricht mit mocks und durch die ipTable-Rotation geht er immer über eine andere IP raus. Man kann natürlich auch einen Crawler schreiben der diverse Proxy-Seiten einliest, die Proxies vor Absetzen des Funktionsaufrufs checkt und dann einen derer nutzt... möglich ist alles :D

Sowas geht natürlich auch prima mit dem TOR-Netzwerk. So habe ich mir ein TOR-Relay aufgesetzt und habe ihn für meine IP-Adresse als SOCKS freigegeben. Damit lässt sich dann auch einfach arbeiten. Ein kleiner Cronjob der auf den TOR-Server ein reload macht (neue IP beziehen), und host:port für cURL verwenden. Ist natürlich gerade beim verschieben von großen Dateien aufgrund der geringen Bandbreite/schlechten Routings... untauglich.. aber möglich. Zuvor findet natürlich ein "uptime check" des Hosts statt ob der Proxy nicht beim Host gesperrt ist... wenn doch kann man in einer Schleife ein reload machen bis es durch geht.

bobby
12.12.2018, 21:54
gute Idee, vor allem bashing :-)


ich tendiere immer zu kleinen und schnellen onelinern, deshalb ein kleiner vorschlag / goodie meinerseits:


omdb=`curl -sS ${PROXY_IF} -L "http://www.omdbapi.com/?i=${imdb_id}&plot=full&r=xml"`
movie_title=`echo "${omdb}" | cut -d\" -f8`
movie_title_de=`curl -sS ${PROXY_IF} -L "http://www.imdb.com/title/${imdb_id}/releaseinfo" | grep "German" -A1 | grep "</td>" | grep "<td>" | grep -v "German" | cut -d\> -f2 | cut -d\< -f1 | head -n1`



..movie_title...

movie_title_de=`curl -sS ${PROXY_IF} -L "http://www.imdb.com/title/${imdb_id}/releaseinfo" | grep "Germany" -A1 | perl -ne '/item__title">([^<]+)/ && print "$1\n"'`

Nimbus
13.12.2018, 09:32
Zum Beispiel wenn man auf einem Server mehrere Adressen hat
Hierzu sei erwähnt, dass man in diesem Fall auch das "interface" Argument nutzen kann.

banane
11.07.2019, 00:19
Tjo, nach ca. 9 Monaten habe ich den Thread endlich auch endeckt - und schon funzt er nicht mehr. Ein weiteres Beispiel das alles andauernd angepasst werden muss.
Trotzdem Danke an Syrius das er uns solche Dinge zur Verfügung stellt.

Zuerst aber ein paar Grundsätzliche Fragen.

Irgendwie kapiere ich das als Anfänger nicht ganz, also bitte nicht böse sein falls das jetzt dumm klingt.
Warum wurden da gleich 3 DataBases abgefragt?

IMDB alleine wegen deutschen Titel, aber - entweder die Filme liegen sowieso in Deutsch mit deutschen Titel vor, oder sind in Orginalsprache. In Orginalsprache interessiert aber der Deutsche Titel eigentlich nicht.
Und warum wird der Plot von TheMovieDatabase geholt und nicht auch von OMDB ? Oder gleich alle Infos von TMDb ?

Wobei, ich glaube die Lösung dürfte sein das omdb in der Regel nur Englische Titel/Angaben liefert. Auch weil keine Sprachsuche per api möglich ist.
Deswegen die deutsche Titelsuche auf IMDB und der Plot von TMDB.
Stimmt das soweit ?
Aber warum nicht gleich das ganze auf IMDB oder TMDB suchen ? Gibt es da zuwenig Treffer oder gehen dort andere Infos ab ?


IMDB hat einige Dinge umgestellt, leider klappt deswegen unter anderem auch das parsen des deutschen Titels nicht mehr und man kann diese eigentlich zeile löschen. In meinen Augen aber auch nicht wichtig, siehe auch oben.

Ändern muss man aber auch folgendes:
Zusätzlich eine Zeile mit apiKey von omdb einfügen und diesen Wert an die curl Zeile anhängen.
api_key_omdb=XXXXXXXX
omdb=`curl -sS ${PROXY_IF} -L "http://www.omdbapi.com/?i=${imdb_id}&plot=full&r=xml&apikey=$api_key_omdb"`

FLX
11.07.2019, 13:47
Die Fragen lassen sich relativ leicht zu beantworten.
Der Omdb API Key kam erst später dazu und da Imdb/Tmdb und Konsorten jeweils einen anderen Datenbestand haben findet man oftmals treffer die der andere Anbieter nicht hat.

banane
11.07.2019, 15:45
Ja, das wäre logisch.
Nur, es wird aber nicht versucht von drei Seiten die Komplettinfos zu einem Film abzurufen, sondern von jeder der Seiten ein Schnipsel genommen. Gerade eben weil der Datenbestand unterschiedlich ist, ist die wahrscheinlichkeit das Teilinfos fehlen damit größer, da der Film auf allen drei Seiten vorhanden sein muß.
Und da wollte ich die Gründe dafür wissen.