Code Monkey home page Code Monkey logo

jellyfin-rewind's Introduction

Jellyfin Rewind Banner

Jellyfin Rewind

Welcome to Jellyfin Rewind 2023!

How to use

Because Jellyfin Rewind is web-based and (for now at least) not available as a plugin, it might be a bit tricky to get your browser to communicate with your Jellyfin server. The problem is that browsers won't allow "insecure" requests (HTTP) from a "secure" website (HTTPS), or requests from a non-private context (website not within your network) to a private context (Jellyfin server accessed over a local IP address within your network).
So make sure you're not using a local IP address (starts with 192.168.) or mDNS hostname (something like jellyfin.local). If you use something like Tailscale as your VPN, you could use your server's Tailscale IP address.

If you're unsure what your Jellyfin server is using, but your Jellyfin server is accessible over the internet, simply use the first link (http)!
If that doesn't work, or your server is NOT accessible over the internet, you could self-host the Jellyfin Rewind website on your local network, for example on the same server that is running Jellyfin. For that, check out the GitHub releases page and either download the zip-archive or use the provided Docker image. The zip-archive will need to be extracted into a folder that is served by a web server, like Apache or Nginx. The Docker image will need a to have port 80 exposed instead.

Links

Local Network / Self-Hosting

If your Jellyfin server is only accessible on your local network, you will need to self-host Jellyfin Rewind so that it's also accessible on your local network. Otherwise your browser will block the connection.
To do this, check out the GitHub releases page and either download the zip-archive or use the provided Docker image here. The zip-archive will need to be extracted into a folder that is served by a web server, like Apache or Nginx. The Docker image will need a to have port 80 exposed instead.

HTTP (works for both http and https Jellyfin servers, as long as they are accessible over the internet):

Make sure your browser shows "insecure" / no lock at the top after opening the link, otherwise connecting to your HTTP-only Jellyfin server might not work!

http://jellyfin-rewind-http.chaphasilor.xyz

HTTPS (only use this if your Jellyfin server has an https connection and is accessible over the internet, this is the best experience):

https://jellyfin-rewind.chaphasilor.xyz

Download your Rewind report!

Please, please, please download your Rewind report at the end!

Jellyfin's statistics aren't very exhaustive, and any additional data could help offer you more insights during next year's Rewind! Especially if you don't have the Playback Reporting plugin installed, this year's Rewind report might come in very handy, so keep it safe!

If something doesn't work and you can't download the data, I'll be happy to help you resolve the issue.

How does it work?

Glad you asked!
Essentially, Jellyfin Rewind loads most of the information about your music from your Jellyfin server, processes it on your device, aggregates some nice statistics, and then shows the result to you!

Your data never leaves your device; it's very similar to using the Jellyfin app on your phone.

Sadly the build in statistics of Jellyfin are pretty lackluster as of now, even with the Playback Reporting plugin, so that a lot of data has to be processed on your device. That's why it takes a few seconds to generate your Rewind report.

For next year, I might release a separate plugin that can use your Jellyfin server in order to crunch the data. This would also solve some of the connection problems that might happen this year. If you're interested in helping me with the plugin, please be sure to reach out!

Can I help out somehow?

If you know something about web development, are a designer of some sorts, or have experience (or are curious about) developing Jellyfin plugins, I'd love to hear from you! There's so much I want to implement for next year's Jellyfin Rewind, and I need your help to bring all these ideas to life!

I had many more features planned for this year, but simply didn't have the time. I originally planned to launch back in November, and that obviously didn't work out :)

Thanks to everyone who uses Jellyfin Rewind, I sincerely hope you enjoyed it as much as I did!
See you next year!!!

jellyfin-rewind's People

Contributors

chaphasilor avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

jellyfin-rewind's Issues

Feature Request: Monthly reports

Hi! I had to migrate my Jellyfin server recently and annoyingly my listening stats did not survive the migration... Would it be possible to add monthly reports (Like I think apple music does). Would be cool to be able to have a mini-wrapped every month.

Artist Images do not load even when present in Jellyfin metadata

Expected: On screens where Artists are the only/main information being portrayed, if an image is present on the server, that image should be used. On artists where there is no Primary or Other image for an artist, perhaps the most recent album's art would be used.
Actual: Images aren't shown for Artists, even when present on the server
Further information: I'm not seeing any failed calls for Artist Images, or any failed network calls in general. I'm using HTTP for my server.
I tried to go through the code to see how the Artist requests and rendering were working, but my eyes glaze over when I look at Javascript unfortunately. It certainly looks like you're getting Image information, but maybe I'm missing something.

Sorry, we couldn't generate your Rewind Report.

Hello, I stumbled across #4 to see if I could solve my problem getting Rewind working on my local only Jellyfin instance (http only also). But both the included sites in this repos readme, and the locally run version you have provided here end up with the following result:

image

Any help would be muchly appreciated!

Possibility of opening up Jellyfin Rewind early this year

Hello,
I love the contributions you have made to the Jellyfin ecosystem! This year, Spotify opened up Spotify wrapped earlier than I expected (today, as of the time of posting). Could Jellyfin Rewind open early as well? I'm sorry if this is a bother.

finamp compatibility

I've noticed there's been a lot of talk about how and whether finamp should tell the server whether a song has been played. Therefore, I have the following question: Are songs played offline in finamp taken into account by Rewind?

Option to Filter by library when multiple present

Expected: When viewing the Rewind, either at the beginning or in the pop up settings, an option to filter out results from non-primary libraries. Most people don't/won't have multiple Music libraries, but in the instance where they do, the other ones might bring in bad data/noise.
Actual: Some song I don't even think I intentionally listened to showed up in the "Most Skips" section. I know this is a niche situation, and I'm not actually sure how the Playback Reporting plugin labels songs in different libraries, if at all.
Further information: This is comparison of two tracks from different libraries (first song is the wrong one, second one is the right one), from the report:

"mostSkipped": [
        {
          "name": "Not Afraid (remix)",
          "id": "8e7084650762e0c47909e46e8965538c",
          "artistsBaseInfo": [
            {
              "id": "23a2a8f858a14ff5814b77e0e8372128",
              "name": "The League of Extraordinary G'"
            }
          ],
          "albumBaseInfo": {
            "id": "048149f048a5cf314afcc7f4d168b14a",
            "name": "Concealed Weapons 2",
            "albumArtistBaseInfo": {
              "id": "23a2a8f858a14ff5814b77e0e8372128",
              "name": "The League of Extraordinary G'"
            }
          },
          "genreBaseInfo": [],
          "image": {
            "parentItemId": "048149f048a5cf314afcc7f4d168b14a",
            "primaryTag": "674b59bc4bc7486c02887ac45541f366"
          },
          "year": null,
          "duration": 262,
          "skips": {
            "partial": 0,
            "full": 2,
            "total": 2,
            "score": {
              "jellyfin": 1.2,
              "playbackReport": 6,
              "average": 2
            }
          },
          "playCount": {
            "jellyfin": 5,
            "playbackReport": 1,
            "average": 3
          },
          "plays": [
            {
              "date": "2023-10-24T15:03:09.942Z",
              "duration": 33,
              "wasFullSkip": true,
              "wasPartialSkip": false,
              "client": "Android",
              "device": "asus ASUS-AI2202",
              "method": "directStream"
            },
            {
              "date": "2023-10-25T07:27:49.874Z",
              "duration": 0,
              "wasFullSkip": true,
              "wasPartialSkip": false,
              "client": "Android",
              "device": "asus ASUS-AI2202",
              "method": "directStream"
            }
          ],
          "mostSuccessivePlays": {
            "playCount": 1,
            "totalDuration": 0
          },
          "lastPlayed": "2023-10-25T13:27:29.264Z",
          "totalPlayDuration": {
            "jellyfin": 21.8078912,
            "playbackReport": 0.55,
            "average": 12
          },
          "isFavorite": false
        },
        {
          "name": "Co-Star",
          "id": "a7117d08a6d3260baddeddecfb212015",
          "artistsBaseInfo": [
            {
              "id": "3899c089ac98a1fb036d49a0620840d8",
              "name": "amaarae"
            }
          ],
          "albumBaseInfo": {
            "id": "6e3f0a5e180ddb70a32fd6513e42759d",
            "name": "Fountain Baby",
            "albumArtistBaseInfo": {
              "id": "3899c089ac98a1fb036d49a0620840d8",
              "name": "amaarae"
            }
          },
          "genreBaseInfo": [
            {
              "id": "f1f202f389018ad2c0766af4b0fcb155",
              "name": "Pop"
            }
          ],
          "image": {
            "parentItemId": "a7117d08a6d3260baddeddecfb212015",
            "primaryTag": "52c004042781323ed9b3043a1da48b28",
            "blurhash": "eUFhbeo#0et7WB9ERj-qo0kBJCxaxCNGoLx]slRjX9NG9ZjZozayt7"
          },
          "year": 2023,
          "duration": 167,
          "skips": {
            "partial": 0,
            "full": 2,
            "total": 2,
            "score": {
              "jellyfin": 0.2857142857142857,
              "playbackReport": 0.35294117647058826,
              "average": 0.3157894736842105
            }
          },
          "playCount": {
            "jellyfin": 21,
            "playbackReport": 17,
            "average": 19
          },
          "plays": [
            {
              "date": "2023-08-02T01:39:08.560Z",
              "duration": 165,
              "client": "Finamp",
              "device": "ASUS_AI2202",
              "method": "directPlay"
            },
            {
              "date": "2023-08-02T10:39:57.077Z",
              "duration": 165,
              "client": "Finamp",
              "device": "ASUS_AI2202",
              "method": "directPlay"
            },
            {
              "date": "2023-08-02T13:16:02.120Z",
              "duration": 144,
              "client": "Sonixd",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-08-02T17:00:11.030Z",
              "duration": 167,
              "wasFullSkip": false,
              "wasPartialSkip": false,
              "client": "Sonixd",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-08-03T09:53:44.121Z",
              "duration": 145,
              "client": "Sonixd",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-08-03T17:10:16.627Z",
              "duration": 165,
              "client": "Finamp",
              "device": "ASUS_AI2202",
              "method": "directPlay"
            },
            {
              "date": "2023-08-04T12:49:24.900Z",
              "duration": 144,
              "client": "Sonixd",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-08-04T16:03:35.282Z",
              "duration": 167,
              "wasFullSkip": false,
              "wasPartialSkip": false,
              "client": "Sonixd",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-08-04T16:24:20.415Z",
              "duration": 145,
              "client": "Sonixd",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-08-04T19:34:21.443Z",
              "duration": 145,
              "client": "Sonixd",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-08-06T14:26:25.358Z",
              "duration": 145,
              "client": "Sonixd",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-08-16T10:13:03.146Z",
              "duration": 145,
              "client": "Sonixd",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-08-31T08:59:13.632Z",
              "duration": 144,
              "client": "Sonixd",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-09-11T10:03:27.491Z",
              "duration": 0,
              "wasFullSkip": true,
              "wasPartialSkip": false,
              "client": "Feishin",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-09-11T10:03:31.142Z",
              "duration": 0,
              "wasFullSkip": true,
              "wasPartialSkip": false,
              "client": "Feishin",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-09-11T10:03:39.993Z",
              "duration": 164,
              "client": "Feishin",
              "device": "PC",
              "method": "directPlay"
            },
            {
              "date": "2023-10-12T19:32:15.295Z",
              "duration": 164,
              "client": "Finamp",
              "device": "ASUS_AI2202",
              "method": "directPlay"
            },
            {
              "date": "2023-12-06T18:49:05.156Z",
              "duration": 166,
              "client": "Finamp",
              "device": "ASUS_AI2202",
              "method": "directPlay"
            },
            {
              "date": "2023-12-30T14:38:19.527Z",
              "duration": 165,
              "client": "Finamp",
              "device": "ASUS_AI2202",
              "method": "directPlay"
            }
          ],
          "mostSuccessivePlays": {
            "playCount": 1,
            "totalDuration": 165
          },
          "lastPlayed": "2023-12-30T21:37:58.399Z",
          "totalPlayDuration": {
            "jellyfin": 58.30400128,
            "playbackReport": 44.083333333333336,
            "average": 52
          },
          "isFavorite": false
        },

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.