[REL][EN] MyAnimeList - Anime Info

If you made a script you can offer it to the others here, or ask help to improve it. You can also report here bugs & problems with existing scripts.
Post Reply
FinderX
Posts: 29
Joined: 2010-05-03 09:30:44

[REL][EN] MyAnimeList - Anime Info

Post by FinderX »

*snore*
eh?... I'm tired... details later...
Hi

After a looong nap, here is the details of the script.

First of all, YES, I saw the script MyAnimeList (pic), because of that I know this site http://myanimelist.net/
THANKS baffab!

But I not found another script to get all the info from that site, so I created this script. It seems to me
much more complete and friendly instead of AnimeNetworks. Well that's my opinion.

Go to fields

Data are added as follows: field <- value
  • URL <- 'http://http://myanimelist.net/anime/' + AnimeID
    OriginalTitle <- Title
    TranslatedTitle <- Alternative Titles (English, Synonyms, Japanese)
    Director <- Type of Anime (TV, OVA, Special, Movie, etc)
    Disks <- Total Episodies
    Year <- Year of start aired only
    Productor <- Studio of Animation or Producers
    Source <- Genres (longer than the original)
    Description <- Synopsis
    Actors <- Additional info (Related Anime, Opening and Ending theme, FANSUBS)
    Comments <- Reviews
    Picture <- Allways search for larger picture, else for the thumbnail
I put a bit of formatting data.

Alternative Titles:The alternative titles are added together but in the same order -> ENGLISH, SYNONYMS, JAPANESE

Year: It is only the start year of the series/ova/movie.

Genres: The genres are in Source because there are many types for one anime.

Additional info: Ah... This, I think, is important, one of the few to suggest that fansub in "worldwide" are working in that serie/ova/movie.
This is stored in Actors and as follows:
  • [Related Anime]
    Prequel: ...
    Sequel: ...
    Syde Hystory:...
    ...

    [Opening Theme]
    #1...
    #2...
    ...

    [Ending Theme]
    #1...
    #2...
    ...

    [Fansubbing Groups]
    name - [tag]
    ...
Comments: Here are stored all the user reviews left on the page.
Is saved as follows:
  • user A:
    blablablablablablablablablablablablablablablabla
    blablablablablablablablablablablablablablablabla
    blablablablablablablablablablablablablablablabla
    and more blablablablablablablablablablablablabla
    blablablablablablablablablablablablablablablabla
    blablablablablablablablablablablablablablablabla
    blablablabla in the end I don't like this anime.
    ________________________________________________

    user B:
    Oh, why? blablablablablablablablablablablablabla
    blablablablablablablablablablablablablablablabla
    blablablablablablablablablablablablablablablabla
    then, blablablablablablablablablablablablablabla
    blablablablablablablablablablablablablablablabla
    blablablablablablablablablablablablablablablabla
    blablablablablablabla well... maybe you're right
    ________________________________________________

    user C:
    ...
Ok, now on bathmode.

This mode searches for the original title and compared against the first one it finds.
If the comparison rate is equal to or greater than the variable PERCENT (I will leave it in 75),
then Parses the page and follow with the next search.
Not for probability, is the first that satisfies the value of PERCENT.
It's used CompareWords(Str1,Str2):Integer and returns an integer between 0 and 100 (perfect match).

Along with this code I discovered a bug in UTF8Decode that when you enter accented characters translated by
HTMLDecode you get an empty string ('').
So in Comments, sometimes you see only the User but
no text. It's not my fault... (eh? Really! It's not my fault)

Is all


PD: This post was written in GOOGLish

Code: Select all

(***************************************************

Ant Movie Catalog importation script
www.antp.be/software/moviecatalog/

[Infos]
Authors=FinderX
Title=MyAnimeList
Description=Script for anime information in MyAnimeList.net
Site=http://myanimelist.net/
Language=EN-Anime
Version=1.0 @ 2010-05-24
Requires=3.5.0
Comments=
License=This program is free software; you can redistribute it and/or modify it under the  terms of the GNU General Public License as published by the Free Software Foundation;  either version 2 of the License, or (at your option) any later version. |
GetInfo=1

[Options]
BatchMode=0|0|0=Normal Mode|1=Batch Mode

***************************************************)

program MyAnimeList;

uses StringUtils7552;

const
    MyAnimeListURL = 'http://myanimelist.net/anime.php?q=';
   
var
    MovieName: string;
    BatchMode, Cancel, BM_MatchFind: boolean;
    NumResults, Percent: Integer;
    //inputPercent: string;

//------------------------------------------------

function funcHTMLRemoveTags(Str:string) : string;
begin
    HTMLRemoveTags(Str);
    result := Str;
end;

//------------------------------------------------

function funcHTMLDecode(Str:string) : string;
begin
    HTMLDecode(Str);
    result := Str;
end;

//------------------------------------------------

function ParserText(Text:string ; StartAt:string ; EndAt:string) : string;
begin
    if (Pos(StartAt, Text) > 0) then
        result := UTF8Decode(FullTrim(funcHTMLRemoveTags(funcHTMLDecode(TextBetween(Text,StartAt,EndAt)))))
    else
        result := '';
end;

//------------------------------------------------

procedure AnalyzeForVariuosPages(Address:string);
var
    pagePos, titlePos, page, totalPages: integer;
    strPage, nextAddress, addressPage: string;

begin
    strPage := GetPage(Address);
    pagePos := Pos('Pages (',strPage);
    PickTreeClear;
   
    if (pagePos > 0 ) then begin
        addressPage := TextBetween(strPage,'Pages','</div>');
        totalPages := StrToInt(TextBetween(addressPage,'(',')'),0);

        for page := 1 to totalPages do begin
            AnalyzePage(strPage);
            if (BM_MatchFind) then break;
            nextAddress := TextBetween(addressPage,'[' + IntToStr(page) + '] <a href="?q=','>');
            nextAddress := MyAnimeListURL + nextAddress;
            if (page < totalPages) then begin
                strPage := GetPage(nextAddress);
                addressPage := TextBetween(strPage,'Pages','</div>');
            end;
        end;
        
        ExecutePickTree;
       
    end else begin
    
        titlePos := Pos('<title>Anime - MyAnimeList.net</title>',strPage);
        if (titlePos > 0) then begin
            AnalyzePage(strPage);
            ExecutePickTree;
        end else begin
            Cancel := TRUE;
            AnalyzeMoviePage(strPage);
        end;
    end;

    PickTreeClear;
end;

//------------------------------------------------

procedure ExecutePickTree;
var
    address: string;
    
begin
    if (not BatchMode) then begin
        if (NumResults > 0) then begin
            if (PickTreeExec(address)) then begin
                Cancel := TRUE;
                AnalyzeMoviePage(address);
            end;
        end else
            ShowInformation('No search results for "' + MovieName + #13#10 + 'Try with another title');
    end;
end;

//------------------------------------------------

procedure AnalyzePage(PageStr:string);
var
    movieAddr, movieTitle, movieID: string;
    titleTag, title, animeAddr: string;
    titlePos, titleLine, compare: Integer;
    strPage: TStringList;

begin
    strPage := TStringList.Create;
    strPage.Text := PageStr;
    animeAddr := 'http://myanimelist.net/anime/';
    titleTag := '<a href="http://myanimelist.net/anime/';
    
    titleLine := FindLine(titleTag,strPage,0);
    
    while (titleLine > -1) do begin

        title := strPage.GetString(titleLine);
        titlePos := Pos('<strong>',title);
            
            if (titlePos > 0) then begin
                movieId := TextBetween(title,titleTag,'/');
                movieAddr := animeAddr + MovieId;
                movieTitle := ParserText(title,'<strong>','</strong>');
                
                if BatchMode then begin
                    compare := CompareWords(movieTitle,movieName);
                    if (Percent <= compare) then begin
                        AnalyzeMoviePage(movieAddr);
                        BM_MatchFind := TRUE;
                        break;
                    end;
                end;
                
                PickTreeAdd(UTF8Decode(movieTitle),movieAddr);
                NumResults := NumResults + 1;
            end;
            
        titleLine := FindLine(titleTag,strPage,titleLine + 1);
    end;
    
    strPage.Free;
end;

//------------------------------------------------

procedure AnalyzeMoviePage(Address:string);
var
    page: TStringList;
    lineNr, line, atPos, revLine, numRev: integer;
    reviewsAddress, pictureAddress, titleAlt: string;
    pictureTag, reviewsTag, userTag, groupTag: string;
    fansub, info, group, user, review, reviews: string;
    item, animeAddress, thumbPicture: string;

begin
    fansub := '<a href="http://myanimelist.net/fansub-groups.php?id=';
    pictureTag := '<a href="http://myanimelist.net/anime/';
    reviewsTag := '<a  href="http://myanimelist.net/anime/';  // the doble space is important
    animeAddress := 'http://myanimelist.net/anime/';
    thumbPicture := 'http://cdn.myanimelist.net/images/anime/';
    page := TStringList.Create;
    
    // URL
    item := Copy(Address,1,Length('http://'));
    atPos := Pos('http://',item);
    if (atPos = 1) then begin
        page.Text := GetPage(Address);
        SetField(fieldURL,Address);
    end else begin
        page.Text := Address;
        lineNr := FindLine(animeAddress,page,0);
        item := animeAddress + ParserText(page.GetString(lineNr),animeAddress,'/');
        SetField(fieldURL,item);
    end;
    
    
    // Original Title - Title
    lineNr := FindLine('<title>',page,0);
    SetField(fieldOriginalTitle,ParserText(page.GetString(lineNr),'<title>',' - MyAnimeList.net</title>'));
    
    
    // Picture Address
    lineNr := FindLine('pic&pid',page,lineNr);
    if (lineNr > -1) then
        pictureAddress := animeAddress + TextBetween(page.GetString(lineNr),pictureTag,'">')
    else begin
        lineNr := FindLine(thumbPicture,page,lineNr);
        pictureAddress := thumbPicture + TextBetween(page.GetString(lineNr),thumbPicture,'" alt="');
    end;

    
    // TranslatedTitle - Alternative Title(s)
    lineNr := FindLine('Alternative Titles',page,lineNr);
    item := page.GetString(lineNr);
    
    atPos := Pos('English:',item);
    if (atPos > 0) then
        titleAlt := ParserText(item,'English:','</div>');
    
    atPos := Pos('Synonyms:',item);
    if (atPos > 0) then begin
        if (titleAlt <> '') then titleAlt := titleAlt + ', ';
        titleAlt := titleAlt + ParserText(item,'Synonyms:','</div>');
    end;
    
    atPos := Pos('Japanese:',item);
    if (atPos > 0) then begin
        if (titleAlt <> '') then titleAlt := titleAlt + ', ';
        titleAlt := titleAlt + ParserText(item,'Japanese:','</div>');
    end;
        
    SetField(fieldTranslatedTitle,titleAlt);

    
    // Director - Type
    lineNr := FindLine('Type:',page,lineNr);
    SetField(fieldDirector,ParserText(page.GetString(lineNr),'Type:','</div>'));

    
    // Disks - Episodies
    lineNr := FindLine('Episodes:',page,lineNr);
    item := page.GetString(lineNr) + '¡¿@';
    SetField(fieldDisks,ParserText(item,'Episodes:','¡¿@'));

    
    // Year - Year 
    lineNr := FindLine('Aired:',page,lineNr);
    item := Copy(TextAfter(page.GetString(lineNr),', '),1,4);
    SetField(fieldYear,item);

    
    // Productor - Studio
    lineNr := FindLine('Producers:',page,lineNr);
    item := page.GetString(lineNr) + page.GetString(lineNr + 1);
    atPos := Pos('None found',item);
    if (atPos = 0)
        then item := ParserText(item,'Producers:','</div>')
        else item := '';
    SetField(fieldProducer,item);
    

    // Source - Genres
    lineNr := FindLine('Genres:',page,lineNr);
    item := page.GetString(lineNr) + page.GetString(lineNr + 1);
    SetField(fieldSource,AnsiMixedCase(ParserText(item,'Genres:','</div>'),' ,-'));

    
    // Reviews Address
    lineNr := FindLine(reviewsTag,page,lineNr);
    atPos := Pos('Reviews',page.GetString(LineNr));
    
    while (atPos = 0) do begin
        lineNr := FindLine(reviewsTag,page,lineNr + 1);
        atPos := Pos('Reviews',page.GetString(LineNr));
    end;

    reviewsAddress := animeAddress + TextBetween(page.GetString(lineNr),reviewsTag,'">');

    
    // Description - Synopsis
    lineNr := FindLine('<h2>Synopsis</h2>',page,lineNr);
    item := page.GetString(lineNr);
    atPos := Pos('</td>',item);
    while (atPos = 0) do begin
        lineNr := lineNr + 1;
        item := item + page.GetString(lineNr);
        atPos := Pos('</td>',item);
    end;
    
    item := StringReplace(item,'<br />',#13#10);
    SetField(fieldDescription,ParserText(item,'<h2>Synopsis</h2>','</td>'));
    
    
    // Number of Reviews, in reviews page
    lineNr := FindLine('More reviews',page,lineNr);
    item := TextBetween(page.GetString(lineNr),'(',')');
    numRev := StrToInt(item,0);
    
    
    // Actors - Additional information
    line := FindLine('Related Anime',page,lineNr);
    if (line > -1) then begin
        info := '[Related Anime]' + #13#10;
        item := page.GetString(line) + '¡¿@';
        item := StringReplace(item,'<br>',#13#10);
        info := info + ParserText(item,'Related Anime','¡¿@') + #13#10 + #13#10;
        lineNr := line;
    end;

    lineNr := FindLine('Opening Theme',page,lineNr);
    item := page.GetString(lineNr) + '¡¿@';
    atPos := Pos('No opening themes found',item);
    if (atPos = 0) then begin
        info := info + '[Opening Theme]' + #13#10;
        item := ParserText(item,'Opening Theme','¡¿@');
        item := StringReplace(item,'#',#13#10 + '#');
        info := info + FullTrim(item) + #13#10 + #13#10;
    end;

    lineNr := FindLine('Ending Theme',page,lineNr);
    item := page.GetString(lineNr) + '¡¿@';
    atPos := Pos('No ending themes found',item);
    if (atPos = 0) then begin
        info := info + '[Ending Theme]' + #13#10;
        item := ParserText(item,'Ending Theme','¡¿@');
        item := StringReplace(item,'#',#13#10 + '#');
        info := info + FullTrim(item) + #13#10 + #13#10;
    end;

    lineNr := FindLine(fansub,page,lineNr);
    if (lineNr > -1) then
        info := info + '[Fansubbing Groups]' + #13#10;

    while (lineNr > -1) do begin
        group := TextBefore(page.GetString(lineNr),'</a>','') + '¡¿@';
        info := info + ParserText(group,'>','¡¿@');
        groupTag := ParserText(page.GetString(lineNr),'<small>','</small>');
        item := Copy(groupTag,1,1);
        if (CompareWords(item,'[') = 100) then
            info := info + ' - ' + groupTag;
        info := info + #13#10;
        lineNr := FindLine(fansub,page,lineNr + 1);
    end;
    
    SetField(fieldActors,FullTrim(info));
    
    
    // Comments - Reviews
    if (numRev > 0) then begin
        // Destroy Details Page
        page.Free;
        
        // Create Reviews Page
        page := TStringList.Create;
        page.Text := GetPage(reviewsAddress);
    end;
    
    userTag := '<a href="http://myanimelist.net/profile/';
    lineNr := FindLine(userTag,page,0);
    
    while (lineNr > -1) do begin
        user := page.GetString(lineNr);
        atPos := Pos('<br />',user);
        
        if (atPos > 0) then begin
            user := ParserText(user,'">','</a>');
            reviews := reviews + user + ':' + #13#10 + #13#10;
            revLine := FindLine('</table>',page,lineNr);
            
            repeat
                atPos := Pos(#9#9 + '</div>',page.GetString(revLine + 1));
                
                if (atPos = 1) then begin
                    
                    repeat
                        review := review + page.GetString(revLine);
                        atPos := Pos('<div>',page.GetString(revLine));
                        revLine := revLine + 1;
                    until (atPos > 0);
                    
                    review := StringReplace(review,'<br />',#13#10);
                    review := StringReplace(review,'read more</a>',' ');
                    review := ParserText(review,'</table>','<div>');
                    reviews := reviews + review + #13#10;
                    reviews := reviews + StringOfChar('_',120) + #13#10 + #13#10;
                    review := '';
                    break;
                end;
                
                revLine := FindLine('</table>',page,revLine + 1);
            until (revLine = -1);
        
        end;
        
        lineNr := FindLine(userTag,page,lineNr + 1);
    end;
    
    SetField(fieldcomments,FullTrim(reviews));
    
    
    // Destroy Details or Reviews Page
    page.Free;
    
    
    // Picture
    atPos := Pos(thumbPicture,pictureAddress);
    if (atPos > 0) then
        GetPicture(pictureAddress)
    else begin
    
        // Create Picture Page
        page := TStringList.Create;
        page.Text := GetPage(pictureAddress);
        pictureTag := '<table id="dialog"';

        lineNr := FindLine(pictureTag,page,0);
        pictureAddress := TextBetween(page.GetString(lineNr),'<img src="','">');
        GetPicture(pictureAddress);
    
        // Destroy Picture Page
        page.Free;
    end;
end;

//----------------------MAIN-PROGRAM-------------------------


begin
    if (CheckVersion(3,5,0)=FALSE) then begin
      ShowWarning('Required Ant Movie Catalog version 3.5 or higher');
      EXIT;
    end;
   
    NumResults := 0;
    Cancel := FALSE;
    BM_MatchFind := FALSE;
    BatchMode := GetOption('BatchMode') = 1;
    Percent := 75;  // 100 = title perfect match
    MovieName := GetField(fieldOriginalTitle);
   
    if (MovieName = '') then
        MovieName := GetField(fieldTranslatedTitle);

    if (BatchMode) then begin
        //inputPercent := IntToStr(Percent);
        //Input('Percentage of the title', 'Percentage:', inputPercent);
        //Percent := StrToInt(inputPercent,0);
        AnalyzeForVariuosPages(MyAnimeListURL + UrlEncode(MovieName));
    
    end else begin
    
        repeat
            if (Input('MyAnimeList', 'Search:', MovieName)) then
                AnalyzeForVariuosPages(MyAnimeListURL + UrlEncode(MovieName))
            else
                Cancel := TRUE;
        until Cancel;
        
    end;
end.
Last edited by FinderX on 2010-05-25 02:47:18, edited 2 times in total.
antp
Site Admin
Posts: 9652
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Post by antp »

There is already a script for that site, but I guess yours is more complete then?
FinderX
Posts: 29
Joined: 2010-05-03 09:30:44

Post by FinderX »

That's right

I saw the MyAnimeList(pic) script but is only for pictures, then I create this.

If there confusion, please change the name of the script.

I'm finishing details of the descriptions of the output, when is over I edit my first post.
baffab
Posts: 339
Joined: 2005-12-22 09:33:25
Contact:

Post by baffab »

We can used only this one which is more complete for this site. I did the first version for picture only because I use another site for the infos (animenewsnetwork + animeka) and the pictures for these sites don't please me.
antp
Site Admin
Posts: 9652
Joined: 2002-05-30 10:13:07
Location: Brussels
Contact:

Re: [REL][EN] MyAnimeList - Anime Info

Post by antp »

FinderX wrote:It's not my fault... (eh? Really! It's not my fault)
Actually it is :p But that's discussed on another topic :D
I'll wait that you fix the problem then
FinderX
Posts: 29
Joined: 2010-05-03 09:30:44

Post by FinderX »

Problems FIXED and ADDED new features in my new version

Please check a look

viewtopic.php?t=4636
Post Reply