concatGOPRO.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import os
  2. import sys
  3. import shutil
  4. import PySimpleGUI as sg
  5. def getVideoList(dir: str) -> dict[list[list, str]]:
  6. all_videos = dict()
  7. video_formats = set(["mp4", "MP4"])
  8. all_files = os.listdir(dir)
  9. for file_name in all_files:
  10. try:
  11. isG = file_name[0]
  12. code_type = file_name[1]
  13. ext_name = file_name[-3:]
  14. # video_chapter = file_name[2:4]
  15. video_idx = file_name[4:8]
  16. except IndexError:
  17. continue
  18. # GoPro files start with "G"
  19. if isG == 'G' and ext_name in video_formats:
  20. try:
  21. all_videos[video_idx][0].append(file_name)
  22. except KeyError:
  23. all_videos[video_idx] = [[file_name], code_type]
  24. # sort the chapters
  25. for video in all_videos.keys():
  26. all_videos[video][0] = sorted(all_videos[video][0])
  27. return all_videos
  28. def pathValidation(source_dir, output_dir):
  29. if not os.path.isdir(source_dir):
  30. return False
  31. if not os.path.isdir(output_dir):
  32. try:
  33. os.mkdir(output_dir)
  34. except:
  35. raise OSError("Faild to create the output folder.")
  36. return True
  37. def doTheJob(source_dir, output_dir):
  38. if pathValidation(source_dir, output_dir):
  39. videos = getVideoList(source_dir)
  40. chaptered_video_num = 0
  41. # print(videos)
  42. try:
  43. os.mkdir("temp")
  44. except FileExistsError:
  45. pass
  46. for name in videos.keys():
  47. if len(videos[name][0]) > 1:
  48. chaptered_video_num += 1
  49. os.chdir(output_dir)
  50. os.chdir("temp")
  51. with open(f"{name}.join", 'w') as file:
  52. chapters = videos[name][0]
  53. for c in chapters:
  54. file.write(f"file '{source_dir}/{c}'\n")
  55. status = os.system(
  56. f"ffmpeg -f concat -safe 0 -i {name}.join -c copy ../GX01{name}.mp4")
  57. if status:
  58. raise OSError("Something Goes Wrong With FFmpeg.")
  59. os.chdir(output_dir)
  60. try:
  61. shutil.rmtree('temp')
  62. except FileNotFoundError:
  63. pass
  64. sg.Window('Done', [[sg.T(f"Detected {len(videos.keys())} videos, {chaptered_video_num} are(is) chaptered.")], [
  65. sg.Ok()]], disable_close=True).read(close=True)
  66. else:
  67. sg.popup_error("Invalid Path")
  68. raise FileNotFoundError("Invalid Path")
  69. if __name__ == "__main__":
  70. try:
  71. _, source_dir, output_dir = sys.argv
  72. doTheJob(source_dir, output_dir)
  73. except ValueError:
  74. doTheJob(sg.popup_get_folder('Please enter an input path'),
  75. sg.popup_get_folder('Please enter an output path'))