diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7db62f8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +build +env +*.pyc diff --git a/README.md b/README.md new file mode 100644 index 0000000..3ed1d88 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +DVD Fingerprint +=============== + +This is a Python implementation of the disc fingerprinting technique used by the +[Discident Database](http://discident.com/). Works by traversing a directory (from a +DVD drive or ripped) and creating a unique hash for that disc. + +# Usage + +Command line: + + $ dvdfingerprint /Volumes/DVD_VIDEO/ + +From your own code: + + import dvdfingerprint + dvdfingerprint.fingerprint("/Volumes/DVD_VIDEO/") + +Adapted from Erik Kastner's Ruby implementation [dvd_fingerprint](https://github.com/kastner/dvd_fingerprint). diff --git a/bin/dvdfingerprint b/bin/dvdfingerprint new file mode 100755 index 0000000..b095e77 --- /dev/null +++ b/bin/dvdfingerprint @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +import sys +import dvdfingerprint + +if __name__ == "__main__": + if len(sys.argv) == 2: + print dvdfingerprint.fingerprint(sys.argv[1]) + else: + print "Usage: dvdfingerprint " diff --git a/dist/dvdfingerprint-0.1.0-py2.7.egg b/dist/dvdfingerprint-0.1.0-py2.7.egg new file mode 100644 index 0000000..e045215 Binary files /dev/null and b/dist/dvdfingerprint-0.1.0-py2.7.egg differ diff --git a/dvdfingerprint.egg-info/PKG-INFO b/dvdfingerprint.egg-info/PKG-INFO new file mode 100644 index 0000000..0c13d8d --- /dev/null +++ b/dvdfingerprint.egg-info/PKG-INFO @@ -0,0 +1,10 @@ +Metadata-Version: 1.0 +Name: dvdfingerprint +Version: 0.1.0 +Summary: DVD Fingerprint +Home-page: http://discident.com +Author: Michael Lavers +Author-email: kolanos@gmail.com +License: BSD +Description: UNKNOWN +Platform: UNKNOWN diff --git a/dvdfingerprint.egg-info/SOURCES.txt b/dvdfingerprint.egg-info/SOURCES.txt new file mode 100644 index 0000000..5690895 --- /dev/null +++ b/dvdfingerprint.egg-info/SOURCES.txt @@ -0,0 +1,7 @@ +setup.py +bin/dvdfingerprint +dvdfingerprint/__init__.py +dvdfingerprint.egg-info/PKG-INFO +dvdfingerprint.egg-info/SOURCES.txt +dvdfingerprint.egg-info/dependency_links.txt +dvdfingerprint.egg-info/top_level.txt \ No newline at end of file diff --git a/dvdfingerprint.egg-info/dependency_links.txt b/dvdfingerprint.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/dvdfingerprint.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/dvdfingerprint.egg-info/top_level.txt b/dvdfingerprint.egg-info/top_level.txt new file mode 100644 index 0000000..b9e4caa --- /dev/null +++ b/dvdfingerprint.egg-info/top_level.txt @@ -0,0 +1 @@ +dvdfingerprint diff --git a/dvdfingerprint/__init__.py b/dvdfingerprint/__init__.py new file mode 100644 index 0000000..c72a6d3 --- /dev/null +++ b/dvdfingerprint/__init__.py @@ -0,0 +1,34 @@ +import hashlib +import os +import sys + +__VERSION__ = "0.1.0" + + +def generate_hash(s): + s = hashlib.md5(s).hexdigest().upper() + return "-".join([s[:8], s[8:12], s[12:16], s[16:20], s[20:]]) + + +def get_paths(root_dir): + file_list = [] + for root, subFolders, files in os.walk(root_dir): + for file in files: + f = os.path.join(root, file) + s = os.path.getsize(f) + f = f.replace(root_dir, '') + if not f.startswith('/'): + f = '/%s' % f + file_list.append("%s:%d" % (f, s)) + return file_list + + +def combine_files(f): + f.sort() + return ":%s" % ":".join(f) + + +def fingerprint(path): + p = get_paths(path) + s = combine_files(p) + return generate_hash(s) diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..20aaa7d --- /dev/null +++ b/setup.py @@ -0,0 +1,18 @@ +try: + from setuptools import setup +except ImportError: + from distutils.core import setup + +setup( + name='dvdfingerprint', + description='DVD Fingerprint', + author='Michael Lavers', + author_email='kolanos@gmail.com', + url='http://discident.com', + version='0.1.0', + license='BSD', + install_requires=[], + test_suite='', + packages=['dvdfingerprint'], + scripts=['bin/dvdfingerprint'] +) diff --git a/tests/dvd/VIDEO_TS/VIDEO_TS.BUP b/tests/dvd/VIDEO_TS/VIDEO_TS.BUP new file mode 100644 index 0000000..e69de29 diff --git a/tests/dvd/VIDEO_TS/VIDEO_TS.IFO b/tests/dvd/VIDEO_TS/VIDEO_TS.IFO new file mode 100644 index 0000000..e69de29 diff --git a/tests/dvd/VIDEO_TS/VIDEO_TS.VOB b/tests/dvd/VIDEO_TS/VIDEO_TS.VOB new file mode 100644 index 0000000..e69de29 diff --git a/tests/dvd/VIDEO_TS/VTS_01_0.BUP b/tests/dvd/VIDEO_TS/VTS_01_0.BUP new file mode 100644 index 0000000..e69de29 diff --git a/tests/dvd/VIDEO_TS/VTS_01_0.IFO b/tests/dvd/VIDEO_TS/VTS_01_0.IFO new file mode 100644 index 0000000..e69de29 diff --git a/tests/dvd/VIDEO_TS/VTS_01_0.VOB b/tests/dvd/VIDEO_TS/VTS_01_0.VOB new file mode 100644 index 0000000..e69de29 diff --git a/tests/dvd/VIDEO_TS/VTS_01_1.VOB b/tests/dvd/VIDEO_TS/VTS_01_1.VOB new file mode 100644 index 0000000..e69de29 diff --git a/tests/dvd/VIDEO_TS/VTS_01_2.VOB b/tests/dvd/VIDEO_TS/VTS_01_2.VOB new file mode 100644 index 0000000..e69de29 diff --git a/tests/dvd/VIDEO_TS/VTS_01_3.VOB b/tests/dvd/VIDEO_TS/VTS_01_3.VOB new file mode 100644 index 0000000..e69de29 diff --git a/tests/dvd/VIDEO_TS/VTS_01_4.VOB b/tests/dvd/VIDEO_TS/VTS_01_4.VOB new file mode 100644 index 0000000..e69de29 diff --git a/tests/dvd/VIDEO_TS/VTS_01_5.VOB b/tests/dvd/VIDEO_TS/VTS_01_5.VOB new file mode 100644 index 0000000..e69de29