# Internetabfrage



## Scar47 (1. Jan 2011)

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


----------



## Marco13 (1. Jan 2011)

Sowas wie http://www.java-forum.org/netzwerkprogrammierung/90025-java-frame-yahoos-babelfish.html#post569369 könnte ein Einstieg sein.


----------



## Scar47 (2. Jan 2011)

hab mir das mal angesehen. ich bin ehrlich-ich checke nichts 
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


----------



## eRaaaa (2. Jan 2011)

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 (2. Jan 2011)

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 (2. Jan 2011)

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


----------



## darekkay (5. Jan 2011)

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


----------



## Scar47 (6. Jan 2011)

okay danke ich überlegs mir.


----------



## darekkay (8. Jan 2011)

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:


```
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


----------



## Scar47 (10. Jan 2011)

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?


----------



## darekkay (12. Jan 2011)

So kannst du die Genres auslesen:


```
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 (12. Jan 2011)

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


----------



## darekkay (12. Jan 2011)

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 (12. Jan 2011)

> 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 (12. Jan 2011)

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.



eRaaaa hat gesagt.:


> 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 (14. Jan 2011)

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 (14. Jan 2011)

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


----------



## Scar47 (15. Jan 2011)

ja das würde mir reichen


----------



## StupidAttack (19. Jan 2011)

darekkay hat gesagt.:


> 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...


----------



## uterzna123 (19. Jan 2011)

StupidAttack hat gesagt.:


> 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...



ist das noch im sinne von imdb


----------



## Scar47 (19. Jan 2011)

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  , also film technisch 
(wenn ich das von einem von euch kopiere dann würd ich das natürlich in diearbeit rein schreiben)


----------



## StupidAttack (19. Jan 2011)

uterzna123 hat gesagt.:


> ist das noch im sinne von imdb



nöö...

ich denke aber nicht, dass, sagen wir mal 1000 requests pro Stunde den Server irgendwie "stören"...Wahrscheinlich steht das ganze unter Copyright, aber auch ein langsames Saugen der Daten ist "illegal"- Das rechtfertigt nichts, ich weiss, aber das ist mir egal...In diesem Sinne hast du vollkommen recht...


----------



## Scar47 (28. Jan 2011)

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


----------

