Advertisement
clockworkpc

Save videos, fetch gdata, rename, convert to MP3, clean up

Jun 11th, 2013
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.52 KB | None | 0 0
  1. #!/usr/bin/python
  2. #/home/clockworkpc/bin/tubemixingsave.py
  3.  
  4. # Released under a GPLv3 Licence by Clockwork PC 2013
  5. # www.clockworkpc.com.au
  6.  
  7. # You are entitled to the following four freedoms:
  8. # Freedom 0: To run this program for any purpose
  9. # Freedom 1: To study how this program works and change it to make it do what you wish
  10. # Freedom 2: To redistribute copies so you can help your neighbour
  11. # Freedom 3: To distribute copies of your modified version to others
  12.  
  13. import os, datetime, re, shutil
  14.  
  15. now = datetime.datetime.now()
  16. nowstring = str(now.strftime("%Y-%m-%d_%A_%H%M%S"))
  17.  
  18. #print nowstring
  19.  
  20. tubemixingFolder = "/tmp/tubemixing/"
  21. videoFolder = os.getenv("HOME") + "/Videos/"
  22. saveFolder = videoFolder + "tubemixing/"
  23. originalVideosFolder = saveFolder + "OriginalVideos/"
  24. namedVideosFolder = saveFolder + "NamedVideos/"
  25. namedVideosFolderDateStamped = namedVideosFolder + nowstring + "/"
  26. videoListsFolder = saveFolder + "VideoLists/"
  27. videoListsFile = videoListsFolder + nowstring
  28. videoDataFolder = saveFolder + "gdata_text_files/"
  29. videoDataFolderDatestamped = saveFolder + "gdata_text_files/" + nowstring + "/"
  30. mp3Folder = os.getenv("HOME") + "/Music/tubemixing/" + nowstring + "/"
  31. gdataFeed = "http://gdata.youtube.com/feeds/api/videos/"
  32. originalVideosList = originalVideosFolder + "original_videos_list"
  33. originalVideosListBackup = originalVideosFolder + "original_videos_list_" + nowstring + ".backup"
  34.  
  35. #Check for new videos in Tubemixing /tmp folder
  36. def check_for_video_list():
  37.     running = True
  38.     for names in os.listdir(originalVideosFolder):
  39.         if names.startswith("original_videos_list"):
  40.             if not names.endswith(".backup"):
  41.                 print "found original"
  42.                 os.system("cp -v " + originalVideosList + " " + originalVideosListBackup)
  43.                 running = False
  44. check_for_video_list()
  45.  
  46. #Create date-stamped folders
  47. os.system("mkdir " + namedVideosFolderDateStamped)
  48. os.system("mkdir " + mp3Folder)
  49. os.system("mkdir " + videoDataFolderDatestamped)
  50.  
  51. # Match only videos that haven't already been saved
  52. a = os.listdir(tubemixingFolder)
  53. b = os.listdir(originalVideosFolder)
  54. c = open(originalVideosList, "r")
  55. d = c.read()
  56. e = [x for x in a if x not in d]
  57. print e
  58.  
  59. #Replenish list
  60. #f = open(originalVideosList, "a")
  61. #f.write(str(os.listdir(originalVideosFolder)))
  62. #f.close()
  63.  
  64. # Match only videos that haven't already been saved (replaced)
  65. #a = os.listdir(tubemixingFolder)
  66. #b = os.listdir(originalVideosFolder)
  67. #c = [x for x in a if x not in b]
  68.  
  69. # File-only os.listdir
  70. def saveFolder_files_list():
  71.     for file in os.listdir(saveFolder):
  72.         if os.path.isfile(os.path.join(saveFolder,file)):
  73.             return file
  74.  
  75. def files_only(saveFolder):
  76.     return [filename for filename in os.listdir(saveFolder) if os.path.isfile(os.path.join(saveFolder, filename))]
  77.  
  78. def files_only(videoDataFolderDatestamped):
  79.     return [filename for filename in os.listdir(videoDataFolderDatestamped) if os.path.isfile(os.path.join(videoDataFolderDatestamped, filename))]
  80.  
  81. # Copy NEW videos from Tubemixing temp folder to working folder
  82. #for file in c:
  83. for file in e:
  84.     shutil.copyfile(tubemixingFolder+file,saveFolder+file)
  85. # Update list of saved videos
  86. g = open(originalVideosList, "a")
  87. g.write(str(e))
  88. g.close()
  89.  
  90. # Copy NEW videos to archive folder for future reference (replaced)
  91. #   shutil.copyfile(tubemixingFolder+file,originalVideosFolder+file)
  92.  
  93. # Remove prefix
  94. # NOTE: I set Tubemixing to save by default to 360p.  
  95. # You'll have to tweak it if you save higher resolution by default.
  96. preFix1 = "tubemixing-360p-"
  97. preFix2 = "tubemixing--"
  98.  
  99. #os.listdir(saveFolder)
  100. for filename in files_only(saveFolder):
  101.     if filename.startswith(preFix1):
  102.         os.rename(saveFolder+filename,saveFolder+filename[16:])
  103.  
  104. # Second pass (some files are saved with preFix2)
  105. os.listdir(saveFolder)
  106. for filename in files_only(saveFolder):
  107.     if filename.startswith(preFix2):
  108.         os.rename(saveFolder+filename,saveFolder+filename[12:])
  109.  
  110. # Use gdata to fetch video title from YouTube
  111. for filename in files_only(saveFolder):
  112.     if len(filename) == 11:
  113.         os.system("cd " + videoDataFolderDatestamped + " && wget " + gdataFeed + filename + " " + "-O" + " " + filename)
  114.  
  115. # Parse video title from data fetched from YouTube
  116. print files_only(videoDataFolderDatestamped)
  117. for filename in files_only(videoDataFolderDatestamped):
  118.     f = open(videoDataFolderDatestamped+filename)
  119.     for line in f:
  120.         if "<title type='text'>" in line:
  121.             x = line
  122.             r = re.compile("<title type='text'>(.*?)</title><content")
  123.             m = r.search(x)
  124.             if m:
  125.                 titleInfo = m.group(1)
  126.                 print titleInfo
  127. # Using video title, save properly named and suffixed files in a new date-stamped folder
  128. # Using os.system instead of shutil because shutil is a FUCKING SLOW MEMORY HOG
  129.                 os.system("cp -v " + saveFolder+filename + " " + '"' + namedVideosFolderDateStamped+titleInfo+".webm" + '"')
  130. #                   shutil.copyfile(saveFolder+filename,namedVideosFolderDateStamped+titleInfo+".webm")
  131.  
  132. # Remove code-named video files, because originals have already been saved for reference
  133. # Unfortunately, the best I can do is use the clumsy rm command, which tries, but fails, to delete folders.  This is not the way to go, but I can't find a more elegant way of clearing the working folder.
  134.  
  135. for file in os.listdir(saveFolder):
  136.     os.system("rm -v " + saveFolder + file)
  137.  
  138. # Use AVconv (FFmpeg) to extract MP3 audio into the Music folder
  139. for filename in os.listdir(namedVideosFolderDateStamped):
  140.     (str, filename)
  141.     namedVideoFile = namedVideosFolderDateStamped + filename
  142.     print namedVideoFile
  143.  
  144.     os.system("avconv -i " + '"' + namedVideoFile + '"' + " " + '"' + mp3Folder + filename + '.mp3"')
  145.  
  146. # Remove the ".webm" that carries over to the MP3 file name during the AVconv conversion
  147.  
  148. print
  149. pathiter = (os.path.join(root, filename)
  150.     for root, _, filenames in os.walk(mp3Folder)
  151.     for filename in filenames
  152. )
  153. for path in pathiter:
  154.     newname =  path.replace('.webm', '')
  155.     if newname != path:
  156.         os.rename(path,newname)
  157.  
  158. # Clear empty folders from directories that tend to get cluttered
  159. work_path1 = os.getenv("HOME") + "/Videos/tubemixing/NamedVideos/"
  160. work_path2 = os.getenv("HOME") + "/Music/tubemixing/"
  161.  
  162. def clear_named_videos_folders():
  163.     for file in os.listdir(work_path1):
  164.         if not os.listdir(work_path1+file):
  165.             print "empty"
  166.             os.rmdir(work_path1+file)
  167.         else:
  168.             print "not empty"
  169.  
  170. def clear_avconv_mp3_folders():
  171.     for file in os.listdir(work_path2):
  172.         if not os.listdir(work_path2+file):
  173.             print "empty"
  174.             os.rmdir(work_path2+file)
  175.         else:
  176.             print "not empty"
  177.  
  178. clear_named_videos_folders()
  179. clear_avconv_mp3_folders()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement