Files
simple-viewer/viewer/helpers.py

61 lines
1.9 KiB
Python

import mimetypes
import os
from typing import List, Tuple
from django.urls import reverse
from viewer.models import ServedDirectory
class File:
def __init__(self, head, tail):
self.filename = head
self.fullpath = os.path.join(tail, head)
self.mediatype = self.get_mediatype()
def get_url(self, directory: ServedDirectory) -> str:
return reverse('file', args=(directory.id, self.filename))
def get_mediatype(self) -> str:
"""Simple media type categorization based on the given mimetype"""
if os.path.exists(self.fullpath):
if os.path.isdir(self.fullpath):
return 'folder'
mimetype = mimetypes.guess_type(self.filename)[0]
if mimetype is not None:
if mimetype.startswith('image'):
return 'image'
elif mimetype.startswith('video'):
return 'video'
return 'file'
return 'unknown'
def __str__(self) -> str:
return self.filename
def extra_listdir(path: str) -> List[File]:
"""
Helper function used for identifying file media type for every file in a given directory, extending os.listdir
:param path: The path to the directory.
:return: A list of tuples, each containing two strings, the file or directory name, and the media type.
"""
files = []
for file in os.listdir(path):
files.append(File(file, path))
return files
def get_all_mediatype(head: str, tail: str) -> str:
"""
A extra media type function supporting directories on top of files.
:param head: The head of the path, usually the directory name or filename at the very end.
:param tail: The rest of the path, everything that comes before the head.
:return: A media type in string form.
"""
if os.path.isfile(os.path.join(tail, head)):
return get_file_mediatype(head)
return "folder"