我想使用 OpenSubtitles API 下载电影的字幕,但在任何地方都找不到完整的工作示例。我发现的唯一一件事是:
http://www.yanniel.info/2012/01/open-subtitles-api-in-delphi.html
我做了这里所说的一切,但它是不完整的。我登录并找到字幕但不知道如何最终下载文件?
编辑:这是我到目前为止所做的;
unit OpensubtitlesAPI;
interface
uses
IdHTTP, Classes, SysUtils;
function LogIn(aUsername, aPassword,
aLanguage, aUserAgent: string): string;
function LogOut(aToken: string): string;
function SearchSubtitles(aToken, aSublanguageID,
aMovieHash: string;
aMovieByteSize: Cardinal): string; overload;
function SearchSubtitles(aToken, aSublanguageID: string;
aImdbID: Cardinal): string; overload;
function SearchSubtitles(aToken, aSublanguageID,
aQuery: string): string; overload;
implementation
function XML_RPC(aRPCRequest: string): string;
const
cURL= 'http://api.opensubtitles.org/xml-rpc';
var
lHTTP: TIdHTTP;
Source,
ResponseContent: TStringStream;
begin
lHTTP := TIdHTTP.Create(nil);
lHTTP.Request.ContentType := 'text/xml';
lHTTP.Request.Accept := '*/*';
lHTTP.Request.Connection := 'Keep-Alive';
lHTTP.Request.Method := 'POST';
lHTTP.Request.UserAgent := 'OS Test User Agent';
Source := TStringStream.Create(aRPCRequest);
ResponseContent:= TStringStream.Create;
try
try
lHTTP.Post(cURL, Source, ResponseContent);
Result:= ResponseContent.DataString;
except
Result:= '';
end;
finally
lHTTP.Free;
Source.Free;
ResponseContent.Free;
end;
end;
function LogIn(aUsername, aPassword, aLanguage, aUserAgent: string): string;
const
LOG_IN = '<?xml version="1.0"?>' +
'<methodCall>' +
' <methodName>LogIn</methodName>' +
' <params>' +
' <param>' +
' <value><string>%0:s</string></value>' +
' </param>' +
' <param>' +
' <value><string>%1:s</string></value>' +
' </param>' +
' <param>' +
' <value><string>%2:s</string></value>' +
' </param>' +
' <param>' +
' <value><string>%3:s</string></value>' +
' </param>' +
' </params>' +
'</methodCall>';
begin
//TODO: XML Encoding
Result:= XML_RPC(Format(LOG_IN, [aUsername, aPassword, aLanguage, aUserAgent]));
end;
function LogOut(aToken: string): string;
const
LOG_OUT = '<?xml version="1.0"?>' +
'<methodCall>' +
' <methodName>LogOut</methodName>' +
' <params>' +
' <param>' +
' <value><string>%0:s</string></value>' +
' </param>' +
' </params>' +
'</methodCall>';
begin
//TODO: XML Encoding
Result:= XML_RPC(Format(LOG_OUT, [aToken]));
end;
function SearchSubtitles(aToken, aSublanguageID, aMovieHash: string; aMovieByteSize: Cardinal): string;
const
SEARCH_SUBTITLES = '<?xml version="1.0"?>' +
'<methodCall>' +
' <methodName>SearchSubtitles</methodName>' +
' <params>' +
' <param>' +
' <value><string>%0:s</string></value>' +
' </param>' +
' <param>' +
' <value>' +
' <array>' +
' <data>' +
' <value>' +
' <struct>' +
' <member>' +
' <name>sublanguageid</name>' +
' <value><string>%1:s</string>' +
' </value>' +
' </member>' +
' <member>' +
' <name>moviehash</name>' +
' <value><string>%2:s</string></value>' +
' </member>' +
' <member>' +
' <name>moviebytesize</name>' +
' <value><double>%3:d</double></value>' +
' </member>' +
' </struct>' +
' </value>' +
' </data>' +
' </array>' +
' </value>' +
' </param>' +
' </params>' +
'</methodCall>';
begin
//TODO: XML Encoding
Result:= XML_RPC(Format(SEARCH_SUBTITLES, [aToken, aSublanguageID, aMovieHash, aMovieByteSize]));
end;
function SearchSubtitles(aToken, aSublanguageID: string;
aImdbID: Cardinal): string;
const
SEARCH_SUBTITLES = '<?xml version="1.0"?>' +
'<methodCall>' +
' <methodName>SearchSubtitles</methodName>' +
' <params>' +
' <param>' +
' <value><string>%0:s</string></value>' +
' </param>' +
' <param>' +
' <value>' +
' <array>' +
' <data>' +
' <value>' +
' <struct>' +
' <member>' +
' <name>sublanguageid</name>' +
' <value><string>%1:s</string>' +
' </value>' +
' </member>' +
' <member>' +
' <name>imdbid</name>' +
' <value><string>%2:d</string></value>' +
' </member>' +
' </struct>' +
' </value>' +
' </data>' +
' </array>' +
' </value>' +
' </param>' +
' </params>' +
'</methodCall>';
begin
//TODO: XML Encoding
Result:= XML_RPC(Format(SEARCH_SUBTITLES, [aToken, aSublanguageID, aImdbID]));
end;
function SearchSubtitles(aToken, aSublanguageID,
aQuery: string): string;
const
SEARCH_SUBTITLES = '<?xml version="1.0"?>' +
'<methodCall>' +
' <methodName>SearchSubtitles</methodName>' +
' <params>' +
' <param>' +
' <value><string>%0:s</string></value>' +
' </param>' +
' <param>' +
' <value>' +
' <array>' +
' <data>' +
' <value>' +
' <struct>' +
' <member>' +
' <name>sublanguageid</name>' +
' <value><string>%1:s</string>' +
' </value>' +
' </member>' +
' <member>' +
' <name>query</name>' +
' <value><string>%2:s</string></value>' +
' </member>' +
' </struct>' +
' </value>' +
' </data>' +
' </array>' +
' </value>' +
' </param>' +
' </params>' +
'</methodCall>';
begin
//TODO: XML Encoding
Result:= XML_RPC(Format(SEARCH_SUBTITLES, [aToken, aSublanguageID, aQuery]));
end;
end.
最后,我使用 C++ Builder 进行下一步操作:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
UnicodeString response = LogIn("", "", "en", "OS Test User Agent");
XMLDocument1->XML->Text = response;
XMLDocument1->Active = true;
UnicodeString token = XMLDocument1->ChildNodes->Nodes[1]->GetChildNodes()->Nodes[0]->
GetChildNodes()->Nodes[0]->GetChildNodes()->Nodes[0]->
GetChildNodes()->Nodes[0]->GetChildNodes()->Nodes[0]->
GetChildNodes()->Nodes[1]->GetChildNodes()->Nodes[0]->
GetText();
Memo1->Text = SearchSubtitles(token, "en", "7d9cd5def91c9432", 735934464);
LogOut(token);
}
当我执行此操作时,我得到如下响应:
<?xml version="1.0" encoding="utf-8"?>
<methodResponse>
<params>
<param>
<value>
<struct>
<member>
<name>status</name>
<value>
<string>200 OK</string>
</value>
</member>
<member>
<name>data</name>
<value>
<boolean>0</boolean>
</value>
</member>
<member>
<name>seconds</name>
<value>
<double>0.008</double>
</value>
</member>
</struct>
</value>
</param>
</params>
</methodResponse>
下一个是什么?如何获取文件(字幕)位置?谢谢。