You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.6 KiB
64 lines
1.6 KiB
import os |
|
import re |
|
import yaml |
|
|
|
from flask import Blueprint, current_app, render_template |
|
|
|
|
|
VIDEO_EXTENSIONS = ['.avi', '.m4v', '.mkv', '.mp4', '.mpg'] |
|
MAX_RECURSE_DEPTH = 5 |
|
bp = Blueprint('file_listing', __name__) |
|
|
|
|
|
class path_entry: |
|
def __init__(self): |
|
self.base_name = '' |
|
self.rel_path = '' # NOTE: fs path relative to config['MOVIE_DIR'] |
|
self.file_extension = '' |
|
self.is_dir = False |
|
self.depth = 0 |
|
self.contents = [] |
|
|
|
|
|
@bp.route('/file_listing') |
|
def index(): |
|
# construct tree of path_entry objects |
|
video_path = current_app.config['MOVIE_DIR'] |
|
paths = [] |
|
|
|
for entry in os.scandir(video_path): |
|
p = getPathInfo(entry) |
|
if p: |
|
paths.append(p) |
|
|
|
return render_template( |
|
'file_listing/index.html', |
|
paths=paths, |
|
debug_str=yaml.dump(paths) |
|
) |
|
|
|
def getPathInfo(entry, depth=0): |
|
if not entry.name.startswith('.') and not entry.is_symlink(): |
|
video_path = current_app.config['MOVIE_DIR'] |
|
pe = path_entry() |
|
pe.base_name = entry.name |
|
pe.rel_path = re.sub(video_path, '', entry.path) |
|
pe.is_dir = entry.is_dir() |
|
pe.depth = depth |
|
|
|
if entry.is_file(): |
|
ext = os.path.splitext(entry)[1] |
|
|
|
if ext in VIDEO_EXTENSIONS: |
|
pe.file_extension = ext |
|
else: |
|
return None |
|
elif entry.is_dir() and depth < MAX_RECURSE_DEPTH: |
|
for e in os.scandir(entry): |
|
p = getPathInfo(e, depth + 1) |
|
if p: |
|
pe.contents.append(p) |
|
|
|
return pe |
|
|
|
return None
|
|
|