Avatar billede cro1984 Nybegynder
30. marts 2004 - 15:13 Der er 21 kommentarer

Program der opretter forbindelse til imsb databasen

Hi

Jeg vil gerne lave et program, hvor man ved indtastning af en film titel, opretter forbindelse til imdb databasen www.imdb.com skal den søge efter alle mulige titler der hører til søgningen,  altså give en liste over søgningen.
Når man så har fundet den film man nu har søgt efter, og klikker OK, skal alle oplysninger fra Imdb hentes og lagres i en fil.

Jeg har kigget lidt rundt på nettet og fundet http://www.torry.net/vcl/internet/other/imdbimport.zip. Den giver gode kode forklaringer, men kan ikke få den til at virke.
Men det er præcis noget lignende jeg taler om!

Desuden kunne jeg godt tænke mig at høre, om der er gode artikler om opkobling til databaser på nettet (imdb, mysql osv.)?
Avatar billede cro1984 Nybegynder
30. marts 2004 - 15:25 #1
Et andet, mere simpel køreklar program kan være http://twtelecom.dl.sourceforge.net/sourceforge/movare/Movare0.1Alpha.zip
Avatar billede cro1984 Nybegynder
30. marts 2004 - 15:26 #2
Avatar billede vallemanden Nybegynder
30. marts 2004 - 22:51 #3
det største problem med imdb er at deres database er lavet til og i pearl, så udmidbart kan man ikke connecte til den, man kan dog helte en side og ligge den i en tekst fil og så få delphi til at hente dataerne i den, det gør jeg!
MySQL er MEGA nem at conecte til over nettet :-), der findes flere componenter til dette, en af de bedste jeg har prøvet(og jeg har prøvet en del) er den som www.scibit.com har lavet
Avatar billede cro1984 Nybegynder
30. marts 2004 - 23:22 #4
Dvs. at programmet fx. movare fra http://prdownloads.sourceforge.net/movare/Movare0.1Alpha.zip?download  bygger på det den forståelse, at den først connector til en MySQL server derefter imdb ?

Det skal lige siges at jeg aldrig sådan rigtig har leget med databaser i delphi før - kender dog en del til Mysql. Kører jeg af vildsporet eller er det noget der kan lade sig gi sig - med hjælp fra eksperten :D ?
Avatar billede vallemanden Nybegynder
30. marts 2004 - 23:24 #5
Jeg kender den ikke lige, hvad er deres adr? (ikke download)
Avatar billede cro1984 Nybegynder
30. marts 2004 - 23:26 #6
jeg mener ik de har noget adr. - bare en eller anden, der har lavet et lille program!
Avatar billede vallemanden Nybegynder
30. marts 2004 - 23:29 #7
Har kigget på det, det køre i en XML database
http://sourceforge.net/projects/movare/
Avatar billede cro1984 Nybegynder
30. marts 2004 - 23:32 #8
Problemet er bare hvordan jer kommer igang med programmeringen - hvordan jeg connector mm.
Avatar billede vallemanden Nybegynder
30. marts 2004 - 23:33 #9
jeg kan kun hjælpe dig med MySQL, access, Paradox o.lin.
Avatar billede vallemanden Nybegynder
30. marts 2004 - 23:35 #10
men man skulle måske gå på jagt efter et program der kan konvatere deres pearl database til MySQL, for så vil jeg have en MySQL version af den liggende på min webserver
Avatar billede cro1984 Nybegynder
30. marts 2004 - 23:40 #11
Det ville jo være smart - spørgsmålet er bare hvorfor de bruger pearl?
Men hvis jeg nu lige vender tilbage til kodningen - kan jeg tage det først program (m. source) som eks. og spørge hvorfor det ikke virker ?


unit IMDBImport;

interface

uses SysUtils, UrlMon, Classes;

const
  TempFilename : ShortString = 'imdbtemp.###'#0;

type
  TIMDBImport = Class
  public
    // Movie info fields
    Title,
    Year,
    Director,
    Rating,
    Genre : ShortString;

    // Will contain search results for more than one movie
    SearchResults : TStringList;

    // Will contain the URLs for search results
    SearchResultsURLS : TStringList;

    // After execute, will become true if found a movie, and false if found more than one result
    FoundMovieInfo : Boolean;

    Constructor Create;
    Destructor Destroy; override;

    Function Execute : Boolean;
    Function GetMovieFromSearchResults(const Index : Integer) : Boolean;
  private
    // Will containt the downloaded file
    FileStrings : TStringList;

    // Will contain the current line used
    LineIndex : Integer;

    Procedure Init;
    Function DownloadToFile(URL : ShortString) : Boolean;
    Procedure GoToLine(Str : ShortString; const FromLine : Integer);
    Procedure AnalyzeSearchResultsPage;
    Procedure AnalyzeMoviePage;
  end;

implementation

Constructor TIMDBImport.Create;
Begin
  SearchResults := TStringList.Create;
  FileStrings := TStringList.Create;
  SearchResultsURLS := TStringList.Create;
end;

Destructor TIMDBImport.Destroy;
Begin
  SearchResults.Free;
  FileStrings.Free;
  SearchResultsURLS.Free;
end;

// Initialize variables
Procedure TIMDBImport.Init;
Begin
  SearchResults.Clear;
  FileStrings.Clear;
  SearchResultsURLS.Clear;
  Genre := '';
  Director := '';
  Year := '';
  Rating := '';
end;

// Skips lines in FileStrings until a line containing Str starting at FromLine
Procedure TIMDBImport.GoToLine(Str : ShortString; const FromLine : Integer);
Begin
  Str := UpperCase(Str);
  LineIndex := FromLine;
  With FileStrings Do
  Begin
    While (LineIndex < Count) and (Pos(Str, UpperCase(Strings[LineIndex])) = 0) Do  // Until no more lines or found what we're looking for
      LineIndex := LineIndex + 1;
    if LineIndex = Count then
      LineIndex := -1;                                                      // Line not found. Reset the index
  end; {With}
end;

// Downloads the page at URL to the file names TempFilename
Function TIMDBImport.DownloadToFile(URL : ShortString) : Boolean;
begin
  URL := URL + #0;
  try
    Result := UrlDownloadToFile(nil, @URL[1], @TempFilename[1], 0, nil) = 0;
    FileStrings.LoadFromFile(TempFilename);          // Load the html file downloaded
  except
    Result := False;
    FileStrings.Clear;
  end;
end;

// Start the search and download. Returns true if all went ok
Function TIMDBImport.Execute : Boolean;
Begin
  Result := False;                        // Assume it's bad
  Init;                                  // Initialize
  if Title = '' then Exit;                // No movie title to search for
  if not DownloadToFile('http://us.imdb.com/Tsearch?title=' + Title) then Exit;        // try download the search page from IMDB

  With FileStrings Do
  Begin
    GoToLine('<TITLE>', 0);
    if Pos('>IMDB', UpperCase(Strings[LineIndex])) > 0 then  // Found the line '<TITLE>IMDb name and title search</TITLE>'
      AnalyzeSearchResultsPage            // Process this page as a search results page
    else
    if Pos('<TITLE>THE', UpperCase(Strings[LineIndex])) > 0 then      // Got the "no results" page
      FoundMovieInfo := False
    else
      AnalyzeMoviePage;                  // Process this page as a move info page
  end;
  DeleteFile(TempFilename);
  Result := True;                        // It probably didn't crush
end;

// Analyzes a search results page from IMDB and places the results in SearchResults and SearchResultsURLs
Procedure TIMDBImport.AnalyzeSearchResultsPage;
var
  Temp : ShortString;
  I : Byte;
Begin
  FoundMovieInfo := False;                                  // Found many results
  GoToLine('"mov">Movies', 0);                              // Find where the big list starts
  if LineIndex = -1 then Exit;                              // Not a search result page
  With FileStrings Do
  try
    LineIndex := LineIndex + 1;                              // Skip this line
    Repeat
      Temp := Strings[LineIndex];
      I := Pos('/TITLE', UpperCase(Temp));
      System.Delete(Temp, 1, I - 1);                        // Delete all before the /Title?4539730
      I := Pos('"', Temp);
      SearchResultsURLS.Add('http://us.imdb.com' + Copy(Temp, 1, I - 1));          // Copy the link to the movie match
      System.Delete(Temp, 1, I + 1);                        // Delete the /Title?4539730 part and the " after it
      I := Pos('<', Temp);
      SearchResults.Add(Copy(Temp, 1, I - 1));              // Copy the movie match title
      GoToLine('/title', LineIndex + 1);                    // Find the next movie in the list
    Until (LineIndex = -1) or (Pos('</OL>', Strings[LineIndex]) > 0);    // Until the end of the list or the file
    Clear;                                                  // Clear the rest of the file
  except
      On EStringListError Do;
  end; {try}
end;

// Downloads and process a movie from the SearchResults using Index.
// Returns true if download went ok
Function TIMDBImport.GetMovieFromSearchResults(const Index : Integer) : Boolean;
Begin
  FoundMovieInfo := False;                                    // Assume it doesn't go well
  Result := False;
  if Index > SearchResults.Count - 1 then Exit;                // Out of range
  if not DownloadToFile(SearchResultsURLs[Index]) then Exit;  // Error downloading the movie info page
  AnalyzeMoviePage;                                            // Analyze the movie's info page
  FoundMovieInfo := True;                                      // It went ok
  Result := True;
end;

// Processes the movie's info page and extracts the info
Procedure TIMDBImport.AnalyzeMoviePage;
var
  P : Byte;                                                  // Temp for Pos
  TempS : ShortString;
Begin
  FoundMovieInfo := True;                                      // Found a movie's info
  With FileStrings Do
  Begin
    // Title and year
    GoToLine('<TITLE>', 0);                                    // The title looks like this: <title>100 Girls (2000)</title>
    if LineIndex > -1 then
      Begin
        P := Pos('(', Strings[LineIndex]);
        Title := Copy(Strings[LineIndex], 8, P - 2);          // Copy the title without the space and the '('
        Year := Copy(Strings[LineIndex], P + 1, 4);            // Copy the year without the '('
      end
    else                                                      // No movie found
      Begin
        Init;                                                  // Reset all movie info
        Exit;
      end;

    // Director
    GoToLine('Directed by', LineIndex);                        // Find the director part. It's always after the title
    if LineIndex > -1 then
    Begin
      P := Pos('">', Strings[LineIndex]);                      // <a href="/Name?Davis,%20Michael%20(II)">Michael Davis (II)</a><br>
      Director := Copy(Strings[LineIndex], P + 2, Pos('</a>', Strings[LineIndex]) - P - 2);  // Copy director's name
    end;

    // Genre
    GoToLine('"ch">Genre:', 0);                                // Find the genre part
    if LineIndex > -1 then
    Begin
      LineIndex := LineIndex + 1;
      TempS := Strings[LineIndex];
      While True Do
      Begin
        P := Pos('">', TempS);                                // <a href="/Sections/Genres/Comedy/">Comedy</a>
        if (TempS[P + 2] = '(') or (P = 0) then Break;        // No more genres. Found the (more)
        if Genre <> '' then
          Genre := Genre + ', ';                              // Add a comma if there's something already in there
        System.Delete(TempS, 1, P + 1);
        P := Pos('</a>', TempS);
        Genre := Genre + Copy(TempS, 1, P - 1);                // Copy current genre and add it
        System.Delete(TempS, 1, P - 1);
      end; {While}
    end; {if}

    //Rating
    GoToLine('/10', 0);                                        // Find rating
    if LineIndex > -1 then
    Begin
      P := Pos('>', Strings[LineIndex]);
      Rating := Copy(Strings[LineIndex], P + 1, Pos('/', Strings[LineIndex]) - P - 1);
(* If you want the rating as an integer:
      try
        // <b>6.0/10</b> (1,444 votes)
        // Rating := Round(StrToFloat(Copy(Strings[LineIndex], P + 1, Pos('/', Strings[LineIndex]) - P - 1)));
      except
        on EConvertError Do
          Rating := 0;
      end;
*)
    end; {if}
  end; {With}
end;

end.
Avatar billede vallemanden Nybegynder
30. marts 2004 - 23:44 #12
Det virker også fint prøv at søge på T3
Avatar billede vallemanden Nybegynder
30. marts 2004 - 23:57 #13
hvilken version af delphi køre du??
Avatar billede cro1984 Nybegynder
31. marts 2004 - 08:24 #14
Jeg bruger Delphi 3 og 7
Avatar billede cro1984 Nybegynder
31. marts 2004 - 08:27 #15
OK nu kan jeg godt se det - Jeg prøvede med Blade også mange andre uden resultat.
Avatar billede cro1984 Nybegynder
31. marts 2004 - 15:39 #16
Hvis mam nu programmerer videre på programmet, hvordan skulle man så lave en listbox af alle titler der kan forbindes med fx. "blade" ? Der findes jo en masse titler der vil kunne gå ind under søgningen, som programmet skal tage højde for! Det  gør den nemlig ik - søgen giver intet resultat!
Derefter vælger man den film og gemmer TITEL, GENRE mm. i en fil (ini, xml o.lig.) som man kan holde styr på i programmet!
Avatar billede vallemanden Nybegynder
31. marts 2004 - 15:47 #17
jeg gør det på denne måde
      ListBox1.Items.Assign(MyIMDBImport.SearchResults);
Avatar billede vallemanden Nybegynder
28. april 2004 - 17:58 #18
har du fundet ud af det?, jeg har en køreklar unit klar
Avatar billede vallemanden Nybegynder
01. juni 2004 - 06:39 #19
måske på tide at lukke dit spg
Avatar billede vallemanden Nybegynder
28. juni 2004 - 12:19 #20
hmmm
Avatar billede vallemanden Nybegynder
04. november 2004 - 15:42 #21
HMMMM måske er det på tide at lukke dette spg
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester