123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- {% extends "base.html" %}
- {% load humanize %}
- {% block content %}
- <main class="col-md-4 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">Dashboard</h1>
- <div class="btn-toolbar mb-2 mb-md-0">
- {% if user.is_authenticated %}
- <div class="btn-group me-2">
- {% if user.profile.lastfm_username %}
- <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">
- <span data-feather="calendar"></span>
- This week
- </button>
- <div class="dropdown-menu" data-bs-toggle="#graphDataChange" aria-labelledby="graphDateButton">
- <a class="dropdown-item" href="#">This month</a>
- <a class="dropdown-item" href="#">This year</a>
- </div>
- </div>
- </div>
- </div>
- <canvas class="my-4 w-100" id="myChart" width="900" height="220"></canvas>
- <div class="container">
- {% if user.is_authenticated %}
- <div class="row">
- <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>
- </div>
- <div class="row">
- <div class="col-md">
- <ul class="nav nav-tabs" id="myTab" role="tablist">
- <li class="nav-item" role="presentation">
- <button class="nav-link active" id="home-tab" data-bs-toggle="tab"
- data-bs-target="#artists-week" type="button" role="tab" aria-controls="home"
- aria-selected="true">Weekly Artists</button>
- </li>
- <li class="nav-item" role="presentation">
- <button class="nav-link" id="artist-month-tab" data-bs-toggle="tab"
- data-bs-target="#artists-month" type="button" role="tab" aria-controls="home"
- aria-selected="true">Monthly Artists</button>
- </li>
- <li class="nav-item" role="presentation">
- <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#tracks-week"
- type="button" role="tab" aria-controls="profile" aria-selected="false">Weekly
- Tracks</button>
- </li>
- <li class="nav-item" role="presentation">
- <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#tracks-month"
- type="button" role="tab" aria-controls="profile" aria-selected="false">Monthly
- Tracks</button>
- </li>
- </ul>
- <div class="tab-content" id="myTabContent">
- <div class="tab-pane fade show active" id="artists-week" role="tabpanel"
- aria-labelledby="artists-week-tab">
- <h2>Top artists this week</h2>
- <div class="table-responsive">
- <table class="table table-striped table-sm">
- <thead>
- <tr>
- <th scope="col">#</th>
- <th scope="col">Artist</th>
- </tr>
- </thead>
- <tbody>
- {% for artist in top_weekly_artists %}
- <tr>
- <td>{{artist.num_scrobbles}}</td>
- <td>{{artist.name}}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- </div>
- <div class="tab-pane fade show" id="tracks-week" role="tabpanel" aria-labelledby="tracks-week-tab">
- <h2>Top tracks this week</h2>
- <div class="table-responsive">
- <table class="table table-striped table-sm">
- <thead>
- <tr>
- <th scope="col">#</th>
- <th scope="col">Track</th>
- <th scope="col">Artist</th>
- </tr>
- </thead>
- <tbody>
- {% for track in top_weekly_tracks %}
- <tr>
- <td>{{track.num_scrobbles}}</td>
- <td>{{track.title}}</td>
- <td>{{track.artist.name}}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- </div>
- <div class="tab-pane fade show" id="tracks-month" role="tabpanel"
- aria-labelledby="tracks-month-tab">
- <h2>Top tracks this month</h2>
- <div class="table-responsive">
- <table class="table table-striped table-sm">
- <thead>
- <tr>
- <th scope="col">#</th>
- <th scope="col">Track</th>
- <th scope="col">Artist</th>
- </tr>
- </thead>
- <tbody>
- {% for track in top_monthly_tracks %}
- <tr>
- <td>{{track.num_scrobbles}}</td>
- <td>{{track.title}}</td>
- <td>{{track.artist.name}}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- </div>
- <div class="tab-pane fade show " id="artists-month" role="tabpanel"
- aria-labelledby="artists-month-tab">
- <h2>Top artists this month</h2>
- <div class="table-responsive">
- <table class="table table-striped table-sm">
- <thead>
- <tr>
- <th scope="col">#</th>
- <th scope="col">Artist</th>
- </tr>
- </thead>
- <tbody>
- {% for artist in top_monthly_artists %}
- <tr>
- <td>{{artist.num_scrobbles}}</td>
- <td>{{artist.name}}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </div>
- <div class="col-md">
- <ul class="nav nav-tabs" id="myTab" role="tablist">
- <li class="nav-item" role="presentation">
- <button class="nav-link active" id="home-tab" data-bs-toggle="tab"
- data-bs-target="#latest-listened" type="button" role="tab" aria-controls="home"
- aria-selected="true">Tracks</button>
- </li>
- <li class="nav-item" role="presentation">
- <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#latest-watched"
- type="button" role="tab" aria-controls="profile" aria-selected="false">Videos</button>
- </li>
- <li class="nav-item" role="presentation">
- <button class="nav-link" id="profile-tab" data-bs-toggle="tab"
- data-bs-target="#latest-podcasted" type="button" role="tab" aria-controls="profile"
- aria-selected="false">Podcasts</button>
- </li>
- <li class="nav-item" role="presentation">
- <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#latest-sports"
- type="button" role="tab" aria-controls="profile" aria-selected="false">Sports</button>
- </li>
- </ul>
- <div class="tab-content" id="myTabContent2">
- <div class="tab-pane fade show active" id="latest-listened" role="tabpanel"
- aria-labelledby="latest-listened-tab">
- <h2>Latest listened</h2>
- <div class="table-responsive">
- <table class="table table-striped table-sm">
- <thead>
- <tr>
- <th scope="col">Time</th>
- <th scope="col">Album</th>
- <th scope="col">Track</th>
- <th scope="col">Artist</th>
- </tr>
- </thead>
- <tbody>
- {% for scrobble in object_list %}
- <tr>
- <td>{{scrobble.timestamp|naturaltime}}</td>
- {% if scrobble.track.album.cover_image %}
- <td><img src="{{scrobble.track.album.cover_image.url}}" width=50 height=50
- style="border:1px solid black;" /></td>
- {% else %}
- <td>{{scrobble.track.album.name}}</td>
- {% endif %}
- <td>{{scrobble.track.title}}</td>
- <td>{{scrobble.track.artist.name}}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- </div>
- <div class="tab-pane fade show" id="latest-watched" role="tabpanel"
- aria-labelledby="latest-watched-tab">
- <h2>Latest watched</h2>
- <div class="table-responsive">
- <table class="table table-striped table-sm">
- <thead>
- <tr>
- <th scope="col">Time</th>
- <th scope="col">Title</th>
- <th scope="col">Series</th>
- </tr>
- </thead>
- <tbody>
- {% for scrobble in video_scrobble_list %}
- <tr>
- <td>{{scrobble.timestamp|naturaltime}}</td>
- <td>{% if scrobble.video.tv_series
- %}S{{scrobble.video.season_number}}E{{scrobble.video.episode_number}} -{%
- endif %} {{scrobble.video.title}}</td>
- <td>{% if scrobble.video.tv_series %}{{scrobble.video.tv_series}}{% endif %}
- </td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- </div>
- <div class="tab-pane fade show" id="latest-sports" role="tabpanel"
- aria-labelledby="latest-sports-tab">
- <h2>Latest Sports</h2>
- <div class="table-responsive">
- <table class="table table-striped table-sm">
- <thead>
- <tr>
- <th scope="col">Date</th>
- <th scope="col">Title</th>
- <th scope="col">League</th>
- </tr>
- </thead>
- <tbody>
- {% for scrobble in sport_scrobble_list %}
- <tr>
- <td>{{scrobble.timestamp|naturaltime}}</td>
- <td>{{scrobble.sport_event.title}}</td>
- <td>{{scrobble.sport_event.league.abbreviation}}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- </div>
- <div class="tab-pane fade show" id="latest-podcasted" role="tabpanel"
- aria-labelledby="latest-podcasted-tab">
- <h2>Latest Podcasted</h2>
- <div class="table-responsive">
- <table class="table table-striped table-sm">
- <thead>
- <tr>
- <th scope="col">Date</th>
- <th scope="col">Title</th>
- <th scope="col">Podcast</th>
- </tr>
- </thead>
- <tbody>
- {% for scrobble in podcast_scrobble_list %}
- <tr>
- <td>{{scrobble.timestamp|naturaltime}}</td>
- <td>{{scrobble.podcast_episode.title}}</td>
- <td>{{scrobble.podcast_episode.podcast}}</td>
- </tr>
- {% endfor %}
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </div>
- {% endif %}
- </div>
- </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">
- <span aria-hidden="true">×</span>
- </button>
- </div>
- <form action="{% url '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>
- <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</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">
- <span aria-hidden="true">×</span>
- </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>
- $('#importModal').on('shown.bs.modal', function () { $('#importInput').trigger('focus') });
- $('#exportModal').on('shown.bs.modal', function () { $('#exportInput').trigger('focus') });
- </script>
- {% endblock %}
|