|
5 | 5 | # built-in |
6 | 6 | from io import StringIO |
7 | 7 | import mimetypes |
| 8 | +from os import stat_result |
8 | 9 | from pathlib import Path |
9 | 10 | from typing import Iterable, cast |
10 | 11 |
|
|
17 | 18 |
|
18 | 19 | LOGO_MARKDOWN = "[](/)" |
19 | 20 | DIR_FILE = "dir.html" |
| 21 | +AUTOPLAY_PREVIEW_SIZE = 100 * (1024 * 1024) # 100 MiB |
20 | 22 |
|
21 | 23 |
|
22 | | -def file_preview(path: Path, link: Path) -> str: |
| 24 | +def file_preview(path: Path, link: Path, stats: stat_result) -> str: |
23 | 25 | """Get possible preview text for a file.""" |
24 | 26 |
|
25 | 27 | preview = "" |
26 | 28 |
|
27 | | - if path.is_file(): |
28 | | - mime, _ = mimetypes.guess_type(path, strict=False) |
29 | | - if mime and mime.startswith("image"): |
30 | | - preview = div(tag="img", src=f"/{link}", alt=str(link)).encode_str( |
31 | | - newlines=False |
32 | | - ) |
| 29 | + if not path.is_file(): |
| 30 | + return preview |
| 31 | + |
| 32 | + mime, _ = mimetypes.guess_type(path, strict=False) |
| 33 | + if mime: |
| 34 | + # Image previews. |
| 35 | + if mime.startswith("image"): |
| 36 | + preview = div( |
| 37 | + tag="img", |
| 38 | + src=f"/{link}", |
| 39 | + alt=str(link), |
| 40 | + class_str="media-preview", |
| 41 | + ).encode_str(newlines=False) |
| 42 | + |
| 43 | + # Video previews. |
| 44 | + elif mime.startswith("video"): |
| 45 | + elem = div(tag="video", class_str="media-preview") |
| 46 | + elem.booleans.add("loop") |
| 47 | + elem.booleans.add("controls") |
| 48 | + |
| 49 | + if stats.st_size < AUTOPLAY_PREVIEW_SIZE: |
| 50 | + elem.booleans.add("autoplay") |
| 51 | + |
| 52 | + div(parent=elem, tag="source", src=f"/{link}", type=mime) |
| 53 | + |
| 54 | + preview = elem.encode_str(newlines=False) |
| 55 | + |
| 56 | + # Audio previews. |
| 57 | + elif mime.startswith("audio"): |
| 58 | + elem = div(tag="audio", src=f"/{link}") |
| 59 | + elem.booleans.add("controls") |
| 60 | + preview = elem.encode_str(newlines=False) |
33 | 61 |
|
34 | 62 | return preview |
35 | 63 |
|
@@ -65,7 +93,8 @@ def write_markdown_dir( |
65 | 93 | size_str = byte_count_str(stats.st_size) if item.is_file() else "" |
66 | 94 |
|
67 | 95 | writer.write( |
68 | | - f"| [{name}](/{curr}) | {size_str} | {file_preview(item, curr)} |" |
| 96 | + f"| [{name}](/{curr}) | {size_str} | " |
| 97 | + f"{file_preview(item, curr, stats)} |" |
69 | 98 | ) |
70 | 99 |
|
71 | 100 | writer.empty() |
|
0 commit comments