[packages/pynapi] - up to 0.20; crude way of accessing napisy 24 API and pynapi would welcome rewrite

arekm arekm at pld-linux.org
Sun Feb 15 23:17:48 CET 2015


commit 2855f8306a95e3311ce9a5a82c483515635f2842
Author: Arkadiusz Miśkiewicz <arekm at maven.pl>
Date:   Sun Feb 15 23:17:42 2015 +0100

    - up to 0.20; crude way of accessing napisy 24 API and pynapi would welcome rewrite

 pynapi.py   | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 pynapi.spec |   8 ++--
 2 files changed, 127 insertions(+), 19 deletions(-)
---
diff --git a/pynapi.spec b/pynapi.spec
index 3579fef..8a1e5d6 100644
--- a/pynapi.spec
+++ b/pynapi.spec
@@ -1,8 +1,8 @@
 Summary:	pynapi - Movie Subtitle Downloader
 Summary(pl.UTF-8):	pynapi - narzędzie do ściągania napisów do filmów
 Name:		pynapi
-Version:	0.18
-Release:	7
+Version:	0.20
+Release:	1
 License:	GPL v3+
 Group:		Applications/Multimedia
 Source0:	pynapi.py
@@ -13,11 +13,11 @@ BuildArch:	noarch
 BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
 
 %description
-Command line NAPI-PROJEKT subtitles downloader.
+Command line NAPI-PROJEKT and NAPISY24 subtitles downloader.
 
 %description -l pl.UTF-8
 Obsługiwane z linii poleceń narzędzie do ściągania napisów z projektu
-NAPI.
+NAPI oraz NAPISY24.
 
 %prep
 %setup -q -c -T
diff --git a/pynapi.py b/pynapi.py
index 7ca5676..a6a72b6 100644
--- a/pynapi.py
+++ b/pynapi.py
@@ -18,15 +18,22 @@
 #
 # napiprojekt.pl API is used with napiproject administration consent
 # (given by Marek <kontakt at napiprojekt.pl> at Wed, 24 Feb 2010 14:43:00 +0100)
+#
+# napisy24.pl API access granted by napisy24 admins at 15 Feb 2015
+#
 
+import StringIO
 import re
 import sys
 import mimetypes
+import urllib
 import urllib2
 import time
 import os
 import getopt
 import socket
+import struct
+import zipfile
 
 try:
     from hashlib import md5 as md5
@@ -38,7 +45,15 @@ prog = os.path.basename(sys.argv[0])
 video_files = [ 'asf', 'avi', 'divx', 'm2ts', 'mkv', 'mp4', 'mpeg', 'mpg', 'ogm', 'rm', 'rmvb', 'wmv' ]
 languages = { 'pl': 'PL', 'en': 'ENG' }
 
-def f(z):
+def calculate_digest(filename):
+    d = md5()
+    try:
+        d.update(open(filename, "rb").read(10485760))
+    except (IOError, OSError), e:
+        raise Exception('Hashing video file failed: %s' % ( e ))
+    return d.hexdigest()
+
+def napiprojekt_hash(z):
     idx = [ 0xe, 0x3,  0x6, 0x8, 0x2 ]
     mul = [   2,   2,    5,   4,   3 ]
     add = [   0, 0xd, 0x10, 0xb, 0x5 ]
@@ -55,9 +70,43 @@ def f(z):
 
     return ''.join(b)
 
+def napisy24_hash(filename): 
+    try: 
+        longlongformat = '<q'  # little-endian long long
+        bytesize = struct.calcsize(longlongformat)
+
+        f = open(filename, "rb")
+
+        filesize = os.path.getsize(filename)
+        hash = filesize
+
+        if filesize < 65536 * 2:
+            raise Exception('Hashing (napisy24) video file failed: `%s\': File too small' % ( filename ))
+
+        for x in range(65536/bytesize): 
+            buffer = f.read(bytesize) 
+            (l_value,)= struct.unpack(longlongformat, buffer)  
+            hash += l_value 
+            hash = hash & 0xFFFFFFFFFFFFFFFF #to remain as 64bit number  
+
+
+        f.seek(max(0,filesize-65536),0) 
+        for x in range(65536/bytesize): 
+            buffer = f.read(bytesize) 
+            (l_value,)= struct.unpack(longlongformat, buffer)  
+            hash += l_value 
+            hash = hash & 0xFFFFFFFFFFFFFFFF 
+
+        f.close() 
+        returnedhash =  "%016x" % hash 
+        return returnedhash 
+
+    except IOError, e:
+        raise Exception('Hashing (napisy24) video file failed: %s' % ( e ))
+
 def usage():
     print >> sys.stderr, "Usage: %s [OPTIONS]... [FILE|DIR]..." % prog
-    print >> sys.stderr, "Find video files and download matching subtitles from napiprojekt server."
+    print >> sys.stderr, "Find video files and download matching subtitles from napiprojekt/napisy24 server."
     print >> sys.stderr
     print >> sys.stderr, "Supported options:"
     print >> sys.stderr, "     -h, --help            display this help and exit"
@@ -67,8 +116,6 @@ def usage():
     print >> sys.stderr, "     -u, --update          fetch new and also update existing subtitles"
     print >> sys.stderr, "     -d, --dest=DIR        destination directory"
     print >> sys.stderr
-    print >> sys.stderr, "pynapi $Revision$"
-    print >> sys.stderr
     print >> sys.stderr, "Report bugs to <arekm at pld-linux.org>."
 
 def get_desc_links(digest, file=None):
@@ -112,21 +159,73 @@ def get_cover(digest):
         return False
     return (cover, extension)
 
-def calculate_digest(file):
-    d = md5()
-    try:
-        d.update(open(file, "rb").read(10485760))
-    except (IOError, OSError), e:
-        raise Exception('Hashing video file failed: %s' % ( e ))
-    return d.hexdigest()
+def get_subtitle_napisy24(filename, digest=False, lang="pl"):
+    url = "http://napisy24.pl/run/CheckSubAgent.php"
+
+    pdata = []
+    pdata.append(('postAction', 'CheckSub'))
+    pdata.append(('ua', 'pynapi'))
+    pdata.append(('ap', 'XaA!29OkF5Pe'))
+    pdata.append(('nl', lang))
+    pdata.append(('fn', filename))
+    pdata.append(('fh', napisy24_hash(filename)))
+    pdata.append(('fs', os.path.getsize(filename)))
+    if digest:
+        pdata.append(('md5', digest))
 
-def get_subtitle(digest, lang="PL"):
+    repeat = 3
+    error = "Fetching subtitle (napisy24) failed:"
+    while repeat > 0:
+        repeat = repeat - 1
+        try:
+            sub = urllib2.urlopen(url, data=urllib.urlencode(pdata))
+            if hasattr(sub, 'getcode'):
+                http_code = sub.getcode() 
+            sub = sub.read()
+        except (IOError, OSError), e:
+            error = error + " %s" % (e)
+            time.sleep(0.5)
+            continue
+
+        if http_code != 200:
+            error = error + ",HTTP code: %s" % (str(http_code))
+            time.sleep(0.5)
+            continue
+
+        err_add = ''
+        if sub.startswith('OK-2|'):
+            pos = sub.find('||')
+            if pos >= 2 and len(sub) > (pos + 2):
+                sub = sub[pos+2:]
+
+                try:  
+                    subzip=zipfile.ZipFile(StringIO.StringIO(sub))
+                    sub=''
+                    for name in subzip.namelist():
+                        sub += subzip.read(name)
+                except Exception, e:
+                    raise Exception('Subtitle NOT FOUND%s' % e)
+            else:
+                raise Exception('Subtitle NOT FOUND (subtitle too short)')
+        elif sub.startswith('OK-'):
+            raise Exception('Subtitle NOT FOUND')
+        else:
+            raise Exception('Subtitle NOT FOUND (unknown error)')
+
+        repeat = 0
+
+    if sub is None or sub == "":
+        raise Exception(error)
+
+    return sub
+
+def get_subtitle_napiprojekt(digest, lang="PL"):
     url = "http://napiprojekt.pl/unit_napisy/dl.php?l=%s&f=%s&t=%s&v=pynapi&kolejka=false&nick=&pass=&napios=%s" % \
-        (lang, digest, f(digest), os.name)
+        (lang, digest, napiprojekt_hash(digest), os.name)
     repeat = 3
     sub = None
     http_code = 200
-    error = "Fetching subtitle failed:"
+    error = "Fetching subtitle (napiprojekt) failed:"
     while repeat > 0:
         repeat = repeat - 1
         try:
@@ -248,11 +347,20 @@ def main(argv=sys.argv):
 
         try:
             digest = calculate_digest(file)
-            sub = get_subtitle(digest, languages[lang])
         except:
             print >> sys.stderr, "%s: %d/%d: %s" % (prog, i, i_total, sys.exc_info()[1])
             continue
 
+        try:
+            raise
+            sub = get_subtitle_napiprojekt(digest, languages[lang])
+        except:
+            try:
+                sub = get_subtitle_napisy24(file, digest, lang)
+            except:
+                print >> sys.stderr, "%s: %d/%d: %s" % (prog, i, i_total, sys.exc_info()[1])
+                continue
+
         fp = open(vfile, 'wb')
         fp.write(sub)
         fp.close()
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/pynapi.git/commitdiff/2855f8306a95e3311ce9a5a82c483515635f2842



More information about the pld-cvs-commit mailing list