Javascript でファイルの正しい OpenSubtitles ハッシュ コードを計算しようとしていますが、大きなファイルの場合は正しく機能しません。ファイルのサイズに問題があると思います (オーバーフロー)。ソース コードを含む OpenSubtitles ハッシュについては、http://trac.opensubtitles.org/projects/opensubtitles/wiki/HashSourceCodes で説明しています。
このコードをダミー RAR ファイル (解凍) でテストしています - http://www.opensubtitles.org/addons/avi/dummy.rar、正しい結果は61f7751fc2a72bfb ですが、このコードは61f7751ec2a72bfbを返します- したがって、いくつかのエラーがあります。Javascriptが苦手です。また、他の人にも同様の問題があることがわかりました: http://forum.opensubtitles.org/viewtopic.php?f=8&t=13243そして多分これはうまくいきます: https://github.com/ka2er/node-opensubtitles-api/blob/ master/lib/opensubtitles.js
質問は、何を変更する必要があるので、正しいハッシュを取得できますか? ありがとう。
function binl2hex(a)
{
var b = 255;
a[1] += a[0] >> 8;
a[0] = a[0] & b;
a[2] += a[1] >> 8;
a[1] = a[1] & b;
a[3] += a[2] >> 8;
a[2] = a[2] & b;
a[4] += a[3] >> 8;
a[3] = a[3] & b;
a[5] += a[4] >> 8;
a[4] = a[4] & b;
a[6] += a[5] >> 8;
a[5] = a[5] & b;
a[7] += a[6] >> 8;
a[6] = a[6] & b;
a[7] = a[7] & b;
for (var d = "0123456789abcdef", e = "", c = 7; c > -1; c--)
e += d.charAt(a[c] >> 4 & 15) + d.charAt(a[c] & 15);
return e
}
$(document).ready(function()
{
jQuery.event.props.push('dataTransfer');
$('#search_field').bind('drop', function(e)
{
var files = e.dataTransfer.files;
$.each(files, function(index, file)
{
if(files.length > 1)
{
$('#top_msg').attr('class', 'msg warn');
$('#top_msg').html('multiple files are <b>not supported</b> (yet)');
return false;
}
if (!files[index].type.match('video.*') && !files[index].name.match(/\.(mkv)$/i))
{
//|| !files[index].name.match('/mkv/i')
$('#top_msg').attr('class', 'msg warn');
$('#top_msg').html('search works only for <b>video</b> files.');
return false;
}
$('#top_msg').html('<b>File upload and hashing in progress</b>...');
$('#top_msg').attr('class', 'msg indicator');
var b = 65536;
fs = file.size;
var e = Array(8);
for (var a = fs, f = 0; f < 8; f++)
{
e[f] = a & 255;
a = a >> 8
}
a = fs;
var c = file.slice(0, b);
var g = new FileReader;
g.onloadend = function (h)
{
if (h.target.readyState == FileReader.DONE)
{
for (var f = h.target.result, d = 0; d < f.length; d++)
e[(d + 8) % 8] += f.charCodeAt(d);
c = file.slice(a - b);
var g = new FileReader;
g.onloadend = function (c)
{
var b = "languages";
if (c.target.readyState == FileReader.DONE)
{
f = c.target.result;
for (d = 0; d < f.length; d++)
e[(d + 8) % 8] += f.charCodeAt(d);
lang = $("#SubLanguageID").multiselect("getChecked").map(function()
{
return this.value
}).get().join(",");
if (lang == "")
lang = "all";
var url = "http://www.opensubtitles.org/" + $(location).attr('pathname').substr(1,2) + "/search/sublanguageid-" + lang + "/moviehash-" + binl2hex(e);
document.location = url;
}
};
g.readAsBinaryString(c)
}
};
g.readAsBinaryString(c)
});
});
});