mirror of
https://github.com/morpheus65535/bazarr.git
synced 2025-04-23 14:17:46 -04:00
Merge branch 'development'
This commit is contained in:
commit
f4f0ee5f30
8 changed files with 68 additions and 27 deletions
13
bazarr.py
13
bazarr.py
|
@ -1,4 +1,4 @@
|
|||
bazarr_version = '0.3.2'
|
||||
bazarr_version = '0.3.5'
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
@ -261,7 +261,7 @@ def episodes(no):
|
|||
series_details = c.execute("SELECT title, overview, poster, fanart, hearing_impaired, tvdbid, audio_language, languages, path_substitution(path) FROM table_shows WHERE sonarrSeriesId LIKE ?", (str(no),)).fetchone()
|
||||
tvdbid = series_details[5]
|
||||
|
||||
episodes = c.execute("SELECT title, path_substitution(path), season, episode, subtitles, sonarrSeriesId, missing_subtitles, sonarrEpisodeId FROM table_episodes WHERE sonarrSeriesId LIKE ? ORDER BY episode ASC", (str(no),)).fetchall()
|
||||
episodes = c.execute("SELECT title, path_substitution(path), season, episode, subtitles, sonarrSeriesId, missing_subtitles, sonarrEpisodeId, scene_name FROM table_episodes WHERE sonarrSeriesId LIKE ? ORDER BY episode ASC", (str(no),)).fetchall()
|
||||
number = len(episodes)
|
||||
languages = c.execute("SELECT code2, name FROM table_settings_languages WHERE enabled = 1").fetchall()
|
||||
c.close()
|
||||
|
@ -317,7 +317,7 @@ def history():
|
|||
thisyear.append(datetime.fromtimestamp(stat[0]).date())
|
||||
stats = [len(today), len(thisweek), len(thisyear), total]
|
||||
|
||||
c.execute("SELECT table_history.action, table_shows.title, table_episodes.season || 'x' || table_episodes.episode, table_episodes.title, table_history.timestamp, table_history.description, table_history.sonarrSeriesId FROM table_history INNER JOIN table_shows on table_shows.sonarrSeriesId = table_history.sonarrSeriesId INNER JOIN table_episodes on table_episodes.sonarrEpisodeId = table_history.sonarrEpisodeId ORDER BY id DESC LIMIT 15 OFFSET ?", (offset,))
|
||||
c.execute("SELECT table_history.action, table_shows.title, table_episodes.season || 'x' || table_episodes.episode, table_episodes.title, table_history.timestamp, table_history.description, table_history.sonarrSeriesId FROM table_history LEFT JOIN table_shows on table_shows.sonarrSeriesId = table_history.sonarrSeriesId LEFT JOIN table_episodes on table_episodes.sonarrEpisodeId = table_history.sonarrEpisodeId ORDER BY id DESC LIMIT 15 OFFSET ?", (offset,))
|
||||
data = c.fetchall()
|
||||
c.close()
|
||||
data = reversed(sorted(data, key=operator.itemgetter(4)))
|
||||
|
@ -726,7 +726,7 @@ def remove_subtitles():
|
|||
history_log(0, sonarrSeriesId, sonarrEpisodeId, result)
|
||||
except OSError:
|
||||
pass
|
||||
store_subtitles(episodePath)
|
||||
store_subtitles(unicode(episodePath))
|
||||
list_missing_subtitles(sonarrSeriesId)
|
||||
|
||||
@route(base_url + 'get_subtitle', method='POST')
|
||||
|
@ -734,6 +734,7 @@ def get_subtitle():
|
|||
ref = request.environ['HTTP_REFERER']
|
||||
|
||||
episodePath = request.forms.get('episodePath')
|
||||
sceneName = request.forms.get('sceneName')
|
||||
language = request.forms.get('language')
|
||||
hi = request.forms.get('hi')
|
||||
sonarrSeriesId = request.forms.get('sonarrSeriesId')
|
||||
|
@ -764,11 +765,11 @@ def get_subtitle():
|
|||
providers_auth = None
|
||||
|
||||
try:
|
||||
result = download_subtitle(episodePath, language, hi, providers_list, providers_auth)
|
||||
result = download_subtitle(episodePath, language, hi, providers_list, providers_auth, sceneName)
|
||||
if result is not None:
|
||||
history_log(1, sonarrSeriesId, sonarrEpisodeId, result)
|
||||
send_notifications(sonarrSeriesId, sonarrEpisodeId, result)
|
||||
store_subtitles(episodePath)
|
||||
store_subtitles(unicode(episodePath))
|
||||
list_missing_subtitles(sonarrSeriesId)
|
||||
redirect(ref)
|
||||
except OSError:
|
||||
|
|
|
@ -53,7 +53,7 @@ CREATE TABLE "table_episodes" (
|
|||
`sonarrSeriesId` INTEGER NOT NULL,
|
||||
`sonarrEpisodeId` INTEGER NOT NULL UNIQUE,
|
||||
`title` TEXT NOT NULL,
|
||||
`path` TEXT NOT NULL UNIQUE,
|
||||
`path` TEXT NOT NULL,
|
||||
`season` INTEGER NOT NULL,
|
||||
`episode` INTEGER NOT NULL,
|
||||
`subtitles` TEXT,
|
||||
|
|
|
@ -32,12 +32,15 @@ def update_all_episodes():
|
|||
if episode['hasFile'] and episode['episodeFile']['size'] > 20480:
|
||||
# Add shows in Sonarr to current shows list
|
||||
current_episodes_sonarr.append(episode['id'])
|
||||
|
||||
if 'sceneName' in episode['episodeFile']:
|
||||
sceneName = episode['episodeFile']['sceneName']
|
||||
else:
|
||||
sceneName = None
|
||||
try:
|
||||
c.execute('''INSERT INTO table_episodes(sonarrSeriesId, sonarrEpisodeId, title, path, season, episode) VALUES (?, ?, ?, ?, ?, ?)''', (episode['seriesId'], episode['id'], episode['title'], episode['episodeFile']['path'], episode['seasonNumber'], episode['episodeNumber']))
|
||||
c.execute('''INSERT INTO table_episodes(sonarrSeriesId, sonarrEpisodeId, title, path, season, episode, scene_name) VALUES (?, ?, ?, ?, ?, ?, ?)''', (episode['seriesId'], episode['id'], episode['title'], episode['episodeFile']['path'], episode['seasonNumber'], episode['episodeNumber'], sceneName))
|
||||
db.commit()
|
||||
except sqlite3.Error:
|
||||
c.execute('''UPDATE table_episodes SET sonarrSeriesId = ?, sonarrEpisodeId = ?, title = ?, path = ?, season = ?, episode = ? WHERE sonarrEpisodeId = ?''', (episode['seriesId'], episode['id'], episode['title'], episode['episodeFile']['path'], episode['seasonNumber'], episode['episodeNumber'], episode['id']))
|
||||
c.execute('''UPDATE table_episodes SET sonarrSeriesId = ?, sonarrEpisodeId = ?, title = ?, path = ?, season = ?, episode = ?, scene_name = ? WHERE sonarrEpisodeId = ?''', (episode['seriesId'], episode['id'], episode['title'], episode['episodeFile']['path'], episode['seasonNumber'], episode['episodeNumber'], sceneName, episode['id']))
|
||||
db.commit()
|
||||
else:
|
||||
continue
|
||||
|
@ -93,9 +96,12 @@ def add_new_episodes():
|
|||
if episode['hasFile'] and episode['episodeFile']['size'] > 20480:
|
||||
# Add shows in Sonarr to current shows list
|
||||
current_episodes_sonarr.append(episode['id'])
|
||||
|
||||
if 'sceneName' in episode['episodeFile']:
|
||||
sceneName = episode['episodeFile']['sceneName']
|
||||
else:
|
||||
sceneName = None
|
||||
try:
|
||||
c.execute('''INSERT INTO table_episodes(sonarrSeriesId, sonarrEpisodeId, title, path, season, episode) VALUES (?, ?, ?, ?, ?, ?)''', (episode['seriesId'], episode['id'], episode['title'], episode['episodeFile']['path'], episode['seasonNumber'], episode['episodeNumber']))
|
||||
c.execute('''INSERT INTO table_episodes(sonarrSeriesId, sonarrEpisodeId, title, path, season, episode, scene_name) VALUES (?, ?, ?, ?, ?, ?, ?)''', (episode['seriesId'], episode['id'], episode['title'], episode['episodeFile']['path'], episode['seasonNumber'], episode['episodeNumber'], sceneName))
|
||||
except:
|
||||
pass
|
||||
db.commit()
|
||||
|
|
|
@ -13,15 +13,19 @@ from notifier import send_notifications
|
|||
# configure the cache
|
||||
region.configure('dogpile.cache.memory')
|
||||
|
||||
def download_subtitle(path, language, hi, providers, providers_auth):
|
||||
def download_subtitle(path, language, hi, providers, providers_auth, sceneName):
|
||||
try:
|
||||
video = scan_video(path)
|
||||
if sceneName is None:
|
||||
video = scan_video(path)
|
||||
else:
|
||||
video = Video.fromname(sceneName)
|
||||
except Exception as e:
|
||||
logging.exception('Error trying to extract information from this filename: ' + path)
|
||||
return None
|
||||
else:
|
||||
try:
|
||||
best_subtitles = download_best_subtitles([video], {Language(language)}, providers=providers, hearing_impaired=hi, provider_configs=providers_auth)
|
||||
|
||||
except Exception as e:
|
||||
logging.exception('Error trying to best subtitles for this file: ' + path)
|
||||
return None
|
||||
|
@ -34,6 +38,8 @@ def download_subtitle(path, language, hi, providers, providers_auth):
|
|||
else:
|
||||
single = get_general_settings()[7]
|
||||
try:
|
||||
if sceneName is not None:
|
||||
video = scan_video(path)
|
||||
if single == 'True':
|
||||
result = save_subtitles(video, [best_subtitle], single=True, encoding='utf-8')
|
||||
else:
|
||||
|
@ -44,14 +50,17 @@ def download_subtitle(path, language, hi, providers, providers_auth):
|
|||
else:
|
||||
downloaded_provider = str(result[0]).strip('<>').split(' ')[0][:-8]
|
||||
downloaded_language = pycountry.languages.lookup(str(str(result[0]).strip('<>').split(' ')[2].strip('[]'))).name
|
||||
message = downloaded_language + " subtitles downloaded from " + downloaded_provider + "."
|
||||
if sceneName is not None:
|
||||
message = downloaded_language + " subtitles downloaded from " + downloaded_provider + " using scene name from Sonarr guessing."
|
||||
else:
|
||||
message = downloaded_language + " subtitles downloaded from " + downloaded_provider + " using filename guessing."
|
||||
|
||||
return message
|
||||
|
||||
def series_download_subtitles(no):
|
||||
conn_db = sqlite3.connect(os.path.join(os.path.dirname(__file__), 'data/db/bazarr.db'), timeout=30)
|
||||
c_db = conn_db.cursor()
|
||||
episodes_details = c_db.execute("SELECT path, missing_subtitles, sonarrEpisodeId FROM table_episodes WHERE sonarrSeriesId = ?", (no,)).fetchall()
|
||||
episodes_details = c_db.execute("SELECT path, missing_subtitles, sonarrEpisodeId, scene_name FROM table_episodes WHERE sonarrSeriesId = ?", (no,)).fetchall()
|
||||
series_details = c_db.execute("SELECT hearing_impaired FROM table_shows WHERE sonarrSeriesId = ?", (no,)).fetchone()
|
||||
enabled_providers = c_db.execute("SELECT * FROM table_settings_providers WHERE enabled = 1").fetchall()
|
||||
c_db.close()
|
||||
|
@ -75,7 +84,7 @@ def series_download_subtitles(no):
|
|||
|
||||
for episode in episodes_details:
|
||||
for language in ast.literal_eval(episode[1]):
|
||||
message = download_subtitle(path_replace(episode[0]), str(pycountry.languages.lookup(language).alpha_3), series_details[0], providers_list, providers_auth)
|
||||
message = download_subtitle(path_replace(episode[0]), str(pycountry.languages.lookup(language).alpha_3), series_details[0], providers_list, providers_auth, episode[3])
|
||||
if message is not None:
|
||||
store_subtitles(path_replace(episode[0]))
|
||||
history_log(1, no, episode[2], message)
|
||||
|
@ -85,7 +94,7 @@ def series_download_subtitles(no):
|
|||
def wanted_download_subtitles(path):
|
||||
conn_db = sqlite3.connect(os.path.join(os.path.dirname(__file__), 'data/db/bazarr.db'), timeout=30)
|
||||
c_db = conn_db.cursor()
|
||||
episodes_details = c_db.execute("SELECT table_episodes.path, table_episodes.missing_subtitles, table_episodes.sonarrEpisodeId, table_episodes.sonarrSeriesId, table_shows.hearing_impaired FROM table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE table_episodes.path = ? AND missing_subtitles != '[]'", (path_replace_reverse(path),)).fetchall()
|
||||
episodes_details = c_db.execute("SELECT table_episodes.path, table_episodes.missing_subtitles, table_episodes.sonarrEpisodeId, table_episodes.sonarrSeriesId, table_shows.hearing_impaired, table_episodes.scene_name FROM table_episodes INNER JOIN table_shows on table_shows.sonarrSeriesId = table_episodes.sonarrSeriesId WHERE table_episodes.path = ? AND missing_subtitles != '[]'", (path_replace_reverse(path),)).fetchall()
|
||||
enabled_providers = c_db.execute("SELECT * FROM table_settings_providers WHERE enabled = 1").fetchall()
|
||||
c_db.close()
|
||||
|
||||
|
@ -108,7 +117,7 @@ def wanted_download_subtitles(path):
|
|||
|
||||
for episode in episodes_details:
|
||||
for language in ast.literal_eval(episode[1]):
|
||||
message = download_subtitle(path_replace(episode[0]), str(pycountry.languages.lookup(language).alpha_3), episode[4], providers_list, providers_auth)
|
||||
message = download_subtitle(path_replace(episode[0]), str(pycountry.languages.lookup(language).alpha_3), episode[4], providers_list, providers_auth, episode[5])
|
||||
if message is not None:
|
||||
store_subtitles(path_replace(episode[0]))
|
||||
list_missing_subtitles(episode[3])
|
||||
|
|
|
@ -49,6 +49,15 @@ if os.path.exists(os.path.join(os.path.dirname(__file__), 'data/db/bazarr.db'))
|
|||
for provider in providers:
|
||||
c.execute('INSERT INTO `table_settings_notifier` (name, enabled) VALUES (?, ?);', (provider,'0'))
|
||||
|
||||
try:
|
||||
c.execute('alter table table_episodes add column "scene_name" TEXT')
|
||||
db.commit()
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
from scheduler import execute_now
|
||||
execute_now('update_all_episodes')
|
||||
|
||||
# Commit change to db
|
||||
db.commit()
|
||||
|
||||
|
|
|
@ -183,7 +183,7 @@
|
|||
%end
|
||||
%if missing_languages is not None:
|
||||
%for language in missing_languages:
|
||||
<a data-episodePath="{{episode[1]}}" data-language="{{pycountry.languages.lookup(str(language)).alpha_3}}" data-hi="{{details[4]}}" data-sonarrSeriesId={{episode[5]}} data-sonarrEpisodeId={{episode[7]}} class="get_subtitle ui tiny label">
|
||||
<a data-episodePath="{{episode[1]}}" data-scenename="{{episode[8]}}" data-language="{{pycountry.languages.lookup(str(language)).alpha_3}}" data-hi="{{details[4]}}" data-sonarrSeriesId={{episode[5]}} data-sonarrEpisodeId={{episode[7]}} class="get_subtitle ui tiny label">
|
||||
{{language}}
|
||||
<i style="margin-left:3px; margin-right:0px" class="search icon"></i>
|
||||
</a>
|
||||
|
@ -294,6 +294,7 @@
|
|||
$('.get_subtitle').click(function(){
|
||||
var values = {
|
||||
episodePath: $(this).attr("data-episodePath"),
|
||||
sceneName: $(this).attr("data-sceneName"),
|
||||
language: $(this).attr("data-language"),
|
||||
hi: $(this).attr("data-hi"),
|
||||
sonarrSeriesId: $(this).attr("data-sonarrSeriesId"),
|
||||
|
|
|
@ -79,14 +79,24 @@
|
|||
</div>
|
||||
%end
|
||||
</td>
|
||||
<td><a href="{{base_url}}episodes/{{row[6]}}">{{row[1]}}</a></td>
|
||||
<td class="collapsing">
|
||||
<%episode = row[2].split('x')%>
|
||||
{{episode[0] + 'x' + episode[1].zfill(2)}}
|
||||
<td>
|
||||
<a href="{{base_url}}episodes/{{row[6]}}">{{row[1]}}</a>
|
||||
</td>
|
||||
<td>{{row[3]}}</td>
|
||||
<td class="collapsing">
|
||||
<div class="ui inverted" data-tooltip="{{time.strftime('%A, %B %d %Y %H:%M', time.localtime(row[4]))}}" data-inverted="">
|
||||
%if row[2] is not None:
|
||||
% episode = row[2].split('x')
|
||||
{{episode[0] + 'x' + episode[1].zfill(2)}}
|
||||
%end
|
||||
</td>
|
||||
<td>
|
||||
%if row[3] is not None:
|
||||
{{row[3]}}
|
||||
%else:
|
||||
<em>Deleted episode</em>
|
||||
%end
|
||||
</td>
|
||||
<td class="collapsing">
|
||||
<div class="ui inverted" data-tooltip="{{time.strftime('%Y/%m/%d %H:%M', time.localtime(row[4]))}}" data-inverted="">
|
||||
{{pretty.date(int(row[4]))}}
|
||||
</div>
|
||||
</td>
|
||||
|
|
|
@ -70,7 +70,12 @@
|
|||
<tr class="selectable">
|
||||
<td><a href="{{base_url}}episodes/{{row[5]}}">{{row[1]}}</a></td>
|
||||
<td>
|
||||
{{row[2]}}
|
||||
%if os.path.isdir(row[2]):
|
||||
<span data-tooltip="This path seems to be valid." data-inverted=""><i class="checkmark icon"></i></span>
|
||||
%else:
|
||||
<span data-tooltip="This path doesn't seems to be valid." data-inverted=""><i class="warning sign icon"></i></span>
|
||||
%end
|
||||
{{row[2]}}
|
||||
</td>
|
||||
<td>{{row[7]}}</td>
|
||||
<td>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue