Hi*snore*
eh?... I'm tired... details later...
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
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]
...
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:
...
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.