yurez_nsk

FB2 books rename

Jun 13th, 2016
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.18 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3.  
  4. # источник/назначение
  5. dname_src = 'src'
  6. dname_dst = 'dst'
  7.  
  8. # формат
  9. fmt = '{0} {1} - {2}.fb2'
  10.  
  11. # аргументы
  12. args = [
  13.   ['title-info', 'author', 'first-name'],
  14.   ['title-info', 'author', 'last-name'],
  15.   ['title-info', 'book-title'],
  16. ]
  17.  
  18. # режим работы
  19. mode = 'emulation' # только сообщения
  20. #mode = 'copyFile'  # скопировать файлы
  21. #mode = 'moveFile'  # переместить файлы
  22.  
  23. ###
  24.  
  25. import re
  26. import os
  27. import shutil
  28. from xml.dom import minidom
  29.  
  30. def getFirst(node, key):
  31.   lst = node.getElementsByTagName(key)
  32.   return lst[0] if lst else None
  33.  
  34. def getText(node, key, ns):
  35.   node = getFirst(node, key, ns)
  36.   return node.text if node is not None else ''
  37.  
  38. def solveArg(node, args):
  39.   path = []
  40.   for arg in args:
  41.     path.append(arg)
  42.     node = getFirst(node, arg)
  43.     assert node, "Can't find node '{0}'".format('/'.join(path))
  44.   return node.firstChild.data
  45.  
  46. def parse(fname, fmt, args):
  47.   root = minidom.parse(fname)
  48.   assert root, "Can't open file '{0}'".format(fname)
  49.   args = [solveArg(root, a) for a in args]
  50.   fname = fmt.format(*args)
  51.   return fname
  52.  
  53. def makeDirs(dname):
  54.   if os.path.exists(dname) == False:
  55.     os.makedirs(dname)
  56.  
  57. def modifyFile_emulation(src, dst):
  58.     print('{0} -> {1}'.format(src, dst))
  59.  
  60. def modifyFile_copyFile(src, dst):
  61.   makeDirs(os.path.dirname(dst))
  62.   shutil.copyfile(src, dst)
  63.   modifyFile_emulation(src, dst)
  64.  
  65. def modifyFile_moveFile(src, dst):
  66.   makeDirs(os.path.dirname(dst))
  67.   shutil.move(src, dst)
  68.   modifyFile_emulation(src, dst)
  69.  
  70. modifyFile = {
  71.   "emulation": modifyFile_emulation,
  72.   "copyFile":  modifyFile_copyFile,
  73.   "moveFile":  modifyFile_moveFile,
  74. }[mode]
  75.  
  76. for dname, dnames, fnames in os.walk(dname_src):
  77.   for fname in fnames:
  78.     if fname[-4:].lower() == '.fb2':
  79.       try:
  80.         fname_src = os.path.join(dname, fname)
  81.         fname_dst = parse(fname_src, fmt, args)
  82.         dst = dname_dst + dname[len(dname_src):]
  83.         dst = os.path.join(dst, fname_dst)
  84.         modifyFile(fname_src, dst)
  85.       except Exception as e:
  86.         print('{0}: {1}'.format(fname_src, e))
Advertisement
Add Comment
Please, Sign In to add comment