5 from optparse
import OptionParser
6 from tag_wrapper
import tag
8 ACCEPTEXTS
= [".ogg", ".mp3"] # Keep it simple for now
10 def issupportedfile(name
):
11 for ext
in ACCEPTEXTS
:
12 if os
.path
.splitext(name
)[1] == ext
:
16 def newpath(file, target
, pattern
):
17 # Create the tokens dictionary
20 # TODO: add tracknumber, disknumber and possibily compilation
21 for t
in ["title", "artist", "album artist", "album", "composer", "genre", "date"]:
26 # %album artist% is %artist% if nothing can be found in the tags
27 if tokens
["album artist"] == None:
28 tokens
["album artist"] = tokens
["artist"]
30 # That appears in no tag
31 tokens
["base"] = target
33 # Now replace all tokens by their values
37 pattern
= pattern
.replace(repl
, tokens
[i
][0])
39 # Add the extension and return the new path
40 return pattern
+ os
.path
.splitext(file)[1]
42 def safeprint(string
):
44 Print string first trying to normally encode it, sending it to the
45 console in "raw" UTF-8 if it fails.
47 This is a workaround for Windows's broken console
51 except UnicodeEncodeError:
52 print string
.encode("utf-8")
54 def files_to_move(base_dir
, pattern
, target_dir
=None, recursive
=False):
56 Figure out which files to move where
58 if target_dir
== None:
61 basepath
= path(base_dir
)
63 files
= basepath
.walkfiles()
65 files
= basepath
.files()
67 # This list will later contain all the (origin, destination) tuples
71 if issupportedfile(file):
72 t
= [ file, newpath(file, target_dir
, pattern
) ]
73 files_return
.append(t
)
79 usage
= "Usage: %prog [options] directory pattern"
80 parser
= OptionParser(usage
=usage
)
81 parser
.add_option("-a", "--action", dest
="action",
82 help="action to execute. Possible values: preview (default), move, copy", default
="preview")
83 parser
.add_option("-r", "--recursive", action
="store_true",
84 dest
="recursive", help="also move/copy files from sub-directories", default
=False)
85 parser
.add_option("-t", "--target", dest
="target",
86 help="create new directory structure in directory TARGET (default=directory)")
87 (options
, args
) = parser
.parse_args()
92 print "You must specify a directory"
98 print "You must specify a pattern"
101 for i
in files_to_move(target_dir
=options
.target
, base_dir
=base
,
102 pattern
=pattern
, recursive
=options
.recursive
):
103 if options
.action
== "preview":
104 safeprint (i
[0] + " --> " + i
[1])
105 elif options
.action
== "move":
107 elif options
.action
== "copy":
110 print "Invalid value for \"action\""
113 if __name__
== "__main__":