Proper subtitle support
This commit is contained in:
@@ -192,11 +192,16 @@ class Renamer(Plugin):
|
||||
if file_type is 'leftover':
|
||||
if self.conf('move_leftover'):
|
||||
rename_files[current_file] = os.path.join(destination, final_folder_name, os.path.basename(current_file))
|
||||
else:
|
||||
elif file_type not in ['subtitle']:
|
||||
rename_files[current_file] = os.path.join(destination, final_folder_name, final_file_name)
|
||||
|
||||
# Check for extra subtitle files
|
||||
if file_type is 'subtitle':
|
||||
|
||||
# rename subtitles with or without language
|
||||
#rename_files[current_file] = os.path.join(destination, final_folder_name, final_file_name)
|
||||
sub_langs = group['subtitle_language'].get(current_file)
|
||||
|
||||
rename_extras = self.getRenameExtras(
|
||||
extra_type = 'subtitle_extra',
|
||||
replacements = replacements,
|
||||
@@ -206,6 +211,14 @@ class Renamer(Plugin):
|
||||
group = group,
|
||||
current_file = current_file
|
||||
)
|
||||
|
||||
# Don't add language if multiple languages in 1 file
|
||||
if len(sub_langs) > 1:
|
||||
rename_files[current_file] = os.path.join(destination, final_folder_name, final_file_name)
|
||||
elif len(sub_langs) == 1:
|
||||
sub_name = final_file_name.replace(replacements['ext'], '%s.%s' % (sub_langs[0], replacements['ext']))
|
||||
rename_files[current_file] = os.path.join(destination, final_folder_name, sub_name)
|
||||
|
||||
rename_files = mergeDicts(rename_files, rename_extras)
|
||||
|
||||
# Filename without cd etc
|
||||
|
||||
@@ -7,6 +7,7 @@ from couchpotato.core.plugins.base import Plugin
|
||||
from couchpotato.core.settings.model import File
|
||||
from couchpotato.environment import Env
|
||||
from enzyme.exceptions import NoParserError, ParseError
|
||||
from subliminal.videos import scan
|
||||
import enzyme
|
||||
import logging
|
||||
import os
|
||||
@@ -208,7 +209,7 @@ class Scanner(Plugin):
|
||||
for identifier, group in movie_files.iteritems():
|
||||
if identifier not in group['identifiers'] and len(identifier) > 0: group['identifiers'].append(identifier)
|
||||
|
||||
log.debug('Grouping files for: %s' % identifier)
|
||||
log.debug('Grouping files: %s' % identifier)
|
||||
|
||||
for file_path in group['unsorted_files']:
|
||||
wo_ext = file_path[:-(len(getExt(file_path)) + 1)]
|
||||
@@ -233,7 +234,7 @@ class Scanner(Plugin):
|
||||
|
||||
# Group the files based on the identifier
|
||||
for identifier, group in movie_files.iteritems():
|
||||
log.debug('Grouping files for: %s' % identifier)
|
||||
log.debug('Grouping files on identifier: %s' % identifier)
|
||||
|
||||
found_files = set(self.path_identifiers.get(identifier, []))
|
||||
group['unsorted_files'].extend(found_files)
|
||||
@@ -262,7 +263,7 @@ class Scanner(Plugin):
|
||||
file_too_new = tryInt(time.time() - file_time)
|
||||
break
|
||||
|
||||
if file_too_new:
|
||||
if file_too_new and not Env.get('dev'):
|
||||
log.info('Files seem to be still unpacking or just unpacked (created on %s), ignoring for now: %s' % (time.ctime(file_time), identifier))
|
||||
continue
|
||||
|
||||
@@ -291,6 +292,9 @@ class Scanner(Plugin):
|
||||
log.debug('Getting metadata for %s' % identifier)
|
||||
group['meta_data'] = self.getMetaData(group)
|
||||
|
||||
# Subtitle meta
|
||||
group['subtitle_language'] = self.getSubtitleLanguage(group)
|
||||
|
||||
# Get parent dir from movie files
|
||||
for movie_file in group['files']['movie']:
|
||||
group['parentdir'] = os.path.dirname(movie_file)
|
||||
@@ -381,6 +385,41 @@ class Scanner(Plugin):
|
||||
|
||||
return {}
|
||||
|
||||
def getSubtitleLanguage(self, group):
|
||||
detected_languages = {}
|
||||
|
||||
# Subliminal scanner
|
||||
try:
|
||||
paths = group['files']['movie']
|
||||
scan_result = []
|
||||
for p in paths:
|
||||
scan_result.extend(scan(p))
|
||||
|
||||
for video, detected_subtitles in scan_result:
|
||||
for s in detected_subtitles:
|
||||
if s.language and s.path not in paths:
|
||||
detected_languages[s.path] = [s.language]
|
||||
except:
|
||||
log.error('Failed parsing subtitle languages for %s: %s' % (paths, traceback.format_exc()))
|
||||
|
||||
# IDX
|
||||
for extra in group['files']['subtitle_extra']:
|
||||
try:
|
||||
if os.path.isfile(extra):
|
||||
output = open(extra, 'r')
|
||||
txt = output.read()
|
||||
output.close()
|
||||
|
||||
idx_langs = re.findall('\nid: (\w+)', txt)
|
||||
|
||||
sub_file = '%s.sub' % os.path.splitext(extra)[0]
|
||||
if len(idx_langs) > 0 and os.path.isfile(sub_file):
|
||||
detected_languages[sub_file] = idx_langs
|
||||
except:
|
||||
log.error('Failed parsing subtitle idx for %s: %s' % (extra, traceback.format_exc()))
|
||||
|
||||
return detected_languages
|
||||
|
||||
def determineMovie(self, group):
|
||||
imdb_id = None
|
||||
|
||||
|
||||
@@ -3,15 +3,18 @@ from couchpotato.core.event import addEvent, fireEvent
|
||||
from couchpotato.core.logger import CPLog
|
||||
from couchpotato.core.plugins.base import Plugin
|
||||
from couchpotato.core.settings.model import Library, FileType
|
||||
from couchpotato.environment import Env
|
||||
import subliminal
|
||||
|
||||
log = CPLog(__name__)
|
||||
|
||||
|
||||
class Subtitle(Plugin):
|
||||
|
||||
services = ['opensubtitles', 'thesubdb', 'subswiki']
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
#addEvent('renamer.before', self.searchSingle)
|
||||
addEvent('renamer.before', self.searchSingle)
|
||||
|
||||
def searchLibrary(self):
|
||||
|
||||
@@ -33,20 +36,22 @@ class Subtitle(Plugin):
|
||||
files.append(file.path);
|
||||
|
||||
# get subtitles for those files
|
||||
subtitles = fireEvent('subtitle.search', files = files, languages = self.getLanguages(), merge = True)
|
||||
|
||||
# do something with the returned subtitles
|
||||
print subtitles
|
||||
|
||||
subliminal.list_subtitles(files, cache_dir = Env.get('cache_dir'), multi = True, languages = self.getLanguages(), services = self.services)
|
||||
|
||||
def searchSingle(self, group):
|
||||
|
||||
if self.isDisabled(): return
|
||||
|
||||
subtitles = fireEvent('subtitle.search', files = group['files']['movie'], languages = self.getLanguages(), merge = True)
|
||||
available_languages = sum(group['subtitle_language'].itervalues(), [])
|
||||
downloaded = []
|
||||
for lang in self.getLanguages():
|
||||
if lang not in available_languages:
|
||||
download = subliminal.download_subtitles(group['files']['movie'], multi = True, force = False, languages = [lang], services = self.services, cache_dir = Env.get('cache_dir'))
|
||||
downloaded.extend(download)
|
||||
|
||||
# do something with the returned subtitles
|
||||
print subtitles
|
||||
for d_sub in downloaded:
|
||||
group['files']['subtitle'].add(d_sub.path)
|
||||
group['subtitle_language'][d_sub.path] = [d_sub.language]
|
||||
|
||||
def getLanguages(self):
|
||||
return self.conf('languages').split(',')
|
||||
return [x.strip() for x in self.conf('languages').split(',')]
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
from couchpotato.core.event import addEvent
|
||||
from couchpotato.core.providers.base import Provider
|
||||
|
||||
|
||||
class SubtitleProvider(Provider):
|
||||
|
||||
type = 'subtitle'
|
||||
|
||||
def __init__(self):
|
||||
addEvent('subtitle.search', self.search)
|
||||
|
||||
def search(self, group):
|
||||
pass
|
||||
@@ -1,6 +0,0 @@
|
||||
from .main import SubliminalProvider
|
||||
|
||||
def start():
|
||||
return SubliminalProvider()
|
||||
|
||||
config = []
|
||||
@@ -1,22 +0,0 @@
|
||||
from couchpotato.core.logger import CPLog
|
||||
from couchpotato.core.providers.subtitle.base import SubtitleProvider
|
||||
from couchpotato.environment import Env
|
||||
from libs import subliminal
|
||||
|
||||
log = CPLog(__name__)
|
||||
|
||||
|
||||
class SubliminalProvider(SubtitleProvider):
|
||||
|
||||
plugins = ['OpenSubtitles', 'TheSubDB', 'SubsWiki']
|
||||
|
||||
def search(self, files = [], languages = []):
|
||||
|
||||
# download subtitles
|
||||
with subliminal.Subliminal(cache_dir = Env.get('cache_dir'), multi = True,
|
||||
languages = self.getLanguages(), plugins = self.plugins) as subli:
|
||||
subtitles = subli.downloadSubtitles(files)
|
||||
|
||||
print subtitles
|
||||
|
||||
return subtitles
|
||||
Reference in New Issue
Block a user