Advertisement
clockworkpc

Fetch gdata, Parse Video Title, and Much More with Python

Jun 13th, 2013
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. # Create time-stamp string for folder and file names
  16. now = datetime.datetime.now()
  17. nowstring = str(now.strftime("%Y-%m-%d_%A_%H%M%S"))
  18.  
  19. # Define the folders and file names to be used
  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. #Create date-stamped folders
  36. os.system("mkdir " + namedVideosFolderDateStamped)
  37. os.system("mkdir " + mp3Folder)
  38. os.system("mkdir " + videoDataFolderDatestamped)
  39.  
  40. # Match only videos that haven't already been saved
  41. a = os.listdir(tubemixingFolder)
  42. b = os.listdir(originalVideosFolder)
  43. c = open(originalVideosList, "r")
  44. d = c.read()
  45. e = [x for x in a if x not in d]
  46. print e
  47.  
  48. #Replenish list
  49. #f = open(originalVideosList, "a")
  50. #f.write(str(os.listdir(originalVideosFolder)))
  51. #f.close()
  52.  
  53. # Match only videos that haven't already been saved (replaced)
  54. #a = os.listdir(tubemixingFolder)
  55. #b = os.listdir(originalVideosFolder)
  56. #c = [x for x in a if x not in b]
  57.  
  58. # File-only os.listdir
  59. def saveFolder_files_list():
  60.     for file in os.listdir(saveFolder):
  61.         if os.path.isfile(os.path.join(saveFolder,file)):
  62.             return file
  63.  
  64. def files_only(saveFolder):
  65.     return [filename for filename in os.listdir(saveFolder) if os.path.isfile(os.path.join(saveFolder, filename))]
  66.  
  67. def files_only(videoDataFolderDatestamped):
  68.     return [filename for filename in os.listdir(videoDataFolderDatestamped) if os.path.isfile(os.path.join(videoDataFolderDatestamped, filename))]
  69.  
  70. # Copy NEW videos from Tubemixing temp folder to working folder
  71. #for file in c:
  72. for file in e:
  73.     shutil.copyfile(tubemixingFolder+file,saveFolder+file)
  74. # Update list of saved videos
  75. g = open(originalVideosList, "a")
  76. g.write(str(e))
  77. g.close()
  78.  
  79. # Copy NEW videos to archive folder for future reference (replaced)
  80. #   shutil.copyfile(tubemixingFolder+file,originalVideosFolder+file)
  81.  
  82. # Remove prefix
  83. # NOTE: I set Tubemixing to save by default to 360p.  
  84. # You'll have to tweak it if you save higher resolution by default.
  85. preFix1 = "tubemixing-360p-"
  86. preFix2 = "tubemixing--"
  87.  
  88. #os.listdir(saveFolder)
  89. for filename in files_only(saveFolder):
  90.     if filename.startswith(preFix1):
  91.         os.rename(saveFolder+filename,saveFolder+filename[16:])
  92.  
  93. # Second pass (some files are saved with preFix2)
  94. os.listdir(saveFolder)
  95. for filename in files_only(saveFolder):
  96.     if filename.startswith(preFix2):
  97.         os.rename(saveFolder+filename,saveFolder+filename[12:])
  98.  
  99. # Use gdata to fetch video title from YouTube
  100. for filename in files_only(saveFolder):
  101.     if len(filename) == 11:
  102.         os.system("cd " + videoDataFolderDatestamped + " && wget " + gdataFeed + filename + " " + "-O" + " " + filename)
  103.  
  104. # Parse video title from data fetched from YouTube
  105. print files_only(videoDataFolderDatestamped)
  106. for filename in files_only(videoDataFolderDatestamped):
  107.     f = open(videoDataFolderDatestamped+filename)
  108.     for line in f:
  109.         if "<title type='text'>" in line:
  110.             x = line
  111.             r = re.compile("<title type='text'>(.*?)</title><content")
  112.             m = r.search(x)
  113.             if m:
  114.                 titleInfo = m.group(1)
  115.                 print titleInfo
  116. # Using video title, save properly named and suffixed files in a new date-stamped folder
  117. # Using os.system instead of shutil because shutil is a FUCKING SLOW MEMORY HOG
  118.                 os.system("cp -v " + saveFolder+filename + " " + '"' + namedVideosFolderDateStamped+titleInfo+".webm" + '"')
  119. #                   shutil.copyfile(saveFolder+filename,namedVideosFolderDateStamped+titleInfo+".webm")
  120.  
  121. # Remove code-named video files, because originals have already been saved for reference
  122. # 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.
  123.  
  124. for file in os.listdir(saveFolder):
  125.     os.system("rm -v " + saveFolder + file)
  126.  
  127. # Use AVconv/FFmpeg to extract MP3 audio into the Music folder
  128. for filename in os.listdir(namedVideosFolderDateStamped):
  129.     (str, filename)
  130.     namedVideoFile = namedVideosFolderDateStamped + filename
  131.     print namedVideoFile
  132.  
  133. #   os.system("avconv -i " + '"' + namedVideoFile + '"' + " " + '"' + mp3Folder + filename + '.mp3"')
  134.     os.system("ffmpeg -i " + '"' + namedVideoFile + '"' + " " + '"' + mp3Folder + filename + '.mp3"')
  135.  
  136. # Remove the ".webm" that carries over to the MP3 file name during the AVconv conversion
  137. print
  138. pathiter = (os.path.join(root, filename)
  139.     for root, _, filenames in os.walk(mp3Folder)
  140.     for filename in filenames
  141. )
  142. for path in pathiter:
  143.     newname =  path.replace('.webm', '')
  144.     if newname != path:
  145.         os.rename(path,newname)
  146.  
  147. # Clear empty folders from directories that tend to get cluttered
  148. work_path1 = os.getenv("HOME") + "/Videos/tubemixing/NamedVideos/"
  149. work_path2 = os.getenv("HOME") + "/Music/tubemixing/"
  150.  
  151. def clear_named_videos_folders():
  152.     for file in os.listdir(work_path1):
  153.         if not os.listdir(work_path1+file):
  154.             print "empty"
  155.             os.rmdir(work_path1+file)
  156.         else:
  157.             print "not empty"
  158.  
  159. def clear_avconv_mp3_folders():
  160.     for file in os.listdir(work_path2):
  161.         if not os.listdir(work_path2+file):
  162.             print "empty"
  163.             os.rmdir(work_path2+file)
  164.         else:
  165.             print "not empty"
  166.  
  167. clear_named_videos_folders()
  168. clear_avconv_mp3_folders()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement