Mercurial > danboorufs
diff danboorufs.py @ 8:c93cfd58112e draft default tip
Get the tags from danbooru’s json format. Warning: breaks the compatibility with older databases!
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sat, 25 May 2013 18:30:25 +0200 |
parents | 09945ce42e28 |
children |
line wrap: on
line diff
--- a/danboorufs.py +++ b/danboorufs.py @@ -32,6 +32,7 @@ from time import time from functools import reduce import os +import json from fuse import FUSE, FuseOSError, Operations, LoggingMixIn @@ -41,10 +42,10 @@ class Danbooru(LoggingMixIn, Operations) Represent a list of images as a filesystem tree, with nice tag filtering. ''' - def __init__(self, tagfiles, root, use_symlinks): + def __init__(self, json_files, root, use_symlinks): ''' Takes a list of files containing the tags. They have to be named as the - image, with ".tags" at the end. + image, with ".json" at the end. ''' self.paths = {} self.files = {} @@ -53,24 +54,16 @@ class Danbooru(LoggingMixIn, Operations) start = time() - for name in tagfiles: - filename = name.replace('.tags', '') - basename = os.path.basename(filename) - self.paths[basename] = filename - tags = [] - self.files[basename] = tags - with open(name, 'rb') as tagfile: - for line in tagfile: - for tag in line.split(): - try: - tag = tag.decode('UTF-8') - except UnicodeDecodeError: - continue - except AttributeError: - pass - tag = tag.replace('/', '�') #XXX - tags.append(tag) - self.tags.setdefault(tag, []).append(basename) + for json_name in json_files: + with open(json_name, 'r') as jsonfile: + data = json.load(jsonfile) + + tags = [tag.replace('/', '∕') for tag in data['tag_string'].split()] + ['rating:' + data['rating']] + name = '{}.{}'.format(data['id'], data['file_ext']) + self.paths[name] = json_name[:-4] + data['file_ext'] + self.files[name] = tags + for tag in tags: + self.tags.setdefault(tag, []).append(name) print('[%d] Index done.' % (time() - start)) @@ -201,7 +194,7 @@ def main(args): for directory in directories: for (path, _, files) in os.walk(directory): filelist.extend(os.path.join(path, filename) for filename in files - if filename.endswith('.tags')) + if filename.endswith('.json')) print('[%d] Walk done.' % (time() - start)) FUSE(Danbooru(filelist, os.path.dirname(mountpoint), use_symlinks), @@ -211,7 +204,7 @@ def main(args): if __name__ == '__main__': if len(argv) < 3: print('USAGE: %s' % argv[0], '[-n|--no-symlinks]', - '<tags directory>', '<mountpoint>') + '<directory> [<directory> ...]', '<mountpoint>') exit(1) main(argv)