Переглянути джерело

Merge pull request #52 from BassThatHertz/master

Improved filenames before organizing the MP4 files.
Cammy 6 роки тому
батько
коміт
944f8cd85f
1 змінених файлів з 115 додано та 73 видалено
  1. 115 73
      pyinstalive/organize.py

+ 115 - 73
pyinstalive/organize.py

@@ -1,74 +1,116 @@
-import os
-import shutil
-try:
-    import pil
-    import logger
-except ImportError:
-    from . import pil
-    from . import logger
-
-def organize_videos():
-
-    try:
-        # Make a variable equal to the names of the files in the current directory.
-        current_dir_files = os.listdir(pil.dl_path)
-
-        # Count the amount of files moved and not moved because they already exist etc.
-        not_moved = 0
-        has_moved = 0
-
-        # The downloaded livestream(s) are in MP4 format.
-        video_format = ['mp4']
-
-        # Find the MP4 files and save them in a variable called 'filenames'.
-        filenames = [os.path.join(pil.dl_path, filename) for filename in current_dir_files
-            if filename.split('.')[-1] in video_format]
-
-        if len(filenames) == 0:
-            logger.binfo("No files were found to organize.")
-            logger.separator()
-            return
-
-        # We want a dictionary where the filenames are the keys
-        # and the usernames are the values.
-        filenames_to_usernames = {}
-
-        # Populate the dictionary by going through each filename and removing the
-        # undesired characters, leaving just the usernames.
-        for filename in filenames:
-            filename_parts = filename.split('_')[1:-3]
-            usernames = '_'.join(filename_parts)
-            filenames_to_usernames[filename] = usernames
-            
-        # The usernames are the values of the filenames_to_usernames dictionary.
-        usernames = set(filenames_to_usernames.values())
-
-        # Make a folder for each username.
-        for username in usernames:
-            username_path = os.path.join(pil.dl_path, username)
-            if not os.path.isdir(username_path):
-                os.mkdir(username_path)
-
-        # Move the videos into the folders
-        for filename, username in filenames_to_usernames.items():
-            filename_base = os.path.basename(filename)
-            destination_path = os.path.join(pil.dl_path, username, filename_base)
-            if not os.path.isfile(destination_path):
-                try:
-                    shutil.move(filename, destination_path)
-                    logger.info("Moved '{:s}' successfully.".format(filename_base))
-                    has_moved += 1
-                except OSError as oe:
-                    logger.warn("Could not move {:s}: {:s}".format(filename_base, str(oe)))
-                    not_moved += 1
-            else:
-                logger.binfo("Did not move '{:s}' because it already exists.".format(filename_base))
-                not_moved += 1
-
-        logger.separator()
-        logger.info("{} {} moved.".format(has_moved, "file was" if has_moved == 1 else "files were"))
-        if not_moved:
-            logger.binfo("{} {} not moved.".format(not_moved, "file was" if not_moved == 1 else "files were"))
-        logger.separator()
-    except Exception as e:
+import os
+import shutil
+from datetime import datetime
+import time
+try:
+    import pil
+    import logger
+except ImportError:
+    from . import pil
+    from . import logger
+
+def organize_videos():
+
+    try:
+        # Make a variable equal to the names of the files in the current directory.
+        download_path_files = os.listdir(pil.dl_path)
+
+        # Count the amount of files moved and not moved because they already exist etc.
+        not_moved = 0
+        has_moved = 0
+
+        # The downloaded livestream(s) are in MP4 format.
+        video_format = ['mp4']
+
+        # Find the MP4 files and save them in a variable called 'filenames'.
+        filenames = [filename for filename in download_path_files
+            if filename.split('.')[-1] in video_format]
+        
+        if len(filenames) == 0:
+            logger.binfo("No files were found to organize.")
+            logger.separator()
+            return
+
+        for filename in filenames:
+            # Split the filenames into parts.
+            filename_parts = filename.split('_')
+
+            # Get the date from the filename.
+            date = datetime.strptime(filename_parts[0], '%Y%m%d').strftime('%d-%m-%Y')
+
+            # Get the username from the filename. 
+            username = '_'.join(filename_parts[1:-3])
+
+            # Get the time from the unix timestamp.
+            time_from_unix_timestamp = time.strftime('%I.%M%p', time.localtime(int(filename_parts[-2])))
+
+            # # Remove the leading zero from single-digit hours.
+            if float(time_from_unix_timestamp[0:2]) < 10:
+                time_from_unix_timestamp = time_from_unix_timestamp[1:]
+
+            # Get the last part of the filename ("live.mp4" or "replay.mp4").
+            live_or_replay = filename_parts[-1]
+            
+            # The path of each original filename is as follows:
+            old_filename_path = os.path.join(pil.dl_path, filename)
+
+            # We want to change the format of each filename to:
+            new_filename_format = date + " " + username + " [" + time_from_unix_timestamp + "] " + live_or_replay
+
+            # The path of each new filename is as follows:
+            new_filename_path = os.path.join(pil.dl_path, new_filename_format)
+
+            # Change the filenames.
+            os.rename(old_filename_path, new_filename_path)
+
+        # Now that the files have been renamed, we need to rescan the files in the directory.
+        download_path_files = os.listdir(pil.dl_path)
+
+        new_filenames = [filename for filename in download_path_files if filename.split('.')[-1] in video_format]
+        
+        # We want a dictionary where the filenames are the keys
+        # and the usernames are the values.
+        filenames_to_usernames = {}
+
+        # Populate the dictionary with a loop.
+        for filename in new_filenames:
+            # Split the filenames into parts so we get just the usernames:
+            filename_parts = filename.split()
+            # This is how to get the usernames from the split filenames:
+            username = filename_parts[1]
+            # Filename = key and username = value:
+            filenames_to_usernames[filename] = username
+    
+        # We only want one folder for each username, so convert the list into a set to remove duplicates.
+        usernames = set(filenames_to_usernames.values())
+
+        # Make a folder for each username.
+        for username in usernames:
+            username_path = os.path.join(pil.dl_path, username)
+            if not os.path.isdir(username_path):
+                os.mkdir(username_path)
+
+        # Move the videos into the folders
+        for filename, username in filenames_to_usernames.items():
+            filename_base = os.path.basename(filename)
+            source_path = os.path.join(pil.dl_path, filename)
+            destination_path = os.path.join(pil.dl_path, username, filename_base)
+            if not os.path.isfile(destination_path):
+                try:
+                    shutil.move(source_path, destination_path)
+                    logger.info("Moved '{:s}' successfully.".format(filename_base))
+                    has_moved += 1
+                except OSError as oe:
+                    logger.warn("Could not move {:s}: {:s}".format(filename_base, str(oe)))
+                    not_moved += 1
+            else:
+                logger.binfo("Did not move '{:s}' because it already exists.".format(filename_base))
+                not_moved += 1
+
+        logger.separator()
+        logger.info("{} {} moved.".format(has_moved, "file was" if has_moved == 1 else "files were"))
+        if not_moved:
+            logger.binfo("{} {} not moved.".format(not_moved, "file was" if not_moved == 1 else "files were"))
+        logger.separator()
+    except Exception as e:
         logger.error("Could not organize files: {:s}".format(str(e)))