diff --git a/seasonedFolders.py b/seasonedFolders.py old mode 100755 new mode 100644 index 59cfbd3..2b5e6dd --- a/seasonedFolders.py +++ b/seasonedFolders.py @@ -1,252 +1,18 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # @Author: KevinMidboe -# @Date: 2017-02-23 21:41:40 +# @Date: 2017-03-05 15:55:16 # @Last Modified by: KevinMidboe -# @Last Modified time: 2017-03-04 16:32:35 - -import os, re, shutil, sqlite3 -from fuzzywuzzy import process -from sys import argv -from pprint import pprint - -# TODO Rename file to remove watermark DONE -# Look for subs in file and folder DONE -# What if there are multiple subs -# Add language for subs -# Remove stupid samples -# Import directory based on OS - -# THE PARTS OF SEASONED FOLDER -# DATABASE -# Add show -# Get list of shows -# Add cmdInfoExtractor - -# Parser -# Get files from directory -# Check files not in shows list -# Get best match to the name of file -# Get folder contents - -# cmdInfoExtractor -# NB: Create folder for new seasons -# Folderpath -# Show match -# Episode/Season -# Contents -# mediafiles -# - removed author -# subtitles -# - removed author -# - -# cmdInfoExecuter -# Checks if there is a waiting tweet -# Check for replies for the gives tweets -# If any has reply (y), execute the cmdInfo -# Delete from waiting DB and add to fixed DB - -# Twitter -# twitter - [index] = en -# - [index] - -# - [index] + -# trash -# twitter - [index] + -# - [index] - -# - [index] = - -showDir = '/Volumes/media/tv/' -dbPath = "/Users/KevinMidboe/Dropbox/python/seasonedShows/shows.db" -mediaExtensions = ['mkv', 'mp4', 'avi'] -subExtensions = ['srt'] - -def verifyConnectedDirectory(): - if not os.path.isdir(showDir): - print('Error:', showDir + ' folder not found. Is it mounted?') - exit(0) - -def addShowToDB(name): - if name in getShowNames(): - return False - - conn = sqlite3.connect(dbPath) - c = conn.cursor() - - c.execute('INSERT INTO shows VALUES ("' + str(name) + '"' + ", datetime('now'), datetime('now'))") - - conn.commit() - conn.close() - return True - -def addSubLanguage(file): - f = open('subs/The.Man.from.U.N.C.L.E.2015.1080p-[eztv].srt', 'r', encoding = "UTF-32") - detectedLanguage = detect(f.read()) - -# Removes the uploader name from filename -def removeUploader(file): - match = re.search('-[a-zA-Z\[\]\-]*.[a-z]{3}', file) - - if match and input('Remove uploader:\t' + match.group(0)[:-4] + ' [Y/n] ') != 'n': - uploader, ext = match.group(0).split('.') - # if ext not in subExtensions: - # file = file.replace(uploader, '') - # else: - # file = file.replace(uploader, '.eng') - file = file.replace(uploader, '') - return file - - -def moveEpisode(srcFile, destDir): - os.rename(srcFile, destDir) - -def XOR(list1, list2): - return set(list1) ^ set(list2) - -def getFuzzyNames(query): - return process.extractOne(query, getShowNames().keys()) - -# Finds the correct show name -def getShowNames(): - conn = sqlite3.connect(dbPath) - c = conn.cursor() - - c.execute('SELECT show_names, date_added, date_modified FROM shows') - - returnList = {} - for name, added, modified in c.fetchall(): - returnList[name] = [added, modified] - - conn.close() - return returnList - - # showList = os.listdir(showDir) # Get's list of folders in showDir - - # return process.extractOne(input, showList) - - - - -def getSeasons(show): - existingShowSeasons = os.listdir(showDir + show) - - seasonsList = [] - for season in existingShowSeasons: - # Checks if folder is given format (Season [0-9]{2}$) - if re.search('Season\ [0-9]{2}$', season): - # If re finds a match we append the season folder to seasonsList[] - seasonsList.append(season[-2:]) - - # TODO Return full season name and create list in the if statement at return' - return seasonsList - - -def createEpisodeFolders(show, season, episode, createNew=False): - episodeFormat = '%s S%sE'% (show, season) - seasonFormat = '%s Season %s/' % (show, season) - - seasonDir = showDir + show + '/' + seasonFormat - - # Creates a season folder if none exists for given season value - if createNew == True: - os.makedirs(seasonDir) - - episodeList = os.listdir(seasonDir) - - for i in range(1,int(episode)+1): - i_formatted = '{:02}'.format(i) - if episodeFormat + i_formatted not in episodeList: - os.makedirs(seasonDir + episodeFormat + i_formatted) - print(' ' + episodeFormat + i_formatted) - - -# TODO to only get the stray files. -# Get all folders without spaces and atleast one '.' -def findStray(): - showNames = getShowNames().keys() - folderContents = filter( lambda f: not f.startswith('.'), os.listdir(showDir)) - - XORContent = XOR(folderContents, showNames) - - multipleEpisodeRegex = 'complete|season|\.\S[0-9]{1,2}\.' - - # print(set(folderContents) ^ set(showNames)) - - for file in XORContent: - if re.findall(multipleEpisodeRegex, file.lower()): - print(file, process.extractOne(file, showNames)) - - -def findStrayEpisodes(show, season, episode): - showList = os.listdir(showDir) - - singleEpisodeRegex = re.sub(' ', '.', show) + '.S' + season + 'E' - # Complete season folder : Show + Season | Complete + first(number after show) - multipleEpisodeRegex = 'complete|season' - - for file in showList: - if re.findall(multipleEpisodeRegex, file.lower()) and show in file: - print(file) - - if singleEpisodeRegex in file: - episodeNumber = int(file[len(singleEpisodeRegex):len(singleEpisodeRegex)+2]) - - folderContents = os.listdir(showDir + file) - - for item in folderContents: - if (item[-3:] in subExtensions or item[-3:] in mediaExtensions) and \ - (episodeNumber in list(range(1, int(episode) + 1))): - fileDir = showDir + file + '/' + item - print(item) - item = removeUploader(item) - episodeFolderDir = showDir + show + '/' + show + ' Season ' + season + '/' + \ - show + ' S' + season + 'E' + '{:02}'.format(episodeNumber) + '/' - - moveEpisode(fileDir, episodeFolderDir + item) - - pprint(os.listdir(showDir + file)) - if input('Remove contents? [Y/n] ') != 'n': - shutil.rmtree(showDir + file) - - - -def parse(show, season, episode): - verifyConnectedDirectory() - - show, fuzzyHit = getShowNames(show) - if fuzzyHit != 100: - if (input('Did you mean:\t' + show + ' [Y/n] ') == 'n'): - parse(input('Show query: '), season, episode) - exit(0) - - foundSeasons = getSeasons(show) - if season not in foundSeasons: - if (input('Create season:\t' + season + ' [Y/n] ') == 'n'): - exit(0) - else: - createEpisodeFolders(show, season, episode, True) - exit(0) - - createEpisodeFolders(show, season, episode) - findStrayEpisodes(show, season, episode) +# @Last Modified time: 2017-03-05 15:56:14 +from findStray import findStray +from tweetNewEpisodes import tweetNewEpisodes +from folderCreator import folderCreator def main(): - print(addShowToDB('Pokemon GO')) - exit(0) - if argv[-1].endswith('seasonedFolders.py'): - findStray() - exit(0) - - elif not argv[-1].isdigit() or not argv[-2].isdigit(): - print(" Missing sesason- or episode number.\nRequired input: [show name] [season nr] [episode nr]") - exit(0) - show = ' '.join(argv[1:-2]) - season = '{:02}'.format(int(argv[-2])) - episode = '{:02}'.format(int(argv[-1])) - - parse(show, season, episode) - + findStray() + tweetNewEpisodes() + folderCreator() if __name__ == '__main__': - main() + main() \ No newline at end of file