Archiv verlassen und diese Seite im Standarddesign anzeigen : (PHP) - xRel Crawler + OMDAPI
Uranjitsu
19.06.2016, 17:10
Grüßt Euch,
ich versuche verzweifelt die NFO (txt) zu extrahieren, aber leider ohne Erfolg.
Alles andere funktioniert, nur ich komme nicht an die NFO - Jedenfalls über diesen Weg.
Hat jemand eine Idee? Hier der Code:
<?php
// Lade Release
$url1 = file_get_contents('https://www.xrel.to/search.html?mode=full&xrel_search_query=The.Purge.Anarchy.2014.MULTi.COM PLETE.BLURAY-XORBiTANT');
// Hole die Info-Seite
preg_match('!<div class="article">.<p class="article_text" style="width:690px">(.+)<a href="(.+)">weiter...</a></p>!iUm', $url1, $xrel_rl_url);
$xrel_rl_url = $xrel_rl_url[2];
// Hole NFO
preg_match('!<div id="nfo_text" style=".*"><pre>(.+)</pre></div>!isUm', $url1, $xrel_nfo);
$xrel_nfo[1] = str_replace("\n",'<br />', $xrel_nfo[1]);
$pattern = '!<(.*)>!isUm';
$replace = '';
$nfo = preg_replace($pattern, $replace, $xrel_nfo[1]);
// Lade die Info-Seite
$url2 = file_get_contents('https://www.xrel.to' . $xrel_rl_url);
// URI extrahieren
preg_match('!<div class="box_list2"> <img src="//static.xrel.to/static/img/icons/link.png" alt="IMDb.com" /> </div>.<div class="box_list2_right" style="text-align:right;"> <a href="(.+)" title="(.+)">IMDb.com</a> </div>!iUm', $url2, $uri);
$uri = str_replace('http://www.imdb.com/title/', '', $uri[2]);
// Weitergabe und Suche für OMDAPI
$tmdb = file_get_contents('http://www.omdbapi.com/?i=' . $uri . '&plot=short&r=json');
$opt = json_decode($tmdb);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>6</title>
</head>
<body>
Url: <?php
echo $xrel_rl_url; ?><br />
NFO:<br />
<pre><?php
echo $nfo; ?></pre><br />
Uri: <?php
echo $uri; ?><br /> <br /> <br />
<?php
echo '
<div class="row">
<center>
<h1>' . $opt->Title . '</h1><br />
<div class="col-md-6">
<img src="' . $opt->Poster . '" class="img-rounded">
</div>
<div class="col-md-6">
<b>Jahr:</b> ' . $opt->Year . ' <br />
<b>Veroeffentlichung:</b> ' . $opt->Released . ' <br />
<b>Laufzeit:</b> ' . $opt->Runtime . ' <br />
<b>Genre:</b> ' . $opt->Genre . ' <br />
<b>Regisseur:</b> ' . $opt->Director . ' <br />
<b>Schreiber:</b> ' . $opt->Writer . ' <br />
<b>Schauspieler:</b> ' . $opt->Actors . ' <br />
<b>Beschreibung:</b> ' . $opt->Plot . ' <br />
<b>Sprache:</b> ' . $opt->Language . ' <br />
<b>Land:</b> ' . $opt->Country . ' <br />
<b>Auszeichnungen:</b> ' . $opt->Awards . ' <br />
</div>
</center>
</div>
';
?>
</body>
</html>
Mach mal einen Dump von deinem file_get_contents(). Die Nfo als Text ist da garnicht enthalten sondern nur die Bildanzeige.
Uranjitsu
19.06.2016, 18:45
Gerade getestet, dass stimmt.
Hast du denn auch eine Idee das die Textanzeige angezeigt wird?
Das ist, wenn ich mich recht erinnere, seitens Xrel unerwünscht und geht auch mit der API nicht.
Du könntest höchstens mit einem Curl Handler ein Login forcieren und dann die NFO grabben.
Das ist zumindestens das einzige was mir gerade einfällt.
Wobei wenn du eh den Releasenamen hast dann crawl dir die NFO von irgendwelchen PREDBs
das ist glaub ich einfacher und schneller umzusetzen.
fuckedup
19.06.2016, 21:40
Bevor die auf HTTPS umgestellt haben, konnte intelligen die NFO auch als Text auslesen. Kannst ja dort mal im Source Code nachschauen, der ist meines Wissens öffentlich zugänglich.
Uranjitsu
20.06.2016, 10:13
Ich habe mich für eine PREDB entschieden, nach FLX´s Vorschlag.
Scheint nun alles zu funktionieren inkl. NFO.
LG
Uranjitsu
25.04.2017, 10:39
Ich wollte das Thema nochmal aufgreifen:
Die NFO bei P2P-Releases zu bekommen, ist ja kein Problem. Bei den Scene-Releases aber schon.
Wenn man ein Scene-Release direkt aufruft, bleibt die "Textanzeige" aus. Mit einem Klick auf "NFO Ansehen", ladet die Seite nach und die "Textanzeige" ist vorhanden.
Der Link: - Das was wichtig ist, ist hier rot markiert -
<a href="/movie-nfo/1321554/Creed-Rockys-Legacy-2015-German-DL-1080p-BluRay-AVC-SCiENTOLOGY.html" class="view_nfo">NFO ansehen</a>
Ich habe dann versucht eine Idee umzusetzen:
Mit "preg_replace" die .*js und .*css Datei(en) zu überschreiben und mit eigenen bzw. bearbeiteten zu ersetzen. (Funktioniert)
Nun geht es darum, die notwendigen Deklarationen, welche dafür sorgen das "Textanzeige" auf "hide" steht, eben umzukehren.
Ich habe es nun etliche male versucht, aber ich gehe davon aus, dass es via Ajax geladen wird.
Eine andere Idee wäre:
Die Seite zu laden und eine Art Klick-Simulation auf den oben gezeigten Link auszuführen und die Seite dementsprechend nochmal nachladen. In wie weit das möglich ist, weis ich nicht. Denn hier muss ja die "class="view_info" angesprochen werden, die ja den entscheidenden Impulse gibt.
Keine Ahnung ob man die Seite im iFrame laden- und die Daten dann abfangen kann und wie sich das mit einer Klick-Simulation verhält.
Das sind eben nur Ideen, eventuell hat jemand von euch ebenfalls Lust, eine Möglichkeit zu finden. Es wäre ja egal wie umfangreich das ganze ist. Mich stört es, da ich auch gerade SSBG komplett umbaue und vor allem den MovieXrel Generator aufgemotzt habe, aber eben an diese Scene-NFOS nicht komme. Und z.B Layer13, hat nicht jede NFO parat. Und eine PNG2TEXT OCR Methode, ist mega unzuverlässig.
In diesem Sinne
Die Antwort ist eigentlich simpel :D
https://www.xrel.to/p2p/166883-Futureworld-Das-Land-von-Uebermorgen-1976-GERMAN-AC3-HDrip-x264-Z3BR4/nfo.html
Du musst nur die Url richtig bauen, sobald du über der BildNfo das Wort "Textanzeige" hast steht im Quelltext auch die Nfo als Text.
Da es Sinnfrei aber technisch machbar ist, kannst du das Bild(png) auch laden und an
http://www.free-ocr.com/de.html senden.
Dann bekommst du von dort den Text/Nfo.
Ein Beispiel wie du simpel dran kommst für den Browser (chrome z.B.)
https://www.xrel.to/search.html?xrel_search_query=Futureworld.-.Das.Land.von.Uebermorgen.-.1976.GERMAN.AC3.HDrip.x264-Z3BR4
Schon kannst du ganz gedigen den Quelltext parsen.
Uranjitsu
25.04.2017, 11:56
An die P2P Release- NFO zu kommen ist ja auch kein Problem, wie oben geschrieben.
Es geht um die SCENE-Releases, wie dieses hier als Beispiel:
https://www.xrel.to/movie-nfo/1321554/Creed-Rockys-Legacy-2015-German-DL-1080p-BluRay-AVC-SCiENTOLOGY.html
Der NFO-Text steht doch völlig unabhängig vom CSS/JS immer im Quelltext?
EDIT: Ne wohl doch nicht. Ich bin blöd :D
EDIT2: User-Agent und Referer plausibel setzen scheint zu genügen um oben genannten Zustand herbeizuführen.
Uranjitsu
25.04.2017, 18:51
@Nimbus, welcher Zustand?
Nochmal, es gibt Unterschiede bei "P2P" und "SCENE".
Bei P2P ist das Auslesen der NFO(TEXT) kein Problem.
Bei SCENE geht das nicht so einfach, da muss das
<a href="#" class="show_nfo">#</a> genutzt werden.
Die Links zwischen P2P und SCENE unterscheiden sich ebenfalls.
P2P
https://www.xrel.to/p2p/166883-Futureworld-Das-Land-von-Uebermorgen-1976-GERMAN-AC3-HDrip-x264-Z3BR4/nfo.html
SCENE
https://www.xrel.to/movie-nfo/1321554/Creed-Rockys-Legacy-2015-German-DL-1080p-BluRay-AVC-SCiENTOLOGY.html
Ich wollte das Thema nochmal aufgreifen:
Die NFO bei P2P-Releases zu bekommen, ist ja kein Problem. Bei den Scene-Releases aber schon.
Wenn man ein Scene-Release direkt aufruft, bleibt die "Textanzeige" aus. Mit einem Klick auf "NFO Ansehen", ladet die Seite nach und die "Textanzeige" ist vorhanden.
Der Link: - Das was wichtig ist, ist hier rot markiert -
<a href="/movie-nfo/1321554/Creed-Rockys-Legacy-2015-German-DL-1080p-BluRay-AVC-SCiENTOLOGY.html" class="view_nfo">NFO ansehen</a>
Ich habe dann versucht eine Idee umzusetzen:
Mit "preg_replace" die .*js und .*css Datei(en) zu überschreiben und mit eigenen bzw. bearbeiteten zu ersetzen. (Funktioniert)
Nun geht es darum, die notwendigen Deklarationen, welche dafür sorgen das "Textanzeige" auf "hide" steht, eben umzukehren.
Ich habe es nun etliche male versucht, aber ich gehe davon aus, dass es via Ajax geladen wird.
Eine andere Idee wäre:
Die Seite zu laden und eine Art Klick-Simulation auf den oben gezeigten Link auszuführen und die Seite dementsprechend nochmal nachladen. In wie weit das möglich ist, weis ich nicht. Denn hier muss ja die "class="view_info" angesprochen werden, die ja den entscheidenden Impulse gibt.
Keine Ahnung ob man die Seite im iFrame laden- und die Daten dann abfangen kann und wie sich das mit einer Klick-Simulation verhält.
Das sind eben nur Ideen, eventuell hat jemand von euch ebenfalls Lust, eine Möglichkeit zu finden. Es wäre ja egal wie umfangreich das ganze ist. Mich stört es, da ich auch gerade SSBG komplett umbaue und vor allem den MovieXrel Generator aufgemotzt habe, aber eben an diese Scene-NFOS nicht komme. Und z.B Layer13, hat nicht jede NFO parat. Und eine PNG2TEXT OCR Methode, ist mega unzuverlässig.
In diesem Sinne
Der Text der NFO taucht im HTML auf. Bei P2P-Releases ist das interessante Div (id=nfo_text) direkt da. Bei Scene-Releases müssen (mindestens?) die besagten Bedingungen geschaffen werden, damit es auftaucht.
Seit der letzten Umstellung vonxREL brauchst du es bei neuen Einträgen nicht mehr, wenn du den Suchlink so nimmst wie oben beschrieben, geht es mit allen neuen Einträgen.
Bei den älteren nfo
nimmst du dir ein HTMLDocument2 und führst den Link mit innerhtml "NFO ansehen" aus.
https://msdn.microsoft.com/en-us/library/aa752595(v=vs.85).aspx
auch danach hast du die im Quelltext die Nfo als text.
in Delphi sieht es so aus, ev hilft es dir.
var
HTMLDocument2: IHTMLDocument2;
Element: IHTMLElement;
I: Integer;
begin
Result:= False;
HTMLDocument2 := EB.Document as IHTMLDocument2;
for I := 0 to HTMLDocument2.Links.Length - 1 do
begin
Element := HTMLDocument2.Links.Item(I, 0) as IHTMLElement;
if TRegEx.IsMatch(Element.GetAttribute('innerText', 0),LinkText,[roIgnoreCase,roSingleLine]) then
begin
Element.click;
Result := True;
Break;
end;
end;
end;
Das hantieren mit simulierten Klicks aus Links dürfte komplett unnötig sein. Durch die Notwendigkeit eines "Browsers" der "klicken" kann ist das mit PHP auch nicht unbedingt möglich.
pythonfreak
26.04.2017, 02:39
Hab von PHP nicht so Ahnung, aber falls es wem hilft hier in python (Python 2.7.13). NFO von xrel holen, imdb url auslesen und omdbapi. Ohne User-Agent und Referer kommt man wohl nicht an die NFO als Text...
Syntax: xrel.py Releasename
## -*- coding: utf-8 -*-
import urllib2
import sys
from bs4 import BeautifulSoup
import json
#xrel oeffnen und nfo laden
xrel_url = "https://www.xrel.to/search.html?mode=full&xrel_search_query=" + sys.argv[1]
req = urllib2.Request(xrel_url)
req.add_header('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8')
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36')
req.add_header('Referer', 'https://www.xrel.to/releases.html')
req.add_header('Cookie', 'notice_understood=1')
resp = urllib2.urlopen(req)
content = resp.read()
soup = BeautifulSoup(content)
nfotext = soup.find("div", {"id": "nfo_text"})
nfotext = nfotext.text
print nfotext
print '\n'
#imdb url auslesen
if 'imdb' in nfotext:
imdb_id = nfotext.split("/title/")[-1].split("/")[0].split(" ")[0]
print imdb_id
print '\n'
#omdbapi
url = "http://www.omdbapi.com/?i=" + imdb_id
data = json.load(urllib2.urlopen(url))
try:
title = data["Title"]
except KeyError:
title = ""
try:
year = data["Year"]
except KeyError:
year = ""
try:
genre = data["Genre"]
except KeyError:
genre = ""
try:
runtime = data["Runtime"]
except KeyError:
runtime = ""
try:
rating = data["imdbRating"]
except KeyError:
rating = ""
try:
votes = data["imdbVotes"]
except KeyError:
votes = ""
try:
director = data["Director"]
except KeyError:
director = ""
try:
writer = data["Writer"]
except KeyError:
writer = ""
try:
actors = data["Actors"]
except KeyError:
actors = ""
try:
poster = data["Poster"]
except KeyError:
poster = ""
try:
country = data["Country"]
except KeyError:
country = ""
#Ausgabe
print "Title: " + title
print "Cover: " + poster
print "Genre: " + genre
print "Land/Jahr: " + country + "/" + year
print "Laufzeit: " + runtime
print "Rating: " + rating + "/" + "10" + " (" + votes + " Votes" +")"
print "Regie: " + director
print "Drehbuch: " + writer
print "Darsteller: " + actors
Uranjitsu
26.04.2017, 07:53
Herzlichen Dank für eure Hilfe.
Habe es umsetzen können. Sexy !
Für interessierte hier der Code:
PHP
<?php
$releasename = 'Creed.Rockys.Legacy.2015.German.DL.1080p.BluRay.A VC-SCiENTOLOGY';
function get_match($regex, $content, $pos = 1)
{
/* do your job */
preg_match($regex, $content, $matches);
/* return our result */
return $matches[intval($pos)];
}
function xrelnfo_scene($releasename)
{
$conf['xrel_qurl'] = 'https://www.xrel.to/search.html?mode=full&xrel_search_query=';
/* do some curl magic */
$headers = array(
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $conf['xrel_qurl'] . $releasename);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_REFERER, "https://www.xrel.to/releases.html");
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
$xrel_content = curl_exec($ch);
curl_close($ch);
$xrel['nfo'] = @get_match('/<div id="nfo_text" style="padding:10px; display: none;">.<pre>(.+)<\/pre>.<\/div>/s', $xrel_content);
return $xrel['nfo'];
}
$nfo = xrelnfo_scene($releasename);
echo "
NFO TEST 1:
<pre>$nfo</pre>
";
Variante: Delphi (https://www.szenebox.org/29-xrel-crawler-omdapi-2944-post34835/#post34835)| Python (https://www.szenebox.org/29-xrel-crawler-omdapi-2944-post34841/#post34841)
- - - - - - - - - - Beitrag nachträglich erweitert - - - - - - - - - -
Jetzt hätte ich nur noch die Frage, wie man am cleversten die Infos aus dem NFO-Text ausliest.
Wenn z.B Informationen fehlen wie Größe/Size.
Gibt es da auch einen speziellen Regex, der zuverlässig ausliest?
Sag ich doch, dass es so funktioniert :D
Kleine Anmerkung:
get_match ist suboptimal, wenn du bei einem Reg-Ex mehrere Positionen möchtest, da der Reg-Ex jedes mal neu ausgewertet werden würde. Solange es (wie hier) nur um einen Treffer geht ist das jedoch okay.
du nutzt für die Suche nicht die xREL API sondern die normale Seite. Die Seite kann/darf sich jederzeit ändern oder kann irgendwelche anderen Anti-Bot-Maßnahmen einführen. Die API Endpoints werden sich vermutlich nicht einfach so ändern. Sie haben jedoch aktuell ein Limit von 300 Anfragen pro Stunde und IP. Wenn das Limit nicht stört, dann würde ich auf die API umstellen, denn so kann man unnötige Probleme bei Änderungen umgehen.
Accept-Header ist aktuell unnötig, aber auch nicht störend.
Du übernimmst den übertragenen User-Agent des Nutzers. Das könnte zu schwer identifizierbaren Problemen führen, wenn xREL den speziellen User-Agent des Nutzers nicht akzeptiert.
Etwas Error-Handling würde nicht schaden.
Die Größe würde ich von xREL übernehmen. Die Daten sind meiner Erfahrung nach sehr sorgsam gepflegt und damit vermutlich besser als irgendwelche Reg-Ex. Um Daten zuverlässig aus NFOs auszulesen muss man etwas feilen um möglichst viele vorkommende Varianten zu unterstützen :D
Uranjitsu
26.04.2017, 15:22
Danke für die Anmerkungen, werde einiges berücksichtigen !
Das mit dem User-Agent, habe ich aber nicht ganz verstanden. Ist es dabei vom Vorteil einen immer vorgefertigten zu nutzen?
Naja es minimiert beträchtlich die Fehleranfälligkeit für dein Script
Wenn ich in meinem Browser den User-Agent auf "Birnensaft/5.0" setze (z.B. weil ich total verrückt bin und komische Dinge mache), dann würde dein Script auf mysteriöse Weise bei mir nicht funktionieren und es wäre relativ unklar warum das so ist :D
Uranjitsu
26.04.2017, 16:12
Welcher wäre denn in diesem Fall am besten?
Verstehe das Problem an sich schon gar nicht. :emoji37:
Du übernimmst den User-Agent des Users. Hat der User einen komischen User-Agent, dann sendest du den an xREL. Wenn xREL sich jetzt nun dazu entscheidet diesen User-Agent nicht zu mögen, dann geht beim User dein Script nicht.
Ich würde einfach den User-Agent des aktuellen FF/Chrome nutzen, da der aktuell relativ plausibel sein dürfte.
Jetzt hätte ich nur noch die Frage, wie man am cleversten die Infos aus dem NFO-Text ausliest.
Wenn z.B Informationen fehlen wie Größe/Size.
Gibt es da auch einen speziellen Regex, der zuverlässig ausliest?
Hab ein Regex geschrieben der hat bei 90% der mir jetzt getestetn NFOs funktioniert.
RegEx: /(SiZE(\D+)(\d*[,;.]?\d{1,6})\s*(KB|MB|GB))|(RUNTiME(\D+))((\d{1,3})\s *(Minuten|min))/ig
Beispiel: https://regex101.com/r/RkyR9I/2
EDIT: er matcht auf Größe und Laufzeit.
Hab jetzt nicht genau geschaut, aber folgendes fehlt bei dir z.B.: Binärpräfixe bei der Größe, Angabe der Größe in Parts (z.B. 25x50mb), Length, Duration, Dauer, Groesse
Powered by vBulletin® Version 4.2.2 Copyright ©2026 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.