244 lines
9.2 KiB
HTML
244 lines
9.2 KiB
HTML
{% extends "base.html" %}
|
|
{% load static %}
|
|
{% load humanize %}
|
|
{% load naturalduration %}
|
|
|
|
{% block head_extra %}
|
|
<style>
|
|
.container { margin-bottom:100px; }
|
|
h2 { padding-top:20px; }
|
|
.image-wrapper {
|
|
contain: content;
|
|
}
|
|
.image-wrapper :hover {
|
|
background:rgba(0,0,0,0.3);
|
|
}
|
|
.caption {
|
|
position: fixed;
|
|
top: 5px;
|
|
left: 5px;
|
|
padding: 3px;
|
|
font-size: 90%;
|
|
color:white;
|
|
background:rgba(0,0,0,0.4);
|
|
}
|
|
|
|
.caption-medium {
|
|
position: fixed;
|
|
top: 5px;
|
|
left: 5px;
|
|
padding: 3px;
|
|
font-size: 75%;
|
|
color:white;
|
|
background:rgba(0,0,0,0.4);
|
|
|
|
}
|
|
.caption-small {
|
|
position: fixed;
|
|
top: 5px;
|
|
left: 5px;
|
|
padding: 3px;
|
|
font-size: 60%;
|
|
color:white;
|
|
background:rgba(0,0,0,0.4);
|
|
|
|
}
|
|
.in-progress {
|
|
background: #CCFFFF;
|
|
}
|
|
.in-progress a { color: black }
|
|
</style>
|
|
{% endblock %}
|
|
{% block content %}
|
|
<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
|
|
<div
|
|
class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
|
|
<h1 class="h2">{% if date %}{{date|naturaltime}}{% else %}{{title}}{% endif %}</h1>
|
|
<div class="btn-toolbar mb-2 mb-md-0">
|
|
{% if user.is_authenticated %}
|
|
<div class="btn-group me-2">
|
|
<form action="/admin/" method="get">
|
|
<button type="submit" class="btn btn-sm btn-outline-secondary">
|
|
<span data-feather="key"></span>
|
|
Admin
|
|
</button>
|
|
</form>
|
|
</div>
|
|
<div class="btn-group me-2">
|
|
{% if user.profile.lastfm_username and not user.profile.lastfm_auto_import %}
|
|
<form action="{% url 'scrobbles:lastfm-import' %}" method="get">
|
|
<button type="submit" class="btn btn-sm btn-outline-secondary">Last.fm Sync</button>
|
|
</form>
|
|
{% endif %}
|
|
{% if prev_link %}
|
|
<a type="button" class="btn btn-sm btn-outline-secondary" href="{{prev_link}}"
|
|
data-bs-target="#">Previous</a>
|
|
{% endif %}
|
|
{% if today_link %}
|
|
<a type="button" class="btn btn-sm btn-outline-secondary" href="{{today_link}}"
|
|
data-bs-target="#">Today</a>
|
|
{% endif %}
|
|
{% if next_link %}
|
|
<a type="button" class="btn btn-sm btn-outline-secondary" href="{{next_link}}"
|
|
data-bs-target="#">Next</a>
|
|
{% endif %}
|
|
</div>
|
|
<div class="btn-group me-2">
|
|
{% if user.profile.lastfm_username and not user.profile.lastfm_auto_import %}
|
|
|
|
<form action="{% url 'scrobbles:lastfm-import' %}" method="get">
|
|
<button type="submit" class="btn btn-sm btn-outline-secondary">Last.fm Sync</button>
|
|
</form>
|
|
{% endif %}
|
|
<button type="button" class="btn btn-sm btn-outline-secondary" data-bs-toggle="modal"
|
|
data-bs-target="#importModal">Import</button>
|
|
<button type="button" class="btn btn-sm btn-outline-secondary" data-bs-toggle="modal"
|
|
data-bs-target="#exportModal">Export</button>
|
|
</div>
|
|
{% endif %}
|
|
<div class="dropdown">
|
|
<button type="button" class="btn btn-sm btn-outline-secondary dropdown-toggle" id="graphDateButton"
|
|
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
<div data-feather="calendar"></div>
|
|
{{title}}
|
|
</button>
|
|
<div class="dropdown-menu" data-bs-toggle="#graphDataChange" aria-labelledby="graphDateButton">
|
|
<a class="dropdown-item" href="?date=today">Today</a>
|
|
<a class="dropdown-item" href="?date=this_week">This week</a>
|
|
<a class="dropdown-item" href="?date=this_month">This month</a>
|
|
<a class="dropdown-item" href="?date=this_year">This year</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if not user.is_authenticated %}
|
|
<p>Today <b>{{counts.today}}</b> | This Week <b>{{counts.week}}</b> | This Month <b>{{counts.month}}</b> | This Year <b>{{counts.year}}</b> | All Time <b>{{counts.alltime}}</b></p>
|
|
<canvas class="my-4 w-100" id="myChart" width="900" height="300"></canvas>
|
|
{% else %}
|
|
<div class="container">
|
|
<div class="row">
|
|
{% include "scrobbles/_last_scrobbles.html" %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
</main>
|
|
|
|
<div class="modal fade" id="importModal" tabindex="-1" role="dialog" aria-labelledby="importModalLabel"
|
|
aria-hidden="true">
|
|
<div class="modal-dialog" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="importModalLabel">Import scrobbles</h5>
|
|
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
|
|
<div aria-hidden="true">×</div>
|
|
</button>
|
|
</div>
|
|
<form action="{% url 'scrobbles:audioscrobbler-file-upload' %}" method="post" enctype="multipart/form-data">
|
|
<div class="modal-body">
|
|
{% csrf_token %}
|
|
<div class="form-group">
|
|
<label for="tsv_file" class="col-form-label">Audioscrobbler TSV file:</label>
|
|
<input type="file" name="tsv_file" class="form-control" id="id_tsv_file">
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="submit" class="btn btn-primary">Import</button>
|
|
</div>
|
|
</form>
|
|
<form action="{% url 'scrobbles:koreader-file-upload' %}" method="post" enctype="multipart/form-data">
|
|
<div class="modal-body">
|
|
{% csrf_token %}
|
|
<div class="form-group">
|
|
<label for="tsv_file" class="col-form-label">KOReader sqlite file:</label>
|
|
<input type="file" name="sqlite_file" class="form-control" id="id_sqlite_file">
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="submit" class="btn btn-primary">Import</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="modal fade" id="exportModal" tabindex="-1" role="dialog" aria-labelledby="exportModalLabel"
|
|
aria-hidden="true">
|
|
<div class="modal-dialog" role="document">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="exportModalLabel">Export scrobbles</h5>
|
|
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
|
|
<div aria-hidden="true">×</div>
|
|
</button>
|
|
</div>
|
|
<form action="{% url 'scrobbles:export' %}" method="get">
|
|
<div class="modal-body">
|
|
{% csrf_token %}
|
|
<div class="form-group">
|
|
{{export_form.as_div}}
|
|
</div>
|
|
</div>
|
|
<div class="modal-footer">
|
|
<button type="submit" class="btn btn-primary">Export</button>
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block extra_js %}
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/feather-icons@4.28.0/dist/feather.min.js" integrity="sha384-uO3SXW5IuS1ZpFPKugNNWqTZRRglnUJK6UAZ/gxOX80nxEkN9NcGZTftn6RzhGWE" crossorigin="anonymous"></script><script src="https://cdn.jsdelivr.net/npm/chart.js@2.9.4/dist/Chart.min.js" integrity="sha384-zNy6FEbO50N+Cg5wap8IKA4M/ZnLJgzc6w2NqACZaK0u0FXfOWRRJOnQtpZun8ha" crossorigin="anonymous"></script>
|
|
<script>
|
|
/* globals Chart:false, feather:false */
|
|
(function () {
|
|
'use strict'
|
|
|
|
feather.replace({ 'aria-hidden': 'true' })
|
|
|
|
// Graphs
|
|
var ctx = document.getElementById('myChart')
|
|
// eslint-disable-next-line no-unused-vars
|
|
var myChart = new Chart(ctx, {
|
|
type: 'line',
|
|
data: {
|
|
labels: [
|
|
{% for day in weekly_data.keys %}
|
|
"{{day}}"{% if not forloop.last %},{% endif %}
|
|
{% endfor %}
|
|
],
|
|
datasets: [{
|
|
data: [
|
|
{% for count in weekly_data.values %}
|
|
{{count}}{% if not forloop.last %},{% endif %}
|
|
{% endfor %}
|
|
],
|
|
lineTension: 0,
|
|
backgroundColor: 'transparent',
|
|
borderColor: '#007bf0',
|
|
borderWidth: 4,
|
|
pointBackgroundColor: '#007bff'
|
|
}]
|
|
},
|
|
options: {
|
|
scales: {
|
|
yAxes: [{
|
|
ticks: {
|
|
beginAtZero: true
|
|
}
|
|
}]
|
|
},
|
|
legend: {
|
|
display: false
|
|
}
|
|
}
|
|
})
|
|
})()
|
|
|
|
</script>
|
|
{% endblock %}
|