SHOW:
|
|
- or go back to the newest paste.
| 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 | ||
| 33 | #Create date-stamped folders | |
| 34 | os.system("mkdir " + namedVideosFolderDateStamped)
| |
| 35 | os.system("mkdir " + mp3Folder)
| |
| 36 | os.system("mkdir " + videoDataFolderDatestamped)
| |
| 37 | ||
| 38 | # Match only videos that haven't already been saved | |
| 39 | a = os.listdir(tubemixingFolder) | |
| 40 | b = os.listdir(originalVideosFolder) | |
| 41 | c = [x for x in a if x not in b] | |
| 42 | ||
| 43 | # File-only os.listdir | |
| 44 | def saveFolder_files_list(): | |
| 45 | for file in os.listdir(saveFolder): | |
| 46 | if os.path.isfile(os.path.join(saveFolder,file)): | |
| 47 | return file | |
| 48 | ||
| 49 | def files_only(saveFolder): | |
| 50 | return [filename for filename in os.listdir(saveFolder) if os.path.isfile(os.path.join(saveFolder, filename))] | |
| 51 | ||
| 52 | def files_only(videoDataFolderDatestamped): | |
| 53 | return [filename for filename in os.listdir(videoDataFolderDatestamped) if os.path.isfile(os.path.join(videoDataFolderDatestamped, filename))] | |
| 54 | ||
| 55 | # Copy NEW videos from Tubemixing temp folder to working folder | |
| 56 | for file in c: | |
| 57 | shutil.copyfile(tubemixingFolder+file,saveFolder+file) | |
| 58 | # Copy NEW videos to archive folder for future reference | |
| 59 | shutil.copyfile(tubemixingFolder+file,originalVideosFolder+file) | |
| 60 | ||
| 61 | # Remove prefix | |
| 62 | # NOTE: I set Tubemixing to save by default to 360p. | |
| 63 | # You'll have to tweak it if you save higher resolution by default. | |
| 64 | preFix1 = "tubemixing-360p-" | |
| 65 | preFix2 = "tubemixing--" | |
| 66 | ||
| 67 | #os.listdir(saveFolder) | |
| 68 | for filename in files_only(saveFolder): | |
| 69 | if filename.startswith(preFix1): | |
| 70 | os.rename(saveFolder+filename,saveFolder+filename[16:]) | |
| 71 | ||
| 72 | # Second pass (some files are saved with preFix2) | |
| 73 | os.listdir(saveFolder) | |
| 74 | for filename in files_only(saveFolder): | |
| 75 | if filename.startswith(preFix2): | |
| 76 | os.rename(saveFolder+filename,saveFolder+filename[12:]) | |
| 77 | ||
| 78 | # Use gdata to fetch video title from YouTube | |
| 79 | for filename in files_only(saveFolder): | |
| 80 | if len(filename) == 11: | |
| 81 | os.system("cd " + videoDataFolderDatestamped + " && wget " + gdataFeed + filename + " " + "-O" + " " + filename)
| |
| 82 | ||
| 83 | # Parse video title from data fetched from YouTube | |
| 84 | print files_only(videoDataFolderDatestamped) | |
| 85 | for filename in files_only(videoDataFolderDatestamped): | |
| 86 | f = open(videoDataFolderDatestamped+filename) | |
| 87 | for line in f: | |
| 88 | if "<title type='text'>" in line: | |
| 89 | x = line | |
| 90 | r = re.compile("<title type='text'>(.*?)</title><content")
| |
| 91 | m = r.search(x) | |
| 92 | if m: | |
| 93 | titleInfo = m.group(1) | |
| 94 | print titleInfo | |
| 95 | # Using video title, save properly named and suffixed files in a new date-stamped folder | |
| 96 | - | for filename in files_only(saveFolder): |
| 96 | + | # Using os.system instead of shutil because shutil is a FUCKING SLOW MEMORY HOG |
| 97 | - | shutil.copyfile(saveFolder+filename,namedVideosFolderDateStamped+titleInfo+".webm") |
| 97 | + | os.system("cp -v " + saveFolder+filename + " " + '"' + namedVideosFolderDateStamped+titleInfo+".webm" + '"')
|
| 98 | # shutil.copyfile(saveFolder+filename,namedVideosFolderDateStamped+titleInfo+".webm") | |
| 99 | ||
| 100 | # Remove code-named video files, because originals have already been saved for reference | |
| 101 | # 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. | |
| 102 | ||
| 103 | for file in os.listdir(saveFolder): | |
| 104 | os.system("rm -v " + saveFolder + file)
| |
| 105 | ||
| 106 | # Use AVconv (FFmpeg) to extract MP3 audio into the Music folder | |
| 107 | for filename in os.listdir(namedVideosFolderDateStamped): | |
| 108 | (str, filename) | |
| 109 | namedVideoFile = namedVideosFolderDateStamped + filename | |
| 110 | print namedVideoFile | |
| 111 | ||
| 112 | os.system("avconv -i " + '"' + namedVideoFile + '"' + " " + '"' + mp3Folder + filename + '.mp3"') |