2

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)
        });
    });
});   
4

0 に答える 0