From 0a6e97f4569f1e75e2ee46edd7dcab93ee2b90d7 Mon Sep 17 00:00:00 2001 From: yukkop Date: Sat, 23 May 2026 12:18:05 +0000 Subject: [PATCH] fix: `media-browser`: view button --- package/media-browser/app.py | 101 +++++++++++++++++++++++++++-------- 1 file changed, 79 insertions(+), 22 deletions(-) diff --git a/package/media-browser/app.py b/package/media-browser/app.py index df6dd50..df903ed 100644 --- a/package/media-browser/app.py +++ b/package/media-browser/app.py @@ -101,6 +101,19 @@ def api_local(): 'modified': datetime.fromtimestamp(stat.st_mtime).isoformat(), 'full_path': filepath }) + + media_ids = set() + for f in files: + mid = path_to_media_id(f['path']) + if mid: + media_ids.add(mid) + + media_types = get_media_types_map(media_ids) + for f in files: + mid = path_to_media_id(f['path']) + f['media_id'] = mid + f['media_type'] = media_types.get(mid, '') + return jsonify(files) except Exception as e: return jsonify({'error': str(e)}), 500 @@ -116,12 +129,28 @@ def api_s3(): list_kwargs['Prefix'] = S3_PREFIX + '/' for page in paginator.paginate(**list_kwargs): for obj in page.get('Contents', []): + key = obj['Key'] + if S3_PREFIX and key.startswith(S3_PREFIX + '/'): + key = key[len(S3_PREFIX) + 1:] objects.append({ - 'key': obj['Key'], + 'key': key, 'size': obj['Size'], 'modified': obj['LastModified'].isoformat(), 'etag': obj['ETag'].strip('"') }) + + media_ids = set() + for o in objects: + mid = path_to_media_id(o['key']) + if mid: + media_ids.add(mid) + + media_types = get_media_types_map(media_ids) + for o in objects: + mid = path_to_media_id(o['key']) + o['media_id'] = mid + o['media_type'] = media_types.get(mid, '') + return jsonify(objects) except Exception as e: return jsonify({'error': str(e)}), 500 @@ -207,26 +236,51 @@ def api_sync_status(): except Exception as e: return jsonify({'error': str(e)}), 500 +def path_to_media_id(filepath): + parts = filepath.split('/') + if len(parts) >= 4 and parts[0] == 'local_content': + return parts[1] + parts[2] + parts[3] + return None + def get_media_type_from_path(filepath): + media_id = path_to_media_id(filepath) + if not media_id: + return None try: - parts = filepath.split('/') - if len(parts) >= 4 and parts[0] == 'local_content': - media_id = parts[1] + parts[2] + parts[3] - conn = get_db_conn() - cur = conn.cursor() - cur.execute( - "SELECT media_type FROM local_media_repository WHERE media_id = %s", - (media_id,) - ) - row = cur.fetchone() - cur.close() - conn.close() - if row: - return row[0] + conn = get_db_conn() + cur = conn.cursor() + cur.execute( + "SELECT media_type FROM local_media_repository WHERE media_id = %s", + (media_id,) + ) + row = cur.fetchone() + cur.close() + conn.close() + if row: + return row[0] except Exception: pass return None +def get_media_types_map(media_ids): + result = {} + if not media_ids: + return result + try: + conn = get_db_conn() + cur = conn.cursor() + cur.execute( + "SELECT media_id, media_type FROM local_media_repository WHERE media_id = ANY(%s)", + (list(media_ids),) + ) + for row in cur.fetchall(): + result[row[0]] = row[1] + cur.close() + conn.close() + except Exception: + pass + return result + @app.route('/view/local/') def view_local(filepath): try: @@ -559,16 +613,17 @@ HTML_TEMPLATE = ''' html += `

Local Only (${data.local_only_count} total, showing first 100)

`; data.local_only.forEach(path => { - html += ``; + const mid = path.split('/').slice(1, 4).join(''); + html += ``; }); html += "
PathAction
${path}View
${path}View
"; } if (data.s3_only.length > 0) { html += `

S3 Only (${data.s3_only_count} total, showing first 100)

- `; +
Key
`; data.s3_only.forEach(key => { - html += ``; + html += ``; }); html += "
KeyAction
${key}
${key}View
"; } @@ -586,14 +641,15 @@ HTML_TEMPLATE = ''' window.localFilesLoaded = true; let html = ` - + `; files.forEach(f => { html += ` + - + `; }); html += "
PathSizeModifiedActionPathTypeSizeModifiedAction
${f.path}${f.media_type || "-"} ${formatBytes(f.size)} ${f.modified.slice(0, 19).replace("T", " ")}ViewView
"; @@ -610,15 +666,16 @@ HTML_TEMPLATE = ''' window.s3ObjectsLoaded = true; let html = ` - + `; objects.forEach(obj => { html += ` + - + `; }); html += "
KeySizeModifiedETagActionKeyTypeSizeModifiedETagAction
${obj.key}${obj.media_type || "-"} ${formatBytes(obj.size)} ${obj.modified.slice(0, 19).replace("T", " ")} ${obj.etag.slice(0, 8)}...ViewView
";