aboutsummaryrefslogtreecommitdiff
path: root/tmsu.py
blob: aaa294740ac5c6d8d8d7dd6447be0767846176cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import subprocess
import re
import logging
import os

class TMSU(object):

    '''
    Initializes TMSU in a given directory.
    Does nothing, if it is already initialized.

    Parameters:
    base: Directory to initialize.
    '''
    def __init__(self, base, command):
        self.__base = base
        self.__command = command
        logger = logging.getLogger(__name__)
        if not os.path.exists(os.path.join(base, ".tmsu")):
            logger.info("TMSU database does not exist, creating ...")
            proc = subprocess.Popen([self.__command, "init"], cwd=self.__base)
            proc.wait()
            logger.debug("TMSU returncode: {}".format(proc.returncode))
            if proc.returncode != 0:
                logger.error("Could not initialize TMSU database.")
                self.status = False
        self.status = True

    '''
    Reads the tags for the specified file.

    Parameters:
    base: Base directory for the database.
    file: File to get the tags for.
    '''
    def tags(self, file):
        logger = logging.getLogger(__name__)
        logger.debug("Getting existing tags for file {}".format(file))
        tags = set()
        proc = subprocess.Popen([self.__command, "tags", os.path.relpath(file, self.__base)], cwd=self.__base, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        proc.wait()
        logger.debug("TMSU returncode: {}".format(proc.returncode))
        if proc.returncode == 0:
            ret = proc.stdout.read().decode()
            logger.debug("Raw TMSU tags: {}".format(ret))
            tags.update(re.split("\s", ret.split(":")[1])[1:-1])
        else:
            logger.error("Could not get tags for file {}".format(file))
        return tags

    '''
    Sets tags for the specified file.

    Parameters:
    base: Base directory for the database.
    file: File to set the tags for.
    tags: Tags to set.
    untag: If True, it will remove all existing tags first. If False, it will just append new tags.
    '''
    def tag(self, file, tags, untag=True):
        logger = logging.getLogger(__name__)
        if untag:
            logger.debug("Untagging file")
            proc = subprocess.Popen([self.__command, "untag", "--all", os.path.relpath(file, self.__base)], cwd=self.__base, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            proc.wait()
            if proc.returncode != 0:
                logger.error("Could not untag file {}".format(file))
        if tags:
            logger.debug("Writing tags {}".format(tags))
            proc = subprocess.Popen([self.__command, "tag", os.path.relpath(file, self.__base)] + list(tags), cwd=self.__base, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            proc.wait()
            if proc.returncode != 0:
                logger.error("Could not write tags to file {}".format(file))
        else:
            logger.info("Tags are empty, ignoring")