Internetabfrage

Scar47

Aktives Mitglied
okay folgendes:
ich habe ein programm das mir so filmnamen aus ner mediathek ausgibt als Strings. jetztz möchte ich gerne, dass das programm den film auf The Internet Movie Database (IMDb) sucht und mir die dort angegebene bewertung in nen textfeld oder konsole oder so schreibt. ist mir realtiv egal hauptsache ich habe es iwo, wo ich das brauche kann ich ja selber noch gucken.
das selbe gilf für das genre ( bzw die genres).
ich weiß das es wahr. nicht so leicht sein wird...
ich habe nicht so viel ahnung von java und mit internet habe ich noch nicht gearbeitet-.-
ich hoffe trozdem das mit eure hilfe hin zu biegen.
mfg Scar
 

Scar47

Aktives Mitglied
hab mir das mal angesehen. ich bin ehrlich-ich checke nichts :D
darum weiß ich auch nicht genau wo ich ansetzen mus sum das für mich zurecht zu basteln. haste iwie nen tipp?
ist der quell text von der inet seite wichtig?

achja- ich benutze eclipse dafür ich wei nicht ob das iwie nen utnerschied macht xD
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Also eine brauchbare und leicht benutzbare API was man so auf die Schnelle bei google findet ist z.B. IMDB API, IMDB web service
Du suchst die URL (z.B. http://www.deanclatworthy.com/imdb/?q=The+Green+Mile ) auf q = The Green Mile und gibt dir als Antwort ein JSON Objekt zurück (oder XML etc.)

Die Frage ist ja, wie viel Erfahrung hast du Allgemein in Java und sagt dir JSON / XML etwas? Hast du damit in Java schon gearbeitet?
Mit gson wären die Genres und Bewertung mit ein paar Zeilen abrufbar :)
 

Scar47

Aktives Mitglied
also damit habe ich noch nicht bearbeitet, habe nicht so viel ahnung von java. nur halt so über die schule. wir habn halt bisher nur so bäume, listen, paint so nen kram halt gemacht. alles was so über den rand der gui hinaus geht ist eher neuland für mich, bin aber gewollt mich da auch rein zu versetzen. das problem ist hlat so ein bischen das ich nicht viel von der englischen informatik fachsprache verstehe, da ich mich halt noch nie richtig damit befasst habe.
ich werde das mal ausprobieren.
 

Scar47

Aktives Mitglied
e, gibt es sowas auf für deutsche filme?
weil ich habe das nur für englische filmnamen gefunden -.-
ansonsten scheit das das richtige zu sein, ich habe nur nicht viel ahnung wie es gehen soll aber das wird schon :D
 

darekkay

Bekanntes Mitglied
Da ich mich auch gerade nach einer IMDB API umsehe, kann ich zu dem oben genannten Link sagen, dass leider nur 30 Requests/Stunde oder so möglich sind.
Ich hab schon mit einer API für php gearbeitet - lief auch einwandfrei, bis IMDB das Layout verändert hat... also eher suboptimal, wenn es darum geht, eine längerfristige Lösung zu finden.

Eine gute Möglichkeit ist es, die von IMDB zur Verfügung gestellten Textdateien zu nutzen: Alternative Interfaces

Pro:
- kein Internetzugang nötig (da die Datenbank auf dem Rechner liegt)
- schnellerer Zugriff

Contra:
- viel Speicherplatz (alleine alle Filmtitel sind schon mal etwa 17MB groß..)
- man müsste die Datenbanken ab und zu mal aktualisieren, was wieder mit einem hohen Aufwand verbunden ist

Ich werde mich noch ein wenig informieren und bescheid sagen, falls ich was sinnvolles finden sollte ;)
 

darekkay

Bekanntes Mitglied
Die Suche nach einer fertigen Lösung habe ich aufgegeben, nun schreibe ich selbst an einer IMDB-Klasse. Viele Informationen bekomme ich bereits heraus. Wenn dir die Bewertung reicht (so der Anfangspost), dann hier eine Lösung:

Java:
package dkay;

import java.util.regex.Matcher;
import java.util.regex.Pattern;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class IMDBBewertung {

	private String movieURL = "http://www.imdb.com/title/tt"; 

	private StringBuilder body = new StringBuilder();

	private String bewertung;

	public IMDBBewertung(String id) throws IOException{
		openURL(id);
	}

	private void openURL(String id) throws IOException{

		URL url = new URL(movieURL + id);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setRequestMethod("GET");
		connection.setInstanceFollowRedirects(true);
		connection.addRequestProperty("user-agent", "Firefox");
		connection.setDoOutput(true);

		BufferedReader in = new BufferedReader(
				new InputStreamReader(connection.getInputStream()));

		body = new StringBuilder();
		String line = null;
		while (true)
		{
			line = in.readLine();
			if (line == null)
				break;

			body.append(line); 
		}
		in.close();

		this.bewertung = extract("<span class=\"rating-rating\">([.|\\d]*?)<span>");
	}

	private String extract(String query){
		Matcher matcher = Pattern.compile(query,Pattern.MULTILINE | Pattern.DOTALL).matcher(body); 
		if(matcher.find()){
			if (matcher.groupCount() >= 1)
				return matcher.group(1).trim();
			else 
				return matcher.group().trim();
		}
		return "";
	}


	public String getBewertung() {
		return bewertung;
	}

	public static void main(String[] args){

		try {
			IMDBBewertung movie = new IMDBBewertung("0162222");	// Cast away
			System.out.println(movie.getBewertung());
			
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
}

Du übergibst einfach nur die imdb-id (die Nummer, die in der Adressleiste angezeigt wird) und fertig ;)
Vergiss nicht, dass die Lösung solange funktioniert, bis IMDB wieder das Layout ändert (dies kann aber dauern ^^)

Viel Spaß damit
 
Zuletzt bearbeitet:

Scar47

Aktives Mitglied
danke auf jeden fall schon mal, wäre gut wenn die genre auch noch ausgelesen würde-wenn du das kannst wäre das super, ansonsten nehme ich das auch so :)
danke sehr mfg Scar


-> e wie kann ich die nummer bekommen, ich habe nur nen textfeld wo der name vom film drinne steht... geht das dann?
 
Zuletzt bearbeitet:

darekkay

Bekanntes Mitglied
So kannst du die Genres auslesen:

Java:
package dkay;
 
import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
 
public class IMDBBewertung {
 
    private String movieURL = "http://www.imdb.com/title/tt"; 
 
    private StringBuilder body = new StringBuilder();
 
    private String bewertung;

	private List<String> genres;
 
    public IMDBBewertung(String id) throws IOException{
        openURL(id);
    }
 
    private void openURL(String id) throws IOException{
 
        URL url = new URL(movieURL + id);
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("GET");
        connection.setInstanceFollowRedirects(true);
        connection.addRequestProperty("user-agent", "Firefox");
        connection.setDoOutput(true);
 
        BufferedReader in = new BufferedReader(
                new InputStreamReader(connection.getInputStream()));
 
        body = new StringBuilder();
        String line = null;
        while (true)
        {
            line = in.readLine();
            if (line == null)
                break;
 
            body.append(line); 
        }
        in.close();
 
        this.bewertung = extract("<span class=\"rating-rating\">([.|\\d]*?)<span>");
        this.genres = extractAll("Genres:</h4>(.*?)</div>","<a href=\"/genre/.*?\">(.*?)</a>");
    }
 
    private String extract(String query){
        Matcher matcher = Pattern.compile(query,Pattern.MULTILINE | Pattern.DOTALL).matcher(body); 
        if(matcher.find()){
            if (matcher.groupCount() >= 1)
                return matcher.group(1).trim();
            else 
                return matcher.group().trim();
        }
        return "";
    }
    
    /** Extracts all matched subqueries in the first matched query */
	private List<String> extractAll(String query, String subquery){
		String substr;
		List<String> list = new LinkedList<String>();
		Matcher matcher = Pattern.compile(query,Pattern.MULTILINE | Pattern.DOTALL).matcher(body); 
		if(matcher.find()){
			if (matcher.groupCount() >= 1)
				substr = matcher.group(1).trim();
			else 
				substr = matcher.group().trim();

			matcher = Pattern.compile(subquery,Pattern.MULTILINE | Pattern.DOTALL).matcher(substr); 
			while(matcher.find()){
				if (matcher.groupCount() >= 1)
					list.add(matcher.group(1).trim());
				else
					list.add(matcher.group().trim());
			}
		}
		return list;
	}

    public List<String> getGenres() {
        return genres;
    } 
 
    public String getBewertung() {
        return bewertung;
    }
 
    public static void main(String[] args){
 
        try {
            IMDBBewertung movie = new IMDBBewertung("0162222"); // Cast away
            System.out.println("Bewertung: " + movie.getBewertung());
            System.out.println("Bewertung: " + movie.getGenres());
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }
}

Für dein Problem mit dem Filmtitel habe ich noch keine Lösung. Du kannst einem Titel nicht direkt eine ID zuweisen, da es beispielsweise mehrere Filme mit gleichem oder ähnlichem Titel gibt. Man muss also den Film entweder selbst bei IMDB suchen und die Nummer aus der URL nehmen (oder man schreibt das Programm um und nimmt immer die ganze URL), oder man programmiert selbst so eine Suche.
Ich hab das zwar schon angefangen, habe aber momentan keine Zeit, um weiterzumachen :/
 

eRaaaa

Top Contributor
Was ich noch hinzufügen wollte: Es gibt auch noch The open movie database , die haben auch anständige API`s und da solltest du auch deine deutschen Filme finden können. Das mit dem Vorschlag von darekkay mag so ja laufen, aber du solltest den Hinweis von ihm nicht ausser acht lassen
Vergiss nicht, dass die Lösung solange funktioniert, bis IMDB wieder das Layout ändert (dies kann aber dauern ^^)

und man braucht keine ID`s :D
 

darekkay

Bekanntes Mitglied
Die Seite habe ich heute auch entdeckt, werd sie mir auch mal näher anschauen ;)

Um speziell IMDB-Infos zu bekommen, gibt es ja die imdb.Lookup-Klasse. Diese benötigt aber (logischerweise) auch eine ID. Wenn ich "Godzilla" haben will, dann kann das Programm auch nicht wissen, welche Verfilmung ich genau meine.
Und ich nehme an, dass die ebenfalls die Inhalte direkt aus der Homepage parsen - d.h. nach der nächsten Umstellung ist auch alles weg.

Oder arbeiten sie mit mir noch nicht bekannten Tricks?
 

eRaaaa

Top Contributor
themoviedb.org is a free and open movie database. It's completely user driven by people like you. TMDb is currently used by millions of people every month and with our and powerful API, also used by many popular media centers like Moovida, XBMC, Plex, MythTV and MediaPortal.

Und dass die API nicht wissen kann welchen der Filme du jetzt meinst ist klar. Ich kenne eure Anwendungen ja nicht, aber du wirst dieses Problem immer haben. Dann eher doch so etwas wie: IMDB API
[...]This service is updated every day from the IMDB data files [...]

Also ich würde meinen Usern nicht antun wollen, dass sie sich die ID selbst heraussuchen müssen, das würde den Sinn ja fast zu Nichte machen, dann kann er die Infos auch direkt von deren Homepage ablesen / kopieren what ever. Dann halt lieber alle Ergebnisse anzeigen und der User kann selbst entscheiden welchen der Filme er meint, evtl. sortiert nach Jahr oder so.

Ansonsten könnte man sich solche Infos auch von Amazon und co holen (auch über APIs ???:L )
 

darekkay

Bekanntes Mitglied
Hm, wenn themoviedb ebenfalls immer die Textdateien benutzt, dann wäre das in der Tat eine gute Lösung (angenommen, die Seite macht nicht dicht ^^). Ich werd mich dann mal demnächst schlau machen.

Also ich würde meinen Usern nicht antun wollen, dass sie sich die ID selbst heraussuchen müssen,
Na das sowieso. Ich habe doch gesagt, dass ich an einer Suche arbeite, diese bloß nicht fertig ist. So muss man bis jetzt entweder die gesamte URL, oder eben die ID kennen ;)

Der TO wollte ja eigentlich nur die Bewertung haben, da reichen die paar Zeilen Code aus und man muss sich nicht mit API's rumschlagen.
 

Scar47

Aktives Mitglied
gut wäre wertung und genre.
ich werde mal gucken wie ich das realisiere... das problem ist, das nen programm basteln will, wo ich nen file einfüge und der mit dann ahnad des filmanens (filmname) dann das teil in ne liste schreibt, der filmname soll aber noch ergänzt werden mit wertung und genre, eventuell noch das jahr aber ich glaubedas lasse ich weg.
daher ist das problem, das der user eig nur den namen per file eingibt, und ne andere möglichkeit da filem ein zu fügen ist über ne textliste in der nur die namen stehen.
wenn der user dann 50 filme per textliste einfügt, dann würde er ja erschlagen werden mit fragen welcher film gemeint ist xD
kann man es nciht so machen, das der einfach die neuste verfilmung nimmt?
ich meine dann treten zwa fehler auf, aber die sind ja in der regel gering und dann könnte man die über das manuelle einfüge system ersetzen.
so viele sind das ja nicht die doppelt und dreifach verfilmt wurden, und in der regel sollen es ja die neuen filme sein.
 

darekkay

Bekanntes Mitglied
Klar, du könntest einfach den "treffendsten" Eintrag nehmen. Du musst nämlich nicht nur gleiche Namen, sondern auch ähnliche Namen beachten. Wenn ein Benutzer einen Film eingibt, den es so nicht gibt, wird ja auch eine Liste mit den naheliegenden Treffern angezeigt. Und ja, man könnte dann einfach immer den ersten Eintrag nehmen, wenn dich diese Lösung zufriedenstellt ;)
 

StupidAttack

Bekanntes Mitglied
Da ich mich auch gerade nach einer IMDB API umsehe, kann ich zu dem oben genannten Link sagen, dass leider nur 30 Requests/Stunde oder so möglich sind...

Wenn ihr mögt stell ich euch meine Connections Klassen zur Verfügung. Die sind Multithreaded. Und funktionieren über Proxys. Also könnt ihr meinetwegen 500 Requsts pro Minute "abfeuren"...
Bei Interesse einfach melden...
 

Scar47

Aktives Mitglied
30 ist jetzt zwar nicht soo viel, aber das ist okay...ist immerhin ein anfang.
ich bin erst in der 12 und wollte in meiner facharbet so etwas einbauen. ich wollte das programm danach vill selber nutzen-ich weiß nur nicht ob das dann alles so viel wird. also ich würde eig schon gerne die genre zum film aus dem internet holen...ich würde sonst auch die wertung erstmal weg lassen und dann manuell eine persöhnliche wertung einstellen lassen. ich würde hlt nur gerne iwo die verbindung zum internet haben und das genre halt auch, damit man weiß was auf einen zu kommt :D , also film technisch :D
(wenn ich das von einem von euch kopiere dann würd ich das natürlich in diearbeit rein schreiben)
 

Scar47

Aktives Mitglied
Habe mcih da etwas umentshcieden, da hier wohl niemand etwas der Gleichen macht, und ich davon überhaupt keine ahnugn habe. habe nen anderes thema eröffnet, das etwas allgemeiner ist und ich hoffe einfacher zu realisieren wie das hier geforderte.
danke trpzdem für eure hilfe
 

Neue Themen


Oben