Sign inSign up

inkubux/mediaspeed

By inkubux

•Updated over 8 years ago

An mini media server like plex/emby This server is still experimental and only for test purpose

Image
0

835

inkubux/mediaspeed repository overview

⁠MediaSpeed

An experimental mini media server like plex/emby. It tries to be fast light and easy.

MediaSpeed was inspired by

https://github.com/OwenRay/Remote-MediaServer⁠

https://github.com/jansmolders86/mediacenterjs⁠

https://github.com/MediaBrowser/Emby⁠

⁠Status

  • Everything is still very experimental

  • Right now MediaSpeed is only a scraper/indexer with a rest API

  • To create libraries you need to post them with the API

  • The scanner does not start automatically, It can only be triggered by API

  • The scanning is stupid and will overwrite everything

  • The transcoding is really basic

⁠To start the project

Node v8.0 and above! is required

Mediaspeed will create a folder in your home ~/.media_speed/ open the config file

~/.media_speed/config.json 

And put your tmdb api key in the file https://developers.themoviedb.org/3⁠

Install the dependencies

yarn install

⁠GUI

There is a REACT GUI in the frontend/ folder

to start it in dev mode use the following command in the root folder of the project

yarn dev

⁠GUI un prod mode

The gui will be available in the /web url path

yarn build
yarn start

⁠To add a library

curl -X POST \
 http://localhost:500/api/libraries -d '{"path": "/media/Movies", "name":"Movies", "type":"movie"}'

⁠To start a scan

curl -X POST http://localhost:500/api/libraries/scan

⁠Media Directory structure

MediaSpeed tries to work with any directory structure, but it work best if you follow these simple rules

⁠Movies

The movie naming convention should be Movie (year).extension eg: FooBar (2017).mkv

Let's say we have movie a named FooBar, theses 2 structure should work

/my/library/FooBar (2017).mkv
/my/library/FooBar (2017)/FooBar (2017).mkv
⁠TV Shows

The TV Shows Naming convention should be Show Name S01E02 - Episode Title.extension eg: Foo Bar S01E02 - Episode Title.mkv If you put a tv with the same name show in 2 different folders MediaSpeed will treat them as 2 different by design

The ideal tv show structure would be one or the other

/my/library/FooBar/Foo Bar S01E02 - Episode Title.mkv
/my/library/FooBar/Season 01/Foo Bar S01E02 - Episode Title.mkv

⁠Rest API

Each GET api uses node-mongo-querystring⁠ to filter list of resources

⁠Libraries Resource
  • GET /api/libraries node-mongo-querystring⁠ support
  • GET /api/libraries/:uid
  • POST /api/libraries
  • PUD /api/libraries
  • DELETE /api/libraries
  • POST /api/libraries:id/scan Start a scan for one specific libraries
  • POST /api/libraries/scan Start a scan for all libraries
⁠Movies Resource
⁠Episodes Shows Resource
  • GET /api/episodes node-mongo-querystring⁠ support
  • GET /api/episodes/:uid
  • POST /api/episodes
  • PUD /api/episodes
  • DELETE /api/episodes
⁠Shows Resource
  • GET /api/shows node-mongo-querystring⁠ support
  • GET /api/shows/:uid
  • GET /api/shows/:uid/seasons Gets all the seasons of a show
  • GET /api/shows/:uid/seasons/:sid Gets a season for a show the seasons of a show by uid or by number
  • GET /api/shows/:uid/seasons/:sid/episodes Gets episodes for a season in show
  • GET /api/shows/:uid/episodes Gets all episodes for a show
  • POST /api/shows
  • PUD /api/shows
  • DELETE /api/shows
⁠Seasons Resource
  • GET /api/seasons node-mongo-querystring⁠ support
  • GET /api/seasons/:uid
  • POST /api/seasons
  • PUD /api/seasons
  • DELETE /api/seasons
⁠Stream media file
  • GET /stream/movie/:uid Range seekable raw stream for a movie
  • GET /stream/episode/:uid Range seekable raw stream for an episode
  • GET /transcode/movie/:uid Experimental live ffmpeg transcoding
  • GET /transcode/episode/:uid Experimental live ffmpeg transcoding
⁠Transcoding

Right the transcoding is very basic and is not to clever. you can seek through a video by adding the q parameter like so ?q=2973.84760964912 it will seek the video file to this timestamp (It will mess up the progress bar in the apps like vlc or kodi).

⁠Transcoding media file using hls
  • GET /hls/movie/:uid/index.m3u8?session=SESSION_ID Experimental live ffmpeg hls transcoding
  • POST /hls/movie/:uid/stop?session=SESSION_ID Stop live ffmpeg hls transcoding
  • GET /hls/episode/:uid/index.m3u8?session=SESSION_ID Experimental live ffmpeg hls transcoding
  • POST /hls/episode/:uid/stop?session=SESSION_ID Stop live ffmpeg hls transcoding

The hls transcoder is very experimental and seeking sometime cause locking in the web player (hls.js and shaka.js)

It is inspired by how Emby does it. In fact it produce almost the same ffmpeg commands as Emby... They are the only ones working well for me. It creates a fake VOD m3u8 playlist with all the predicted segments and forces key frames with ffmpeg If the codec is not h264 it will transcode video and audio If the codec is h264 it will streamcopy the video but still encode the audio. (This can cause the webplayer to lock if you seek to much, because keyframes are not constant)

The goal of mediaspeed is not transcoding, so for now this method is what I call "Good enough" for streaming with a web player

⁠Stream media file using dash
  • GET /dash/movie/:uid Experimental live ffmpeg dash transcoding
  • GET /dash/episode/:uid Experimental live ffmpeg dash transcoding

The dash transcoder is very experimental and seeking only works in player like vlc It is inspired by how Plex does it, but due to some missing flags in ffmpeg (starting segment number) (segment time shift) The seek does not work and probably never will... until ffmpeg add theses option (which are in the Plex transcoder) The seek works in VLC but will make MPV crash. So it's not recommended for now

The code is there as a reference, there is no "session handling" so you can't start 2 transcoding process of the same file

⁠Known limitations of transcoding
  • There is no client detection right now so pick the right url to stream your video
  • The codec detection only works in hls right now the other methods are there as a reference for later
  • The codec detection is really bad and basic a simple if h264 ... I will add them later if needed

There are a few defined run scripts, here's a list of them with a description of what they do. To run them, simply execute npm run <script name> - e.g. npm run dev

  • start: Used by the production environment to start the app. This will run a compiled version, so you need to execute build first.
  • build: Runs the babel CLI to compile the app. Files are emitted to dist/.
  • dev: Runs the app in development mode - uses babel-node to compile on-the-fly. Also uses nodemon to automatically restart when

⁠Author

  • Francis Bélanger - inkubux

⁠License

MIT.

⁠references

koa-es7-boilerplate⁠

Remote-MediaServer⁠

MediaCenterJS⁠

node-mongo-querystring⁠

Tag summary

Content type

Image

Digest

Size

122 MB

Last updated

over 8 years ago

docker pull inkubux/mediaspeed