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"') |