add add_link.py and improve hamndling of MediaFile

This commit is contained in:
Thomas Peetz
2025-06-14 18:53:15 +02:00
parent 510e2f8130
commit 529a199262
6 changed files with 78 additions and 16 deletions
+4 -10
View File
@@ -2,10 +2,9 @@ from typing import List, AnyStr
from fastapi import APIRouter, status, HTTPException, Depends from fastapi import APIRouter, status, HTTPException, Depends
from sqlalchemy import select, Sequence from sqlalchemy import select, Sequence
from src.core.log_conf import logger
from src.apis.utils import SessionDep from src.apis.utils import SessionDep
from src.apis.version1.admin import get_current_user_from_token from src.db.repository.media import create_new_mediafile
from src.db.models.admin import Profile
from src.schema.media.file import MediaFileResponse, Link, get_file_details, set_file from src.schema.media.file import MediaFileResponse, Link, get_file_details, set_file
from src.db.models.media import MediaFile from src.db.models.media import MediaFile
@@ -61,14 +60,9 @@ def update_file(file_id: AnyStr, db: SessionDep, info: MediaFileResponse) -> Med
@router.post("/files", status_code=status.HTTP_201_CREATED) @router.post("/files", status_code=status.HTTP_201_CREATED)
def add_file(new_link: Link, db: SessionDep) -> MediaFileResponse: def add_file(new_link: Link, db: SessionDep) -> MediaFileResponse:
print(new_link.url) logger.info(f"add url {new_link.url}")
try: try:
mediaFile: MediaFile = MediaFile() mediaFile: MediaFile = create_new_mediafile(new_link.url, db)
setattr(mediaFile, "url", new_link.url)
setattr(mediaFile, "review", True)
setattr(mediaFile, "should_download", True)
db.add(mediaFile)
db.commit()
except: except:
raise HTTPException(status_code=409, detail="Link duplicate") raise HTTPException(status_code=409, detail="Link duplicate")
response = get_file_details(mediaFile) response = get_file_details(mediaFile)
+1 -1
View File
@@ -11,7 +11,7 @@ class Base(DeclarativeBase):
class BaseMixin: class BaseMixin:
#id = Column(String, primary_key=True, default=uuid.uuid4) #id = Column(String, primary_key=True, default=uuid.uuid4)
id: Mapped[str] = mapped_column(primary_key=True, default=uuid.uuid4) id: Mapped[str] = mapped_column(primary_key=True, default=str(uuid.uuid4()))
# created_date = Column(DateTime) # created_date = Column(DateTime)
created_date: Mapped[datetime] = mapped_column(default=func.now()) created_date: Mapped[datetime] = mapped_column(default=func.now())
# last_modified_date = Column(DateTime) # last_modified_date = Column(DateTime)
+20 -1
View File
@@ -1,7 +1,9 @@
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from typing import AnyStr
import uuid import uuid
from datetime import datetime from datetime import datetime
from src.db.models.media import MediaVideo from src.core.log_conf import logger
from src.db.models.media import MediaFile, MediaVideo
from src.webapps.media.forms import AddLinkForm from src.webapps.media.forms import AddLinkForm
@@ -19,3 +21,20 @@ def create_new_video(video: AddLinkForm, db: Session) -> MediaVideo:
db.refresh(media_video) db.refresh(media_video)
print(media_video) print(media_video)
return media_video return media_video
def create_new_mediafile(link: AnyStr, db: Session) -> MediaFile:
logger.info("create MediaFile with url {link}")
media_file: MediaFile = MediaFile()
media_file.id = str(uuid.uuid4())
media_file.url = link
media_file.created_date = datetime.now()
media_file.last_modified_date = datetime.now()
media_file.version = 0
media_file.review = True
media_file.should_download = True
db.add(media_file)
db.commit()
db.refresh(media_file)
logger.info(f"created {media_file}")
return media_file
+1 -2
View File
@@ -1,12 +1,11 @@
from datetime import datetime from datetime import datetime
from typing import AnyStr
from src.db.models.media import MediaFile from src.db.models.media import MediaFile
from pydantic import BaseModel from pydantic import BaseModel
class MediaFileResponse(BaseModel): class MediaFileResponse(BaseModel):
id: AnyStr id: str
title: str | None = None title: str | None = None
file_name: str | None = None file_name: str | None = None
cloud_link: str | None = None cloud_link: str | None = None
+49
View File
@@ -0,0 +1,49 @@
"""
read file with URLs and store in DB
"""
import logging.config
import requests
import yaml
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
from pathlib import Path
from platformdirs import PlatformDirs
parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument('-u', '--url', help='file with links')
parser.add_argument('--video', help='store Url as VideoFile', action="store_true")
parser.add_argument('--config', '-c', default='kontor-docker')
parser.add_argument('--verbose', '-v', action='count', default=0)
args = parser.parse_args()
def get_logger(level: int, config: str):
dirs = PlatformDirs(config)
logging_config = Path(dirs.user_config_dir, 'logging-config.yaml')
with open(logging_config, 'rt') as f:
configDict = yaml.safe_load(f.read())
logging.config.dictConfig(configDict)
logger = logging.getLogger('development')
if level is not None:
match level:
case 0:
logger.setLevel(logging.INFO)
case 1:
logger.setLevel(logging.DEBUG)
case _:
logger.setLevel(logging.CRITICAL)
return logger
if __name__ == '__main__':
logger = get_logger(args.verbose, args.config)
logger.info('kontor.add_link started')
link: str = args.url
data = {"url": link}
if args.video:
request: str = "http://127.0.0.1:8800/api/video/files"
else:
request: str = "http://127.0.0.1:8800/api/media/files"
response = requests.post(request, json=data)
logger.info(f"Status: {response.status_code}")
data = response.json()
logger.info('kontor.add_link finished')
+3 -2
View File
@@ -42,14 +42,15 @@ if __name__ == '__main__':
log.info(f"data: {len(data)}") log.info(f"data: {len(data)}")
for item in data: for item in data:
link = item['url'] link = item['url']
log.info(f"{item['id']} - {link}") log.info(f"{item['id']} - {str(link)}")
try: try:
r = requests.get(link) r = requests.get(link)
soup = BeautifulSoup(r.content, "html.parser") soup = BeautifulSoup(r.content, "html.parser")
title = soup.title.string title = soup.title.string
item['title'] = title item['title'] = title
item['review'] = False item['review'] = False
except: except Exception as error:
log.info(f"something went wrong: {error}")
item['title'] = None item['title'] = None
item['review'] = True item['review'] = True
update = requests.put(f"http://127.0.0.1:8800/api/media/files/{item['id']}", json=item) update = requests.put(f"http://127.0.0.1:8800/api/media/files/{item['id']}", json=item)