concatGOPRO.py 2.2 KB

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