{% extends '_main.html' %} {% block title %}Radarr - Bazarr{% endblock %} {% block page_head %} {% endblock page_head %} {% block bcleft %} <div class=""> <button class="btn btn-outline" id="save_button"> <div> <span class="fa-stack"> <i class="fas fa-save fa-stack-2x align-top text-themecolor text-center font-20" aria-hidden="true"></i> <i id="save_button_checkmark" class="fas fa-check fa-stack-2x" style="color:green;"></i> </span> </div> <div class="align-bottom text-themecolor small text-center">Save</div> </button> </div> {% endblock bcleft %} {% block bcright %} {% endblock bcright %} {% block body %} <div class="container-fluid" style="padding-top: 3em;"> <form class="form" name="settings_form" id="settings_form"> <h4>Use Radarr</h4> <hr/> <div class="row"> <div class="col-sm-3 text-right"> <b>Enabled</b> </div> <div class="form-group col-sm-1"> <label class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="settings-general-use_radarr" name="settings-general-use_radarr"> <span class="custom-control-label" for="settings-general-use_radarr"></span> </label> </div> </div> <br> <div id="radarr_div"> <h4>Host</h4> <hr/> <div class="row"> <div class="col-sm-3 text-right"> <b>Hostname or IP Address</b> </div> <div class="col-sm-4"> <input type="text" class="form-control" id="settings-radarr-ip" name="settings-radarr-ip" value="{{settings.radarr.ip}}"> <label>Hostname or IP4 address of Radarr</label> </div> </div> <br> <div class="row"> <div class="col-sm-3 text-right"> <b>Port Number</b> </div> <div class="col-sm-4"> <input type="text" class="form-control" id="settings-radarr-port" name="settings-radarr-port" value="{{settings.radarr.port}}"> <label>TCP Port of Radarr</label> </div> </div> <br> <div class="row"> <div class="col-sm-3 text-right"> <b>URL Base</b> </div> <div class="col-sm-4"> <input type="text" class="form-control" id="settings-radarr-base_url" name="settings-radarr-base_url" value="{{settings.radarr.base_url}}"> <label>Base URL for Radarr (default: '/')</label> </div> </div> <br> <div class="row"> <div class="col-sm-3 text-right"> <b>SSL Enabled</b> </div> <div class="form-group col-sm-1"> <label class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="settings-radarr-ssl" name="settings-radarr-ssl"> <span class="custom-control-label" for="settings-radarr-ssl"></span> </label> </div> </div> <div class="row"> <div class="col-sm-3 text-right"> <b>API Key</b> </div> <div class="col-sm-4"> <input type="text" class="form-control" id="settings-radarr-apikey" name="settings-radarr-apikey" value="{{settings.radarr.apikey}}"> <label>API Key for Radarr (32 alphanumeric characters)</label> </div> </div> <br> <div class="row"> <div class="col-sm-3 text-right"> <button type="button" class="btn btn-secondary" id="test_radarr_connection">Test</button> </div> <div class="col-sm-4"> <span id="test_radarr_span"></span> </div> </div> <br> <h4>Options</h4> <hr/> <div class="row"> <div class="col-sm-3 text-right"> <b>Minimum Score</b> </div> <div class="col-sm-8"> <input class="slider" id="settings-general-minimum_score_movie" name="settings-general-minimum_score_movie" data-slider-id='settings-general-minimum_score_movie' type="text" data-slider-min="1" data-slider-max="100" data-slider-step="1" data-slider-value="{{settings.general.minimum_score_movie}}"/> <span class="slider_span"></span> </div> </div> <div class="row"> <div class="col-sm-3 text-right"> </div> <div class="col-sm-8"> <label for="settings-general-minimum_score_movie">Minimum score for an Movies Subtitle to be downloaded (0 to 100).</label> </div> </div> <br> <div class="row"> <div class="col-sm-3 text-right"> <b>Download Only Monitored</b> </div> <div class="form-group col-sm-8"> <label class="custom-control custom-checkbox"> <input type="checkbox" class="custom-control-input" id="settings-radarr-only_monitored" name="settings-radarr-only_monitored"> <span class="custom-control-label" for="settings-radarr-only_monitored"></span> </label> <label>Automatic download of Subtitles will only happen for monitored movies in Radarr.</label> </div> </div> <div class="row"> <div class="col-sm-3 text-right"> <b>Excluded tags</b> </div> <div class="form-group col-sm-8"> <input type="text" id="settings-radarr-excluded_tags" name="settings-radarr-excluded_tags" data-role="tagsinput"> <label>Movies with those tags (case sensitive) in Radarr will be excluded from automatic download of Subtitles.</label> </div> </div> <br> <h4>Path Mappings</h4> <hr/> <h5>Some tips to ensure things goes smoothly:</h5> <ul> <li>You should create a mapping for each Root Folders you have configured in Radarr</li> <li>Point Bazarr to the folder containing all of your movies, not a specific one. eg. "/movies" and not "/movies/the matrix"</li> <li>UNC path under Windows must be typed manually. eg. "\\server\share"</li> </ul> <div class="row"> <div class="col-sm-8"> <table class="table table-striped" id="path_mapping_movie" style="width:100%;"> </table> </div> </div> <br> </div> </form> </div> <div id="addModal" class="modal" tabindex="-1" role="dialog"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Add Path Mapping</h5><br> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <form class="form" name="add_form" id="add_form"> <div class="modal-body"> <div class="container-fluid"> <div class="row"> <div class="col-sm-3 text-right"> Path for Radarr </div> <div class="col-sm-8"> <input type="text" class="form-control" id="add_path_radarr" name="add_path_radarr" value="" placeholder="Browse or type..."> <div class="filetree" id="radarr_browser"></div> </div> </div> <br> <div class="row"> <div class="col-sm-3 text-right"> Path for Bazarr </div> <div class="col-sm-8"> <input type="text" class="form-control" id="add_path_bazarr" name="add_path_bazarr" value="" placeholder="Browse or type..."> <div class="filetree" id="bazarr_browser"></div> </div> </div> </div> </div> <div class="modal-footer"> <button type="submit" id="add_save_button" class="btn btn-info">Save</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button> </div> </form> </div> </div> </div> <div id="editModal" class="modal" tabindex="-1" role="dialog"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Edit Path Mapping</h5><br> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <form class="form" name="edit_form" id="edit_form"> <div class="modal-body"> <div class="container-fluid"> <div class="row"> <div class="col-sm-3 text-right"> Path for Radarr </div> <div class="col-sm-8"> <input type="text" class="form-control" id="edit_path_radarr" name="edit_path_radarr" value=""> </div> </div> <br> <div class="row"> <div class="col-sm-3 text-right"> Path for Bazarr </div> <div class="col-sm-8"> <input type="text" class="form-control" id="edit_path_bazarr" name="edit_path_bazarr" value=""> </div> </div> </div> </div> <div class="modal-footer"> <button type="submit" id="edit_save_button" class="btn btn-info">Save</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button> </div> </form> </div> </div> </div> <div id="deleteModal" class="modal" tabindex="-1" role="dialog"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Delete Path Mapping</h5><br> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> Are you sure you want to delete this path mapping? </div> <div class="modal-footer"> <button type="submit" id="delete_yes_button" class="btn btn-info">Yes</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button> </div> </div> </div> </div> {% endblock body %} {% block tail %} <script> $(document).ready(function () { // Show warning if there's unsaved changes in the settings_form var form_changed = false; $(window).on('beforeunload', function() { if (form_changed) { return ""; } }); // Hide checkmark over save button $('#save_button_checkmark').hide(); $('#save_button').prop('disabled', true).css('cursor', 'not-allowed'); // Hide *_div on Select input changed to None $('#settings-general-use_radarr').on('change', function() { if ($(this).prop('checked')) { $('#radarr_div').show(); } else { $('#radarr_div').hide(); } }); // Set tags input values $('settings-radarr-excluded_tags').tagsinput({ confirmKeys: [9, 13, 32, 44] }); var tags = jQuery.makeArray({{ settings.radarr.excluded_tags|safe }}) $(tags).each(function (index, value) { $('#settings-radarr-excluded_tags').tagsinput('add', value); }); $('#settings-radarr-excluded_tags').tagsinput('refresh'); // Set Checkbox input values $('#settings-general-use_radarr').prop('checked', {{'true' if settings.general.getboolean('use_radarr') else 'false'}}).trigger('change'); $('#settings-radarr-ssl').prop('checked', {{'true' if settings.radarr.getboolean('ssl') else 'false'}}); $('#settings-radarr-only_monitored').prop('checked', {{'true' if settings.radarr.getboolean('only_monitored') else 'false'}}); $('#save_button').on('click', function() { var formdata = new FormData(document.getElementById("settings_form")); // Make sure all checkbox input are sent with true/false value $('input[type=checkbox]').each(function () { formdata.set($(this).prop('id'), $(this).prop('checked')); }); formdata.append('settings-general-path_mappings_movie', JSON.stringify(table.rows().data().toArray())); formdata.set('settings-radarr-excluded_tags', JSON.stringify($("#settings-radarr-excluded_tags").tagsinput('items'))); $.ajax({ url: "{{ url_for('api.savesettings') }}", data: formdata, processData: false, contentType: false, type: 'POST', complete: function () { $('#save_button_checkmark').show(); form_changed = false; $('#save_button').prop('disabled', true).css('cursor', 'not-allowed'); setTimeout( function() { $('#save_button_checkmark').hide(); }, 2000); } }); }); var path_mapping_movie = jQuery.makeArray({{ settings.general.path_mappings_movie|safe }}) path_mapping_movie = $.grep(path_mapping_movie, function(v) { return v[0] !== "" || v[1] !== ""; }); var table = $('#path_mapping_movie').DataTable({ data: path_mapping_movie, columns: [{ title: "Path for Radarr", type: "text" }, { title: "Path for Bazarr", type: "text" }], dom: 'Bfrtip', select: { style: 'single' }, language: { zeroRecords: 'No Path Mappings' }, searching: false, ordering: false, lengthChange: true, responsive: true, paging: false, info: false, buttons: [{ text: 'Add', action: function () { if (form_changed) { alert('You must save changes before adding a path mapping.') } else { $('#addModal').modal('show'); } } }, { extend: 'selected', text: 'Edit', action: function () { $('#edit_path_radarr').val(table.row( { selected: true } ).data()[0]); $('#edit_path_bazarr').val(table.row( { selected: true } ).data()[1]); $('#editModal').modal('show'); } }, { extend: 'selected', text: 'Delete', action: function () { $('#deleteModal').modal('show'); } }] }); $('#addModal').on('hidden.bs.modal', function() { $('#add_form')[0].reset(); $('#radarr_browser').jstree('destroy'); $('#radarr_browser').slimScroll({destroy: true}); $('#bazarr_browser').jstree('destroy'); $('#bazarr_browser').slimScroll({destroy: true}); }) $('#addModal').on('show.bs.modal', function() { $('#radarr_browser').slimScroll({ height: '200px', start: 'top' }); $('#radarr_browser').jstree({ 'core' : { 'data' : { 'url' : '{{ url_for('api.browseradarrfs') }}', 'data' : function (node) { if (node.original === undefined) { return {'path': ''}; } else { return {'path': node.original.path}; } } }, 'themes' : { 'dots' : false } } }).on('changed.jstree', function (e, data) { $('#add_path_radarr').val(data.node.original.path); }); $('#bazarr_browser').slimScroll({ height: '200px', start: 'top' }); $('#bazarr_browser').jstree({ 'core' : { 'data' : { 'url' : '{{ url_for('api.browsebazarrfs') }}', 'data' : function (node) { if (node.original === undefined) { return {'path': ''}; } else { return {'path': node.original.path}; } } }, 'themes' : { 'dots' : false } } }).on('changed.jstree', function (e, data) { $('#add_path_bazarr').val(data.node.original.path); }); }) $('#add_save_button').on('click', function(e) { e.preventDefault(); table.row.add([ $('#add_path_radarr').val(), $('#add_path_bazarr').val()]).draw(); $('#addModal').modal('hide'); $('#settings_form').trigger('change'); }); $('#edit_save_button').on('click', function(e) { e.preventDefault(); table.row( { selected: true } ).data([ $('#edit_path_radarr').val(), $('#edit_path_bazarr').val()]); $('#editModal').modal('hide'); $('#settings_form').trigger('change'); }); $('#delete_yes_button').on('click', function(e) { e.preventDefault(); table.row( { selected: true } ).remove().draw(); $('#deleteModal').modal('hide'); $('#settings_form').trigger('change'); }); $('#test_radarr_connection').on('click', function() { $('#test_radarr_span').html('<div class="spinner-border" role="status"><span class="sr-only">Loading...</span></div>'); if ($('#settings-radarr-ssl').is(':checked')) { var protocol = 'https'; } else { var protocol = 'http'; } var radarr_url = $('#settings-radarr-ip').val() + ":" + $('#settings-radarr-port').val() + $('#settings-radarr-base_url').val().replace(/\/$/, "") + "/api/system/status?apikey=" + $('#settings-radarr-apikey').val(); $.getJSON("{{ url_for('test_url') }}/" + protocol + "/" + encodeURIComponent(radarr_url), function (data) { if (data.status) { $('#test_radarr_span').text('Test Successful: Radarr v' + data.version).css('color', 'green'); } else { $('#test_radarr_span').text('Test Failed: ' + data.error).css('color', 'red'); } }); }); // monitor changes to the settings_form $('#settings_form').on('change', function() { form_changed = true; $('#save_button').prop('disabled', false).css('cursor', 'auto'); }) }); </script> {% endblock tail %}