Advertisement
steili

Series Organizer

Jun 1st, 2011
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.12 KB | None | 0 0
  1. #                            Series Organizer - Steinar Lima                                #
  2. #                                                                                           #
  3. #  Change path to your designatedroot folder, and let the script move files from the root   #
  4. #                         to mathcing folders in the root folder.                           #
  5.  
  6.  
  7.  
  8. import os
  9. import shutil
  10.  
  11. # Obtains filenames and folder names
  12.  
  13. def getFolderFileNames(path):
  14.     folderList = list()
  15.     fileList = list()
  16.    
  17.     for root, dirs, files in os.walk(path):
  18.         if root == path:
  19.             for i in range(len(dirs)):
  20.                 nameSplit = dirs[i].replace('.', ' ').lower()
  21.                 nameSplit = nameSplit.split(' ')
  22.                 folderName = dirs[i]
  23.                 folderPath = os.path.join(path, folderName)    
  24.            
  25.                 folderList.append((folderPath, nameSplit, folderName))
  26.                
  27.             for i in range(len(files)):
  28.                 nameSplit = files[i].replace('.', ' ').lower()
  29.                 nameSplit = nameSplit.split(' ')
  30.                 fileName = files[i]
  31.                 filePath = os.path.join(path, fileName)    
  32.  
  33.                 fileList.append((filePath, nameSplit, fileName))
  34.  
  35.             break
  36.  
  37.     return folderList, fileList
  38.  
  39.  
  40. # Check wether if the folder words are contained in the file string
  41.  
  42. def checkWords(folderList, fileList, seriesFolder):
  43.  
  44.     def getSubFolder(folder, filee, seriesFolder):
  45.         if seriesFolder == False:
  46.             return ''
  47.         else:
  48.             seriesNo = re.findall('[sS][0-9][0-9]?', filee[2])
  49.             if seriesNo:
  50.                 return folder[2] + ' ' + seriesNo[0].upper()
  51.  
  52.             else:
  53.                 return ''
  54.        
  55.     moveFileList = list()
  56.    
  57.     for folder in folderList:
  58.         for filee in fileList:
  59.              if fileEqFolder(folder, filee):
  60.                  subFolder = getSubFolder(folder, filee, seriesFolder)
  61.                  folderRelPath = os.path.join(folder[2], subFolder)
  62.                  folderPath = os.path.join(folder[0], subFolder)
  63.                  fileName = filee[2]
  64.                  oldPath = filee[0]
  65.                  newPath = os.path.join(folder[0], subFolder, fileName)
  66.  
  67.                  moveFileList.append((oldPath, newPath, fileName, folderRelPath, folderPath))
  68.     return moveFileList
  69.  
  70.  
  71.  
  72.  
  73. def fileEqFolder(folder, filee):
  74.     for word in folder[1]:
  75.         if word not in filee[1]:
  76.             return 0
  77.     return 1
  78.  
  79. # Confirms the move, and ask additional question if the file already is on target folder
  80.  
  81. def confirmMove(moveFileList):
  82.     print 'Found {0} suitable file(s) for moving:'.format(len(moveFileList))
  83.     print ''
  84.  
  85.     for index, mFile in enumerate(moveFileList):
  86.         print '{0}: \'{1}\' -> \'{2}\''.format(index, mFile[2], mFile[3] + '\\')
  87.  
  88.     print ''
  89.        
  90.     for index, mFile in enumerate(moveFileList):
  91.         txtStr = 'Move {0}? (yes\\no) '.format(index)
  92.         move = raw_input(txtStr)
  93.  
  94.         if move == 'yes':
  95.             if os.path.isfile(mFile[1]):
  96.                 print '\tFile already excists!'
  97.                 cont = raw_input('\tProceed (the old file will be overwritten)? (yes\\no) ')
  98.                 if cont != 'yes':
  99.                     moveFileList[index] = (None, None)
  100.         else:
  101.             moveFileList[index] = (None, None)
  102.  
  103.  
  104. # Move the confirmed files to the chosen folder
  105.  
  106. def moveFiles(moveFileList):
  107.     print 'Moving files...'
  108.  
  109.     for mFile in moveFileList:
  110.         oldPath = mFile[0]
  111.         newPath = mFile[1]
  112.  
  113.         print '\tMoving:\t{0}\n\tto\n\t{1}'.format(oldPath, newPath)
  114.  
  115.         if os.path.isdir(mFile[4]) == False:
  116.             os.makedirs(mFile[4])
  117.  
  118.         try:
  119.             shutil.move(oldPath, newPath)
  120.         except shutil.Error:
  121.             print 'Path not writeable, please change permissions on target folder'
  122.         except WindowsError:
  123.             print 'File is probably beeing used by another program'
  124.         else:
  125.             print '\tFile moved, OK!'
  126.             print ''
  127.  
  128.         try:
  129.             f = open('log.txt', 'a')
  130.         except IOError:
  131.             print 'Cannot open log file for writing'
  132.         else:
  133.             f.write('{0} moved to {1}\n'.format(oldPath, newPath))
  134.             f.close()
  135.  
  136.         print '-------------------------------------------------------------------'
  137.         print ''
  138.  
  139.  
  140. def runProgram(path, seriesFolder):
  141.     folderList, fileList = getFolderFileNames(path)
  142.     moveFileList = checkWords(folderList, fileList, seriesFolder)
  143.  
  144.     if len(moveFileList):
  145.         confirmMove(moveFileList)
  146.         moveFileList = filter(lambda a: a != (None, None), moveFileList)                
  147.         if len(moveFileList):
  148.             moveFiles(moveFileList)
  149.             print len(moveFileList), 'files moved from ', path
  150.         else:
  151.             print '0 files moved from ', path
  152.     else:
  153.         print '0 files moved from ', path    
  154.  
  155. # Main script
  156.  
  157.    
  158. paths = ['F:\Series']
  159.  
  160. seriesFolders = True
  161. moveConf = True
  162. overwriteConf = True
  163.  
  164. for path in paths:
  165.     runProgram(path, seriesFolders)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement