# HG changeset patch # User Emmanuel Gil Peyrot # Date 1369499425 -7200 # Node ID c93cfd58112e43e916bec400f38ed84d6b314a4c # Parent 09945ce42e289cff8302a0e12355ee18e7318fdb Get the tags from danbooru’s json format. Warning: breaks the compatibility with older databases! diff --git a/danboorufs.py b/danboorufs.py --- 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]', - '', '') + ' [ ...]', '') exit(1) main(argv)