Source code for VideoService.__main__


#################################################*
##### ***  IMPORTS  *** #########################*
#################################################*

# *** Python modules *** #
import os

# *** Internal modules *** #
from .database import Database
from .files_manager import FileManager
from .video import Video
from .playlist import Playlist
from .__errors__ import *

#################################################*
##### ***  IMPORTS  *** #########################*
#################################################*

### *** VIDEO SERVICE CLASS *** ###
[docs]class VideoService: """ VideoService ============ Main class of Video Service library. This class will manage all the backend of the service, and you will just need to call it's methods when required by the server. """ ## *** CLASS CONSTRUCTOR *** ## def __init__(self, DATABASE: str = ".\\Database", VIDEOS: str = ".\\Database\\Videos", THUMBNAILS: str = ".\\Database\\THUMBNAILS", UPLOADS: str = ".\\Uploads" ) -> None: """ Class Constructor ================= Parameters ---------- DATABASE : str, optional Path to the database file. VIDEOS : str, optional Path to the videos folder. THUMBNAILS : str, optional Path to the thumbnails folder. UPLOADS : str, optional Path to the uploads folder. Raises ------ TypeError If the paths are not strings. NotFoundError If the paths do not exist. """ # Check if arguments are valid args_handling( init=True, DATABASE=DATABASE, VIDEOS=VIDEOS, THUMBNAILS=THUMBNAILS, UPLOADS=UPLOADS ) # Set arguments as class attributes self.DB_PATH = DATABASE self.VIDEOS_PATH = VIDEOS self.THUMBNAILS_PATH = THUMBNAILS self.UPLOADS_PATH = UPLOADS # Create instances of Database and FileManager self.database = Database( DATABASE=DATABASE, VIDEOS=VIDEOS, THUMBNAILS=THUMBNAILS ) self.file_manager = FileManager( VIDEOS=VIDEOS, THUMBNAILS=THUMBNAILS, UPLOADS=UPLOADS ) ## *** CLASS METHODS *** ## # *** UPLOAD VIDEO TO SERVER AND DATABASE *** #
[docs] def upload(self, TITLE: str, VIDEO_FILENAME: str, OWNER: str, VISIBILITY: str, THUMBNAIL_FILENAME: str = None, DESCRIPTION: str = None, TAGS: list[str] = None ) -> dict: """ Upload ====== Function to upload a video to the server and database. Parameters ---------- TITLE : str Title of the video. VIDEO_FILENAME : str Filename of the video. OWNER : str Owner of the video. VISIBILITY : str Visibility of the video. THUMBNAIL_FILENAME : str, optional Filename of the thumbnail. DESCRIPTION : str, optional Description of the video. TAGS : list[str], optional Tags of the video. Returns ------- dict A dictionary with the result of the operation. """ try: # Set optional arguments as empty strings or lists THUMBNAIL_FILENAME = THUMBNAIL_FILENAME or "" DESCRIPTION = DESCRIPTION or "" TAGS = TAGS or [""] # Check if arguments are valid args_handling( init=False, TITLE=TITLE, VIDEO_FILENAME=VIDEO_FILENAME, OWNER=OWNER, VISIBILITY=VISIBILITY, THUMBNAIL_FILENAME=THUMBNAIL_FILENAME, DESCRIPTION=DESCRIPTION, TAGS=TAGS ) # Check if files exist if not os.path.isfile(os.path.join(self.UPLOADS_PATH, VIDEO_FILENAME)): raise FileNotFoundError(f"ERROR [VideoService]: The file '{VIDEO_FILENAME}' does not exist") if THUMBNAIL_FILENAME and not os.path.isfile(os.path.join(self.UPLOADS_PATH, THUMBNAIL_FILENAME)): raise FileNotFoundError(f"ERROR [VideoService]: The file '{THUMBNAIL_FILENAME}' does not exist") except Exception as error: # Print error and return message error = error_parser(error) print(error) return { "message": error, "status": 500 } # Upload the files to the server and get the result video_ = self.file_manager.upload_file( TITLE=TITLE, VIDEO_FILENAME=VIDEO_FILENAME, OWNER=OWNER, VISIBILITY=VISIBILITY, THUMBNAIL_FILENAME=THUMBNAIL_FILENAME, DESCRIPTION=DESCRIPTION, TAGS=TAGS ) # Check if 'video_' is a dictionary if isinstance(video_, dict): return video_ # Return the result of 'add_video' method return self.database.add_video(video_=video_)
# *** CREATE PLAYLIST *** #
[docs] def create_playlist(self, TITLE: str, OWNER: str, VISIBILITY: str, DESCRIPTION: str = None, TAGS: list[str] = None, ) -> dict: """ Create Playlist =============== Function to create a playlist. Parameters ---------- TITLE : str Title of the playlist. OWNER : str Owner of the playlist. VISIBILITY : str Visibility of the playlist. DESCRIPTION : str, optional Description of the playlist. TAGS : list[str], optional Tags of the playlist. Returns ------- dict A dictionary with the result of the operation. """ try: # Set optional arguments as empty strings or lists DESCRIPTION = DESCRIPTION or "" TAGS = TAGS or [""] # Check if arguments are valid args_handling( init=False, TITLE=TITLE, OWNER=OWNER, VISIBILITY=VISIBILITY, DESCRIPTION=DESCRIPTION, TAGS=TAGS ) except Exception as error: # Print error and return message error = error_parser(error) print(error) return { "message": error, "status": 500 } # Return the result of 'add_playlist' method return self.database.add_playlist( # Pass the result of 'create_playlist' method as 'playlist_' playlist_ = Playlist( TITLE=TITLE, OWNER=OWNER, VISIBILITY=VISIBILITY, DESCRIPTION=DESCRIPTION, TAGS=TAGS ) )
# *** SAVE VIDEOS *** #
[docs] def save_videos(self) -> dict: """ Save Videos =========== Function to save videos to the database. Returns ------- dict A dictionary with the result of the operation. """ # Return the result of 'save_videos' method return self.database.save_videos()
# *** SAVE PLAYLISTS *** #
[docs] def save_playlists(self) -> dict: """ Save Playlists ============== Function to save playlists to the database. Returns ------- dict A dictionary with the result of the operation. """ # Return the result of 'save_playlists' method return self.database.save_playlists()
# *** DELETE VIDEO *** #
[docs] def delete_video(self, video_: Video) -> dict: """ Delete Video ============ Function to delete a video. Parameters ---------- video_ : Video Video to delete. Returns ------- dict A dictionary with the result of the operation. """ # Return the result of 'delete_video' method return self.database.delete_video(video_=video_)
# *** DELETE PLAYLIST *** #
[docs] def delete_playlist(self, playlist_: Playlist) -> dict: """ Delete Playlist =============== Function to delete a playlist. Parameters ---------- playlist_ : Playlist Playlist to delete. Returns ------- dict A dictionary with the result of the operation. """ # Return the result of 'delete_playlist' method return self.database.delete_playlist(playlist_=playlist_)
# *** REMOVE VIDEO FROM PLAYLIST *** #
[docs] def remove_video_from_playlist(self, video_: Video, playlist_: Playlist) -> dict: """ Remove Video From Playlist ========================== Function to remove a video from a playlist. Parameters ---------- video_ : Video Video to remove. playlist_ : Playlist Playlist to remove the video from. Returns ------- dict A dictionary with the result of the operation. """ # Return the result of 'remove_video_from_playlist' method return self.database.remove_video_from_playlist(video_=video_, playlist_=playlist_)
# *** ADD VIDEO TO PLAYLIST *** #
[docs] def add_video_to_playlist(self, video_: Video, playlist_: Playlist) -> dict: """ Add Video To Playlist ===================== Function to add a video to a playlist. Parameters ---------- video_ : Video Video to add. playlist_ : Playlist Playlist to add the video to. Returns ------- dict A dictionary with the result of the operation. """ # Return the result of 'add_video_to_playlist' method return self.database.add_video_to_playlist(video_=video_, playlist_=playlist_)
# *** UPDATE LIKES *** #
[docs] def update_likes(self, video_: Video, likes: int) -> dict: """ Update Likes ============ Function to update the likes of a video. Parameters ---------- video_ : Video Video to update. likes : int Number of likes to update. Returns ------- dict A dictionary with the result of the operation. """ try: # Get the index of the video index: int = self.database.get_index(video_=video_) # Update the likes of the video self.database.videos[index].update_likes(likes=likes) # Set message message = { "video": video_, "message": "Likes updated successfully", "status": 200 } except Exception as error: # Parse error and set message error = error_parser(error) print(error) message = { "video": video_.video, "message": error, "status": 500 } return message
# *** UPDATE VIEWS *** #
[docs] def update_views(self, video_: Video, views: int) -> dict: """ Update Views ============ Function to update the views of a video. Parameters ---------- video_ : Video Video to update. views : int Number of views to update. Returns ------- dict A dictionary with the result of the operation. """ try: # Get the index of the video index: int = self.database.get_index(video_=video_) # Update the views of the video self.database.videos[index].update_views(views=views) # Set message message = { "video": video_, "message": "Views updated successfully", "status": 200 } except Exception as error: # Parse error and set message error = error_parser(error) print(error) message = { "video": video_.video, "message": error, "status": 500 } return message