aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/later/entries.py
blob: ed0df870b4590bde6ab45005325250a2416969cc (plain) (blame)
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
76
77
78
79
80
81
82
import datetime
import os
from dataclasses import dataclass
from datetime import datetime as dt

from later.utils import hexdigest


@dataclass
class WatchLaterEntry:
    name: str
    path: str
    mtime: dt

    def format(self, title_map):
        def format_time(time):
            now = dt.now()
            if time < now - datetime.timedelta(days=7):
                return time.strftime("%b %d  %Y")
            return time.strftime("%b %d %H:%M")

        output = [format_time(self.mtime), self.name]

        if title := title_map.get(self.name):
            output.append(f"# {title}")

        return "\t".join(output)


class EntryManager:
    def __init__(self, directory, title_map):
        self.watch_later_dir = directory
        self.title_map = title_map

    def walk_entries(self):
        def get_mtime(entry):
            return entry.stat().st_mtime

        with os.scandir(self.watch_later_dir) as entries:
            for entry in sorted(entries, key=get_mtime):
                if not entry.is_file():
                    continue

                mtime = dt.fromtimestamp(get_mtime(entry))

                with open(entry.path) as handle:
                    first = handle.readline().rstrip()

                name = entry.name
                if first.startswith("# "):
                    name = first.strip("# ")

                    if name == "redirect entry":
                        continue

                self.title_map.mark_seen(name)
                yield WatchLaterEntry(name=name, path=entry.path, mtime=mtime)

    def print(self):
        for entry in self.walk_entries():
            print(entry.format(self.title_map))

    def add(self, entry):
        path = os.path.join(self.watch_later_dir, hexdigest(entry))

        try:
            with open(path, "x") as handle:
                handle.write(f"# {entry}\n")
        except FileExistsError:
            pass
        except OSError as e:
            exit(e)

    def delete(self, entry):
        path = os.path.join(self.watch_later_dir, hexdigest(entry))

        try:
            os.remove(path)
        except FileNotFoundError:
            pass
        except OSError as e:
            exit(e)