<!doctype html> <html lang="en"> <head> <title>{% block title %}Bazarr{% endblock %}</title> {% block head_meta %} <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <meta name="mobile-web-app-capable" content="yes"/> <meta name="apple-mobile-web-app-capable" content="yes"/> <link rel="apple-touch-icon" sizes="120x120" href="{{ url_for('static',filename='apple-touch-icon.png') }}"> <link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static',filename='favicon-32x32.png') }}"> <link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static',filename='favicon-16x16.png') }}"> <link rel="manifest" href="{{ url_for('static',filename='manifest.json') }}"> <link rel="mask-icon" href="{{ url_for('static',filename='safari-pinned-tab.svg') }}" color="#5bbad5"> <link rel="shortcut icon" href="{{ url_for('static',filename='favicon.ico') }}"> <meta name="msapplication-config" content="{{ url_for('static',filename='browserconfig.xml') }}"> <meta name="theme-color" content="#ffffff"> {% endblock head_meta %} {% block head_css %} <link href="{{ url_for('static',filename='plugins/bootstrap/css/bootstrap.min.css') }}" rel="stylesheet"> <!-- Custom CSS --> <link href="{{ url_for('static',filename='css/style.css') }}" rel="stylesheet"> <!-- You can change the theme colors from here --> <link href="{{ url_for('static',filename='css/bazarr.css') }}" id="theme" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='datatables/datatables.min.css') }}"> <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='datatables/rowGroup.dataTables.min.css') }}"> <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='datatables/responsive.dataTables.min.css') }}"> <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='datatables/select.bootstrap4.min.css') }}"> <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='datatables/buttons.dataTables.min.css') }}"> <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='plugins/datatables.net-bs4/css/dataTables.bootstrap4.min.css') }}"> <link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap-select.css') }}"/> <link rel="stylesheet" href="{{ url_for('static',filename='css/bootstrap-slider.min.css') }}"/> <link rel="stylesheet" href="{{ url_for('static',filename='css/jquery.typeahead.min.css') }}"/> <link rel="stylesheet" href="{{ url_for('static',filename='css/Chart.min.css') }}"/> {% endblock head_css %} {% block head %} <style> html { background: #f5f7fa; } .table td, .table th { padding: .4rem !important; } .btn-light { background-color: white; border: 1px solid #ced4da; } table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>td:first-child:before, table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>th:first-child:before { left: -15px; background-color: #911f93; } .custom-control-label { color: #909293; padding-left: 1.25em; } .restart { color: orange; } .slider_span { margin-left: 1em; } </style> {% endblock head %} {% block page_head %} {% endblock page_head %} {% block head_tail %} {% endblock head_tail %} </head> <body class="fix-header fix-sidebar card-no-border"> <!-- ============================================================== --> <!-- Preloader - style you can find in spinners.css --> <!-- ============================================================== --> <div class="preloader"> <svg class="circular" viewBox="25 25 50 50"> <circle class="path" cx="50" cy="50" r="20" fill="none" stroke-width="2" stroke-miterlimit="10"></circle> </svg> </div> {% block page_body %} <!-- ============================================================== --> <!-- Main wrapper - style you can find in pages.scss --> <!-- ============================================================== --> <div id="main-wrapper"> <!-- ============================================================== --> <!-- Topbar header - style you can find in pages.scss --> <!-- ============================================================== --> <header class="topbar"> <nav class="navbar top-navbar navbar-expand-md navbar-light"> <!-- ============================================================== --> <!-- Logo --> <!-- ============================================================== --> <div class="navbar-header"> <a class="navbar-brand" href="{{ url_for('redirect_root') }}"> <!-- Logo icon --> <b> <img src="{{ url_for('static',filename='logo128.png') }}" alt="homepage" width="40" class="dark-logo"/> </b></a> <!--End Logo icon --> <!-- Logo text --> </div> <!-- ============================================================== --> <!-- End Logo --> <!-- ============================================================== --> <div class="navbar-collapse"> <!-- ============================================================== --> <!-- toggle and nav items --> <!-- ============================================================== --> <ul class="navbar-nav mr-auto mt-md-0"> <!-- This is --> <li class="nav-item"><a class="nav-link nav-toggler d-block d-md-none text-muted hidden-xl-up" href="javascript:void(0)"><i class="mdi mdi-menu"></i></a></li> <li class="nav-item"><a class="nav-link sidebartoggler d-none d-md-block text-muted hidden-xl-up" href="javascript:void(0)"><i class="ti-menu"></i></a></li> <!-- ============================================================== --> <!-- Search --> <!-- ============================================================== --> <li class="nav-item search-box"> <form class="form-material"> <div class="typeahead__container"> <div class="typeahead__field"> <div class="typeahead__query"> <input class="form-control text-white js-typeahead" id="search" placeholder="Search..." autocomplete="off"> </div> </div> </div> </form> </li> </ul> <!-- ============================================================== --> <!-- User profile and search --> <!-- ============================================================== --> <ul class="navbar-nav my-lg-0"> <!-- ============================================================== --> <!-- Profile --> <!-- ============================================================== --> <li class="nav-item"> <a class="nav-link text-muted fas fa-heart" href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=XHHRWXT9YB7WE&source=url" target=”_blank”></a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle text-muted fas fa-user" href="" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></a> <div class="dropdown-menu dropdown-menu-right scale-up"> <ul class="dropdown-user"> <li><a id="restart"><i class="fas fa-redo"></i> Restart</a></li> <li><a id="shutdown"><i class="fas fa-power-off"></i> Shutdown</a></li> {% if settings.auth.type != 'None' %} <li><a href="{{ url_for('logout') }}"><i class="fas fa-sign-out-alt"></i> Logout</a> </li> {% endif %} </ul> </div> </li> </ul> </div> </nav> </header> <!-- ============================================================== --> <!-- End Topbar header --> <!-- ============================================================== --> <!-- ============================================================== --> <!-- Left Sidebar - style you can find in sidebar.scss --> <!-- ============================================================== --> <aside class="left-sidebar"> <!-- Sidebar scroll--> <div class="scroll-sidebar"> <!-- Sidebar navigation--> <nav class="sidebar-nav"> <ul id="sidebarnav"> {% if settings.general.getboolean('use_sonarr') %} <li id="series_nav"><a href="{{ url_for('series') }}"><i class="fas fa-play"></i><span class="hide-menu"> Series</span></a> </li> {% endif %} {% if settings.general.getboolean('use_radarr') %} <li id="movies_nav"><a href="{{ url_for('movies') }}"><i class="fas fa-film"></i><span class="hide-menu"> Movies</span></a> </li> {% endif %} <li><a href="#"><i class="fas fa-clock"></i><span class="hide-menu"> History</span></a> <ul aria-expanded="false" class="collapse"> {% if settings.general.getboolean('use_sonarr') %} <li><a href="{{ url_for('historyseries') }}"> Series</a></li> {% endif %} {% if settings.general.getboolean('use_radarr') %} <li><a href="{{ url_for('historymovies') }}"> Movies</a></li> {% endif %} <li><a href="{{ url_for('historystats') }}"> Statistics</a></li> </ul> </li> <li><a href="#"><i class="fas fa-exclamation-triangle"></i><span class="hide-menu"> Wanted</span></a> <ul aria-expanded="false" class="collapse"> {% if settings.general.getboolean('use_sonarr') %} <li> <a href="{{ url_for('wantedseries') }}"> Series <span id="wanted_series_badge"></span></a> </li> {% endif %} {% if settings.general.getboolean('use_radarr') %} <li><a href="{{ url_for('wantedmovies') }}"> Movies <span id="wanted_movies_badge"></span></a></li> {% endif %} </ul> </li> <li><a href="#"><i class="fas fa-cogs"></i><span class="hide-menu"> Settings</span></a> <ul aria-expanded="false" class="collapse"> <li><a href="{{ url_for('settingsgeneral') }}"> General</a></li> <li><a href="{{ url_for('settingssonarr') }}"> Sonarr</a></li> <li><a href="{{ url_for('settingsradarr') }}"> Radarr</a></li> <li><a href="{{ url_for('settingssubtitles') }}"> Subtitles</a></li> <li><a href="{{ url_for('settingslanguages') }}"> Languages</a></li> <li><a href="{{ url_for('settingsproviders') }}"> Providers</a></li> <li><a href="{{ url_for('settingsnotifications') }}"> Notifications</a></li> <li><a href="{{ url_for('settingsscheduler') }}"> Scheduler</a></li> </ul> </li> <li><a href="#"><i class="fas fa-laptop"></i><span class="hide-menu"> System</span></a> <ul aria-expanded="false" class="collapse"> <li><a href="{{ url_for('systemtasks') }}"> Tasks</a></li> <li><a href="{{ url_for('systemlogs') }}"> Logs</a></li> <li><a href="{{ url_for('systemproviders') }}"> Providers <span id="throttled_providers_count"></span></a></li> <li><a href="{{ url_for('systemstatus') }}"> Status</a></li> <li><a href="{{ url_for('systemreleases') }}"> Releases</a></li> </ul> </li> </ul> </nav> <!-- End Sidebar navigation --> </div> <!-- End Sidebar scroll--> </aside> <!-- ============================================================== --> <!-- End Left Sidebar - style you can find in sidebar.scss --> <!-- ============================================================== --> <div class="page-wrapper"> <div class="container-fluid"> {% block breadcrumb %} <!-- ============================================================== --> <!-- Bread crumb and right sidebar toggle --> <!-- ============================================================== --> <div id="buttons_bars" class="row page-titles buttons_bars"> <div id="buttons_bar_left" class="col-8 align-self-center"> {% block bcleft %} {% endblock bcleft %} </div> <div id="buttons_bar_right" class="col-4 align-self-center"> {% block bcright %} {% endblock bcright %} </div> </div> {% endblock breadcrumb %} {% block body %} {% endblock body %} </div> </div> <!-- ============================================================== --> <!-- footer --> <!-- ============================================================== --> </div> <!-- ============================================================== --> <!-- End footer --> <!-- ============================================================== --> <div id="reconnect_overlay" class="overlay"> <div class="overlay-content"> <p id="loader_text" style="color: white;">Connection to Backend Lost.</p> <button id="loader_button" class="btn btn-info" onclick="window.location.reload()">Reload</button> </div> </div> {% endblock page_body %} {% block tail_js %} <!-- ============================================================== --> <!-- All Jquery --> <!-- ============================================================== --> <script src="{{ url_for('static',filename='plugins/jquery/jquery.min.js') }}"></script> <!-- Bootstrap tether Core JavaScript --> <script src="{{ url_for('static',filename='plugins/popper/popper.min.js') }}"></script> <script src="{{ url_for('static',filename='plugins/bootstrap/js/bootstrap.min.js') }}"></script> <!-- slimscrollbar scrollbar JavaScript --> <script src="{{ url_for('static',filename='js/jquery.slimscroll.js') }}"></script> <!--Menu sidebar --> <script src="{{ url_for('static',filename='js/sidebarmenu.js') }}"></script> <!--stickey kit --> <script src="{{ url_for('static',filename='plugins/sticky-kit-master/dist/sticky-kit.min.js') }}"></script> <!--Custom JavaScript --> <script src="{{ url_for('static',filename='datatables/jquery.dataTables.min.js') }}"></script> <script src="{{ url_for('static',filename='datatables/dataTables.rowGroup.min.js') }}"></script> <script src="{{ url_for('static',filename='datatables/dataTables.responsive.min.js') }}"></script> <script src="{{ url_for('static',filename='datatables/dataTables.select.min.js') }}"></script> <script src="{{ url_for('static',filename='datatables/dataTables.buttons.min.js') }}"></script> <script src="{{ url_for('static',filename='plugins/datatables.net-bs4/js/dataTables.bootstrap4.min.js') }}"></script> <script src="{{ url_for('static',filename='datatables-alteditor/dataTables.altEditor.free.js') }}"></script> <script src="{{ url_for('static',filename='js/custom.js') }}"></script> <script src="{{ url_for('static',filename='js/socket.io.js') }}"></script> <script src="{{ url_for('static',filename='js/bootstrap-select.min.js') }}"></script> <script src="{{ url_for('static',filename='js/bootstrap-slider.min.js') }}"></script> <script src="{{ url_for('static',filename='moment/moment.js') }}"></script> <script src="{{ url_for('static',filename='js/jquery.typeahead.min.js') }}"></script> <script src="{{ url_for('static',filename='js/Chart.min.js') }}"></script> <script> {% if not request.endpoint == 'login_page' %} $(document).ready(function () { BadgesAjax(); $(window).on( 'ready orientationchange resize', function() { adjustResponsiveUI(); }); $('.table').on( 'init.dt', function () { adjustResponsiveUI(); } ); $('.table').on('draw.dt', function () { $('[data-toggle="tooltip"]').tooltip({html: true}); }); $(".slider").slider(); $(".slider").on("slide", function(slideEvt) { $(this).next("span").text(slideEvt.value); }); $(".slider").each(function() { $(this).next("span").text($(this).val()); }); events = io.connect({ path: '{{ settings.general.base_url.rstrip('/') }}/socket.io', transports: ['polling'], upgrade: false, reconnection: true, reconnectionDelay: 1000, reconnectionDelayMax: 3000, reconnectionAttempts: 3 }); events.on('reconnect_failed', (reason) => { $('#reconnect_overlay').show(); }); events.on('event', function (event) { var event_json_badges = JSON.parse(event); if (event_json_badges.type === 'badges') { BadgesAjax(); } }); function BadgesAjax() { $.ajax({ url: "{{url_for('api.badges')}}", async: true, success: function (data) { if (data['throttled_providers']) { $('#throttled_providers_count').html('<span class="badge badge-secondary">' + data['throttled_providers'] + '</span>'); } else { $('#throttled_providers_count').html(''); } if (data['missing_episodes']) { $('#wanted_series_badge').html('<span class="badge badge-secondary">' + data['missing_episodes'] + '</span>'); } else { $('#wanted_series_badge').html(''); } if (data['missing_movies']) { $('#wanted_movies_badge').html('<span class="badge badge-secondary">' + data['missing_movies'] + '</span>'); } else { $('#wanted_movies_badge').html(''); } }, error: (function () { setTimeout(function () { setInterval(ping, 2000); }, 8000); }) }) } $('#search').typeahead({ display: 'name', debug: false, cancelButton: true, loadingAnimation: true, asyncResult: false, dynamic: true, delay: 300, source: { search: { ajax: function (query) { return { url: '{{ url_for("api.search")}}', type: 'GET', data: { query: query } } } } }, callback: { onClick: function (node, a, item, event) { window.location.pathname = item.url; } } }); $(window).trigger('orientationchange'); }); // Add apikey to all AJAX requests. $.ajaxSetup({ data: { apikey: "{{ settings.auth.apikey }}" } }); $.ajaxPrefilter(function (options, originalOptions, jqXHR) { if (originalOptions.data instanceof FormData) { originalOptions.data.append("apikey", "{{ settings.auth.apikey }}"); } }); $(window).on('beforeunload', function () { events.close(); }); $('#restart').on('click', function () { $('#loader_button').prop("hidden", true); $('#loader_text').text("Bazarr is restarting, please wait..."); $('#reconnect_overlay').show(); $.ajax({ url: "{{ url_for('api.restart') }}" }) setTimeout(function () { setInterval(ping, 2000); }, 8000); }); function ping() { $.ajax({ url: window.location.href, success: function () { window.location.reload(true); } }); } function adjustResponsiveUI() { if ($(window).width() <= 750) { $('#buttons_bars').width($('body').width()); $('#buttons_bars').css('left', '30px'); } else if ($(window).width() <= 1152) { $('#buttons_bars').width($('body').width() - 60); } else { $('#buttons_bars').width($('body').width() - 240); } if ($(window).width() <= 1170) { $('form .row :first-child').each( function() { $(this).removeClass('text-right'); }) $('.container-fluid .row :first-child').each( function() { $(this).removeClass('text-right'); }) $('.badge').each(function() { $(this).css('max-width', $(this).closest( "div" ).width()); }) } if ($('#buttons_bar_left').children().length > 0 || $('#buttons_bar_right').children().length > 0) { $('#buttons_bars').show(); $('.page-wrapper').attr('style', 'padding-top: 60px !important'); } else { $('#buttons_bars').hide(); $('.page-wrapper').attr('style', 'padding-top: 0px !important'); } } $('#shutdown').on('click', function () { document.open(); document.write('Bazarr has shutdown.'); document.close(); $.ajax({ url: "{{ url_for('api.shutdown') }}", async: true }) }); {% endif %} </script> {% endblock tail_js %} {% block tail %} {% endblock tail %} </body> </html>