diff --git a/scripts/move2folder.py b/scripts/move2folder.py new file mode 100755 index 0000000..3527adb --- /dev/null +++ b/scripts/move2folder.py @@ -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()