Giter VIP home page Giter VIP logo

jellyfin-vue's Introduction

Jellyfin Vue

Part of the Jellyfin Project


Logo Banner Docker Pulls GHCR images GPL 3.0 License Current Release Conventional Commits Donate Feature Requests Chat on Matrix Join our Subreddit Code coverage Maintainability Rating Reliability Rating Vulnerabilities Code Smells Technical debt Quality gate Duplicated lines Bugs Security Total lines


This is an alternative client for Jellyfin based on Vue.js. It might not be feature complete and it's constantly evolving.

Usage instructions for end users ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ

The following instructions will get you up and running quickly with bleeding-edge builds from the current master branch. There are no stable releases yet.

Hosted by Cloudflare Pages.

โš ๏ธ This only works for Jellyfin servers that are behind a reverse proxy and have HTTPS set up correctly. If your server runs over HTTP, you must use another deployment type.

Docker Container ๐Ÿ“ฆ

You can run the Docker container with the following command, replacing 8080 with the port of your choice:

docker run -d -p 8080:80 ghcr.io/jellyfin/jellyfin-vue:unstable

You can check GitHub Packages (GHCR) (recommended) or DockerHub for all the tagged images.

Other means ๐Ÿ’ฝ

There are more ways to host Jellyfin Vue yourself. Check our wiki page for the most up to date information.

Privacy disclaimer ๐Ÿ•ต๐Ÿป

Jellyfin Vue is just a GUI (Graphical User Interface) for a Jellyfin server. It only establishes connection to the Jellyfin server that you point it to, nothing else.

Read more
  • Local instances Examples: Our Windows/Mac/Linux application, a local web server, etc: All the necessary assets for the frontend to work are available locally (in your device) or bundled into the underlying environment (Tauri, Electron, etc) where it is running. No assets need to be fetched remotely.
  • Remote instances Examples: Our hosted instance, an admin hosting Jellyfin Vue and sharing the URL (which is in a different domain from the Jellyfin Server), etc: This probably comprises most cases. Here, all the frontend assets are not locally available, but somewhere else. When you access the remotely hosted frontend (normally using a web browser like Firefox or Microsoft Edge), all the frontend assets are loaded/cached into your device. Once the load has finished, the connection will exclusively be between your device and the Jellyfin server(s) ยนยฒ. Whoever is serving the frontend is never in the middle. ยณ

ยน Assuming that the hosted version has not been altered (by adding trackers, beacons...) in any way from the sources provided in this repository and you trust the person/people behind it to not have done so.

ยฒ Some features that need access to remote resources that are not controlled by you and/or the person hosting Jellyfin Vue might be added in the future (such as Google Cast support for Chromecasts). These will be always opt in and toggleable through our configuration

ยณ We assume standard networks here, no special configurations or policies that your ISP/Workplace/University/etc might apply.

Jellyfin Web (our main frontend) works in a similar way: It connects by default to the Jellyfin server that is running alongside, but it's also capable to connect to other Jellyfin servers like can be tested in our demo and the hosted instance. By inspecting the network requests, you will find that only connections to fetch its own assets are made to the server distributing the client, but connections to your own Jellyfin server will not go through it.

The same principel applies to Jellyfin Vue. Note that Jellyfin Web can also be hosted standalone, just like Jellyfin Vue.

Usage instructions for developers ๐Ÿ› 

See development setup from our Contributing guides.

Contributing ๐Ÿค

See Contributing guide.

jellyfin-vue's People

Contributors

alanazar avatar alfhou avatar aweebs avatar camc314 avatar danieladov avatar dependabot-preview[bot] avatar dependabot[bot] avatar djcand avatar dkanada avatar doc-code-hub avatar extarys avatar ferferga avatar heyhippari avatar hoanghuy309 avatar kucharczykl avatar larvitar avatar moritzleick avatar nextlooper42 avatar noaione avatar nyanmisaka avatar oatavandi avatar olavinto avatar renovate-bot avatar renovate[bot] avatar shadowghost avatar thibaultnocchi avatar tschwery avatar weblate avatar wolonggl avatar wwwesten 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

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

jellyfin-vue's Issues

Unable to fullscreen

I am unable to fullscreen the media player. The cursor does not change when hovering

Tested on both firefox and chrome. Running master on both server and vue-client

image

Typescript type error in FilterButton component

I get an error regarding the filters field in the ItemsApiGetItemsRequest used in the FilterButton component

TS2322: Type 'string' is not assignable to type 'ItemFilter[] | undefined'.
    249 |             includeItemTypes: this.itemType,
    250 |             recursive: true,
  > 251 |             filters: statusString,
        |             ^^^^^^^
    252 |             genres: genreString,
    253 |             officialRatings: ratingString,
    254 |             videoTypes: videoTypeString,

it seems like the type was changed in commit 7585079

First release blockers

This issue details the needed points to be addressed before we can proceed with the first release.

Major (Mandatory for release)

  • Music player responsiveness (#554, still need addressing for the full screen version)
  • Video player overlay when maximized should timeout when the mouse isn't moved (#583)
  • The artist page needs a responsive pass (#616)
  • Store mutations for position change during playback should be limited to 1 per second (The constant spam of mutations makes performance worse) (#607)
  • Add "Resume" and "Play from the beginning" support (#605)
  • Pass the selected source and video/audio/subtitle tracks to the playback manager when playing an item
  • Use the ItemMenu component for all "three dots" menus in item pages (#565)
  • Search needs to be finished (#345)
  • Onboarding wizard needs to be finished
  • Playing single episodes fails
  • Server is sending a WebM stream where Web sends HLS
  • Episodes are in the wrong season (#480)
  • Missing images (#711, #769)

Intermediate (Nice to have)

Behind the scenes

  • Clean the localization files for real duplicates and those having the same intents

Replace "You may also like"

Yes, this is the most petty of non issues, but personally I think it would sound better as "Related items" or "similar to what you're watching/listening. Since there's a 99% chance that if I took the time to add it to my server, I like it,

Latest build seems to have broken docker.

As of commit 1848, the docker contaner crashes apon boot.

Log: Error: Cannot find module '/app/nginx'

at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15)

at Function.Module._load (internal/modules/cjs/loader.js:667:27)

at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)

at internal/main/run_main_module.js:17:47 {

code: 'MODULE_NOT_FOUND',

requireStack: []

}

Group versions functionality

Is this planned? In jf-web you hold an item for a second, then you can select multiple items and choose to group the versions.

One may decide to require doing this at the file level so jellyfin can pick it up correctly.

Another alternative is to do it in the metadata editor, to keep the complexity down in the user-facing pages.

Migrate to Vue 3

This issue is meant to track what's needed in order for a complete move to Vue 3.

Earliest expected date: Q3 2021

Dependencies

  • Vue 3
  • Nuxt 3 (nuxt/nuxt#5708 - Open beta in Q2 2021)
  • Vuetify 3 (Q3 2021)
  • Vuex 4
  • vue-i18n (v9)
  • nuxt-auth (Dependent on Nuxt 3)
  • nuxt-axios (Dependent on Nuxt 3)
  • nuxt-pwa (Dependent on Nuxt 3)
  • nuxt-i18n (Dependent on vue-i18n and Nuxt 3)
  • nuxt-date-fns (Dependent on Nuxt 3)
  • nuxt-vuex-localstorage (Dependent on Nuxt 3)
  • vue-virtual-scroller (Potentially replaced with custom solution. See #274). Replacement in the works in #606
  • VueperSlides To be replaced with Swiper Replaced in #412
  • eslint-plugin-vue 7.0.0
  • vue-test-utils 2.0.0 (RC-8)
  • vue-axe

Manually-required code changes are, as of yet, unknown. This issue will be updated as information becomes available.

Merged libraries are empty

As reported by @sparky8251 , libraries that are merged for display show up empty.

The call to getItems seems to not happen at all, hence the page never finishing loading.

Reference Docker install #Help #Question

Hi!

Thanks for software

I'm using this Docker image but unable to successfully run it

docker-compose.yaml:

version: "3"
services:

  jellyfin:
    container_name: jellyfin_beta
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
    image: jellyfin/jellyfin-vue:unstable
    ports:
      - 8097:8097
    restart: unless-stopped
    volumes: TODO

log:

Last login: Thu Nov  5 20:13:00 on ttys000
ldexterldesign@apple ~ % cd /Volumes/Secomba/ldexterldesign/Boxcryptor/Dropbox/gtd/home/calendar/Sanitise\ device\ -\ apple/docker/jellyfin\ -\ beta
ldexterldesign@apple jellyfin - beta % docker-compose up
jellyfin_beta is up-to-date
Attaching to jellyfin_beta
jellyfin_beta | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
jellyfin_beta | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
jellyfin_beta | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
jellyfin_beta | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
jellyfin_beta | 10-listen-on-ipv6-by-default.sh: error: /etc/nginx/conf.d/default.conf differs from the packages version
jellyfin_beta | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
jellyfin_beta | /docker-entrypoint.sh: Configuration complete; ready for start up
jellyfin_beta | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
jellyfin_beta | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
jellyfin_beta | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
jellyfin_beta | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
jellyfin_beta | 10-listen-on-ipv6-by-default.sh: error: /etc/nginx/conf.d/default.conf differs from the packages version
jellyfin_beta | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
jellyfin_beta | /docker-entrypoint.sh: Configuration complete; ready for start up
// nothing on 0.0.0.0:8097

Is anyone else successfully running this image?:

  • If yes then would you be kind enough to tell me what I'm doing wrong
  • If no then perhaps we should fix the image

Hope to hear back

Sincerely

"yarn run generate" fails

Tried building on my Windows machine but I didn't have Python installed which is required for node-gyp. I then tried building it in a Linux environment with Python but it failed with TypeScript errors. I guess the lint command doesn't find these errors so adding a build task to CI might prevent these issues.

Logs
$ nuxt-ts generate
[fatal] Nuxt build error
  ERROR in mixins/imageHelper.ts:10:22
  TS2339: Property '$axios' does not exist on type '{ getImageLink(id: string, type: string): string; }'.
  8 |      */
  9 |     getImageLink(id: string, type: string): string {
  > 10 |       return `${this.$axios.defaults.baseURL}/Items/${id}/Images/${type}`;
  |                      ^^^^^^
  11 |     }
  12 |   }
  13 | };
  
  ERROR in pages/item/_itemId.vue:37:17
  TS2533: Object is possibly 'null' or 'undefined'.
  35 |     });
  36 |
  > 37 |     this.item = Item.data.Items[0];
  |                 ^^^^^^^^^^^^^^^
  38 |   }
  39 | });
  40 | </script>
   โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
   โ”‚                             โ”‚
   โ”‚   โœ– Nuxt Fatal Error        โ”‚
   โ”‚                             โ”‚
   โ”‚   Error: Nuxt build error   โ”‚
   โ”‚                             โ”‚
   โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ

Add server manifest checking

When connecting to a server (Either automatically via #139 or with user interaction), we need to check the server for a manifest, in order to confirm that it is a valid Jellyfin server.

This should be done when validating a server on the server selection page and when loading the client.

SD videos not scaled correctly

Running master branch of jellyfin-vue and jellyfin-server
Tested on both chrome and firefox

When viewing SD videos they are scaled incorrectly (see fig. 1). This does not happen on HD movies (fig. 2)

The SD video is an AVC @ 480 x 360 video
The HD video is an AVC @ 1920 x 816 video

image
Fig. 1: SD Image

image
Fig.2: HD Image

Stores don't get cleared on logout

When switching users or servers, the stores don't get cleared out. This can lead to temporarily seeing some items from another server or user account.

The logout process should clear all the stores.

Item select version & video ist broken

First of all thanks for your hard work. This looks very promising!
Just want to let you know, that I came across a small bug on the item page.
See screenshot.

{{ i.value.DisplayTitle }}
needs to be {{ i.value.Name}}. But I couldn't figure out how to fix the dropdown :-(
The Label of the version-select is also wrong (says 'Video').

select

Episodes are in the wrong season

Episodes are part of the wrong seasons. (Using the latest 10.7.0-rc2 server)

Alf in web:
image

Alf in Vue (Should be season 1):
image

Archer in web:
image

Archer in Vue (Should be season 3):
image

Some letters getting clipped in height

I leave this up here to take note of what I found


On my computer, letters which take some height are getting clipped.
print_screen_2020-12-31-16-47-34
print_screen_2020-12-31-16-47-29
print_screen_2020-12-31-16-47-16

It happens with all kind of letters, "y", "รง", etc. Here is what I found:

  • Happens with noto-sans but not with sans-serif
  • Happens on FF 84, Lubuntu 20.10 with 1080p screen
  • Doesn't happen on Chrome, Windows 10, 1080p screen at neither 125% or 100% display settings (not the browser's zoom, the Windows display settings)
  • Doesn't happen on Chrome and FF on Android
  • Unzooming or zooming a few steps in the browser makes the letters appear fully (but the zoom levels aren't the same for all components, 90% works for the "g" in "settings" but not for the "g" in "English")
  • Computed line-height is similar to others

Confirmed user where it works:

Confirmed user where it doesn't work:

As PR #467 shows, setting line-height: normal !important; to concerned components fixes it.


These are my results as of 2020/12/31.

[Enhancement] Add build variant to set router base

  router: {
	[...]
    base: '/web/'
  },

This would allow jellyfin-server to host the generated static files in place of jellyfin-web

Edit: This also doesn't work if jellyfin is hosted under a baseurl
image

Edit many months later:

Setting the router.base field to ./ allows the ui to load, and only vue fonts and images fail to load

Update plugin types

With @nuxt/types 2.14.5, the Inject type is now exposed.

We should remove our custom type definition and use the built-in one.

Example of the changes:

export default (context: Context, inject: PluginInjection): void => {
  inject('snackbar', (message: string, color: string | undefined | null) => {
    context.store.commit('snackbar/display', { message, color });
  });
};
export default (context: Context, inject: Inject): Plugin => {
  inject('snackbar', (message: string, color: string | undefined | null) => {
    context.store.commit('snackbar/display', { message, color });
  });
};

Language reverts to English when clicking on any link

If you have a non-English language set, you'll notice the interface reverts to English when you click on any link. Though it doesn't change the setting server-side, so something must be changing the i18n value directly.

Wasn't present as of e94d675

Is present as of 6dc78e6

So it seems the 6dc78e6 commit introduced it, the one syncing changes to the server

List of features

This is meant to be a somewhat exhaustive list of features to implement in order to consider this client "production-ready". It aims to match (but rework) the feature set of the current Jellyfin web client.

Feel free to claim a feature by opening an issue or a PR to discuss implementation, UI, UX, and usability.

When re-implementing a feature, please don't blindly copy what is done on Jellyfin web. We would like to take this opportunity to rethink everything, with a particular focus on accessibility, user experience and usability.

Note: claimed features are expected to be implemented (or at least started) by the person claiming them. Do not open a discussion for features you do not intend to work on.


General

  • Add Dialog/Modal system
  • Add backdrop support (#105)

Authentication, login and server selection

  • User authentication
  • Login screen
  • Automatic login/Remember me
  • Quick login with visible users
  • Server selection
  • Remember previous servers
  • Server detection (Using a json config file)
  • Server manifest checking
  • Add Quick Connect pin support

Home

  • Continue watching
  • Continue listening
  • Next up
  • Latest
  • Live TV
  • Active recordings
  • My media
  • Pull home section list from the server
  • Provide default sections
  • Provide a skeleton loader for sections

Libraries

  • List libraries for navigation
  • Navigate libraries
  • Navigate folders
  • Provide a skeleton loader for libraries
  • Allow to switch between pagination and infinite scroll
  • Implement a virtual scroller (#119)
  • Add sorting
  • Add filters
  • Add view modes (Movies, Collections, Album Artist, Track, etc)

Item details

  • Implement a basic details page
  • Add season list
  • Add related items
  • Add extras
  • Add actors
  • Add metadata editor
  • Add image editor
  • Add item identification (#114)

Playback

  • Provide a mechanism for platform detection
  • Generate a playback profile
  • Add video playback support (#74)
  • Add audio playback support
  • Add PDF playback support
  • Add EPUB playback support
  • Add CBZ/CBR playback support
  • Add playback manager (Handle playlists, playing multiple items, etc)
  • Add "Play on" feature
  • Add Chromecast support
  • Add playback session reporting
  • Add playback resume support
  • Add subtitle support
  • Add audio track switching support
  • Add forward/back buttons to video player
  • Add next/previous track to video player
  • Add playback speed control to video player
  • Add SyncPlay support
  • Add Up next dialog

Live TV

  • Add channel listing
  • Add guide
  • Add recordings management

User settings

  • Add user account settings (#63)
  • Add home screen settings
  • Add playback settings
  • Add subtitle settings
  • Add display settings

Metadata editor

  • Add folder list
  • Add metadata editor

Server settings

  • Add dashboard (#63)
  • Add general settings
  • Add users settings
  • Add libraries
  • Add library display settings
  • Add NFO settings
  • Add transcoding settings
  • Add resume settings
  • Add streaming settings
  • Add activity log
  • Add DLNA settings
  • Add DLNA profile editor
  • Add TV tuner settings
  • Add DVR settings
  • Add networking settings
  • Add API keys management
  • Add logs viewer
  • Add notification settings
  • Add plugins list
  • Add plugin configuration
  • Add plugin installation
  • Add repository management
  • Add scheduled task configuration

Document how to use Axe

Now that Axe is disabled by default, we should have some kind of documentation (probably in CONTRIBUTING.md) in how to use it for users that are not frequent contributors here, so everyone's able to provide new features while keeping accessibility in mind.

Implement a virtual scroller for the library views

Currently, the library view loads every item, resulting in a very large DOM and really bad performance from the client.

We should only render (and maybe load) what is visible to the user.

Using a component like vue-virtual-scroller (Developed by a member of the core Vue.js team), would be the preferred solution to this. After some tries on my end, this doesn't seem to work. Here's a Google implementation of what we want, for ideas: https://github.com/GoogleChromeLabs/ui-element-samples/blob/gh-pages/infinite-scroller/scripts/infinite-scroll.js

Unable to access artist pages

When trying to access artist pages, "itemId must not be null or undefined when an item object is not passed" appears on the error page.

Is there a todolist๏ผŸ

I want to get involved, but I don't know what needs to be done and which modules are already under development. Hope that there can be a todolist to synchronize this information to help potential developers to participate

Top right fab buttons focus problem

The fab buttons (dark mode and language) both have the same focus problem we had with the (now removed) fab buttons of the audio player (@ferferga). Maybe we should apply the same fix?

Playing a single episode fails

Found this one while moving things around to make a PlayButton component.

Trying to play a single episode of a TV show produces the following error:
TypeError: _a[state.currentItemIndex] is undefined.

Implement video playback

For a MVP of video playback to be considered complete, the following needs to be completed:

Cannot read property 'name' of undefined - when clicking on select subtitles.

It seems that if subtitles doesn't have a defined language (i.e: und), and has no name, so it's blank on select, and when clicking on the select to pick one, it gives undefined error.

It seems that the audio label isn't showing correctly, if it's undefined language.

Excepted:
Screenshot_20201223_161256

Got:

Screenshot_20201223_160935

Screenshot_20201223_160950

--

Some debug information:

Screenshot_20201223_161902

Screenshot_20201223_162001

error yarn install

hello

root@debian:/home/jellyfin-vue# yarn install
yarn install v1.22.5
warning You are using Node "16.0.0-pre" which is not supported and may encounter bugs or unexpected behavior. Yarn supports the following semver range: "^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0"
[1/4] Resolving packages...
[2/4] Fetching packages...
error [email protected]: The engine "node" is incompatible with this module. Expected version ">=10.0.0". Got "16.0.0-pre"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

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.