Move2folder script

Added a script to organize comics in a folder tree by Publisher/Series
(Volume).
This commit is contained in:
fcanc 2015-02-12 19:15:17 +01:00
parent 5574280ad6
commit a6282b5449

113
scripts/move2folder.py Executable file
View File

@ -0,0 +1,113 @@
#!/usr/bin/python
"""
Moves comic files based on metadata organizing in a tree by Publisher/Series (Volume)
"""
"""
This script is based on make_links.py by Anthony Beville
Copyright 2015 Fabio Cancedda, Anthony Beville
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
import sys
import os
import platform
import shutil
from comictaggerlib.comicarchive import *
from comictaggerlib.settings import *
from comictaggerlib.issuestring import *
import comictaggerlib.utils
def make_folder( folder ):
if not os.path.exists( folder ):
try:
os.makedirs(folder)
except Exception as e:
print "{0} Can't make {1} -- quitting".format(e, folder)
quit()
def move_file( source, filename ):
if not os.path.exists( filename ):
shutil.move( os.path.abspath(source) , filename )
def main():
utils.fix_output_encoding()
settings = ComicTaggerSettings()
style = MetaDataStyle.CIX
if platform.system() == "Windows":
print >> sys.stderr, "Sorry, this script works only on UNIX systems"
if len(sys.argv) < 3:
print >> sys.stderr, "usage: {0} comic_root tree_root".format(sys.argv[0])
return
comic_root = sys.argv[1]
tree_root = sys.argv[2]
print "Root is : ", comic_root
if not os.path.exists( comic_root ):
print >> sys.stderr, "The comic root doesn't seem a directory or it doesn't exists. -- quitting"
return
filelist = utils.get_recursive_filelist( [ comic_root ] )
if len(filelist) == 0:
print >> sys.stderr, "The comic root seems empty. -- quitting"
return
make_folder( tree_root )
#first find all comics with metadata
print "Reading in all comics..."
comic_list = []
max_name_len = 2
for filename in filelist:
ca = ComicArchive(filename, settings.rar_exe_path )
if ca.seemsToBeAComicArchive() and ca.hasMetadata( style ):
comic_list.append((filename, ca.readMetadata( style )))
max_name_len = max ( max_name_len, len(filename))
fmt_str = u"{{0:{0}}}".format(max_name_len)
print >> sys.stderr, fmt_str.format( filename ) + "\r",
sys.stderr.flush()
print >> sys.stderr, fmt_str.format( "" )
print "Found {0} tagged comics.".format( len(comic_list))
# walk through the comic list and moves each one
for filename, md in comic_list:
print >> sys.stderr, fmt_str.format( filename ) + "\r",
sys.stderr.flush()
#do publisher/series organizing:
series_name = md.series
publisher_name = md.publisher
start_year = md.volume
if series_name is not None:
# some tweaks to keep various filesystems happy
series_name = series_name.replace(":", " -")
series_name = series_name.replace("/", "-")
series_name = series_name.replace("?", "")
series_folder = os.path.join(tree_root, unicode(publisher_name), unicode(series_name) + " (" + unicode(start_year) + ")")
make_folder( series_folder )
move_file( filename, os.path.join(series_folder, os.path.basename(filename)) )
if __name__ == '__main__':
main()