annotate video_file_store.py @ 37:7cacfae58430

thumbnails rewrite - store in db; don't use YT-provided pics for now
author drewp@bigasterisk.com
date Tue, 03 Dec 2024 19:28:11 -0800
parents ed16fdbb3996
children 0aea9e55899b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
1 import asyncio
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
2 import hashlib
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
3 import logging
20
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
4 import os
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
5 from dataclasses import dataclass
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
6 from pathlib import Path
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
7 from typing import Iterable, Iterator
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
8
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
9 import pymongo.collection
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
10
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
11 log = logging.getLogger('vfs')
20
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
12
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
13
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
14 @dataclass
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
15 class VideoFile:
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
16 diskPath: Path
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
17 webRelPath: str
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
18 webDataPath: str
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
19 label: str
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
20 # perms, playlists, req by/when
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
21
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
22
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
23 @dataclass
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
24 class VideoFileStore:
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
25 fs: pymongo.collection.Collection
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
26
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
27 def findInDir(self, subdir: str) -> Iterable[VideoFile]:
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
28 webRelParent = '.' if subdir == '/' else subdir
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
29 for doc in self.fs.find({
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
30 'type': 'file',
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
31 'webRelParent': webRelParent
37
7cacfae58430 thumbnails rewrite - store in db; don't use YT-provided pics for now
drewp@bigasterisk.com
parents: 36
diff changeset
32 }, sort=[('label', 1)]):
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
33 yield VideoFile(Path(doc['diskPath']), doc['webRelPath'],
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
34 doc['webDataPath'], doc['label'])
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
35
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
36 def findSubdirs(self, subdir: str) -> Iterable:
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
37 for doc in self.fs.find({
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
38 'type':
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
39 'dir',
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
40 'webRelParent':
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
41 '.' if subdir == '/' else subdir
37
7cacfae58430 thumbnails rewrite - store in db; don't use YT-provided pics for now
drewp@bigasterisk.com
parents: 36
diff changeset
42 }, sort=[('label', 1)]):
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
43 yield {
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
44 'label': doc['label'],
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
45 'path': doc['webRelPath'],
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
46 }
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
47
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
48 async def save(self, name: str, chunks: Iterator[bytes]):
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
49 raise
15
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
50 p = self.top / name
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
51 if p.exists():
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
52 raise ValueError(f'{p} exists')
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
53 data = b''
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
54 for c in chunks:
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
55 data += c
53d99454f394 support dropping url or file
drewp@bigasterisk.com
parents:
diff changeset
56 p.write_bytes(data)
20
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
57
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
58 def folderTree(self):
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
59 out = {'name': 'TOP'}
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
60
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
61 def fill(node: dict, pathToHere: Path):
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
62 for subName in sorted(os.listdir(pathToHere)):
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
63 if subName in IGNORE:
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
64 continue
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
65 subDir = pathToHere / subName
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
66 if subDir.is_dir():
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
67 subNode = {'name': subName}
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
68 node.setdefault('children', []).append(subNode)
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
69 fill(subNode, subDir)
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
70
cf6842952e13 serve api/folderTree
drewp@bigasterisk.com
parents: 15
diff changeset
71 fill(out, self.top)
36
ed16fdbb3996 rewrite WIP. scan fs separately; store in db. thumbs are broken for now
drewp@bigasterisk.com
parents: 20
diff changeset
72 return out