ConfusedPolarBear / intro-skipper

Fingerprint audio to automatically detect and skip intro sequences in Jellyfin
GNU General Public License v3.0
985 stars 363 forks source link

Run natively on MacOS #164

Closed cellulosa closed 1 year ago

cellulosa commented 1 year ago

Hi there and thanks for the great plugin.

I'm running Jellyfin 10.8.10 natively on MacOS (Ventura 13.3.1, Jellyfin build Darwin X64) and native ffmpeg 6.0.

The plugin fails to run:

2023-05-11 14:46:06.616 +01:00] [ERR] [83] ConfusedPolarBear.Plugin.IntroSkipper.Entrypoint: "The installed version of ffmpeg does not support chromaprint"
[2023-05-11 14:46:06.617 +01:00] [ERR] [83] Emby.Server.Implementations.ScheduledTasks.TaskManager: Error
ConfusedPolarBear.Plugin.IntroSkipper.FingerprintException: ffmpeg with chromaprint is not installed on this system - episodes will not be analyzed. If Jellyfin is running natively, install jellyfin-ffmpeg5. If Jellyfin is running in a container, upgrade it to the latest version of 10.8.0.
   at ConfusedPolarBear.Plugin.IntroSkipper.QueueManager.EnqueueAllEpisodes()
   at ConfusedPolarBear.Plugin.IntroSkipper.AnalyzeEpisodesTask.ExecuteAsync(IProgress`1 progress, CancellationToken cancellationToken)

I tried also to compile jellyfin-ffmpeg 5.1.3-1 and linking that to the jellyfin ffmpeg settings, but keeps throwing the same error.

Any idea on how to run this natively on MacOS?

cellulosa commented 1 year ago

Following up on this, I installed ffmpeg with chromaprint using the following:

brew uninstall --force --ignore-dependencies ffmpeg
brew install chromaprint amiaopensource/amiaos/decklinksdk
brew tap homebrew-ffmpeg/ffmpeg
brew install homebrew-ffmpeg/ffmpeg/ffmpeg --with-chromaprint

I then identified where this brew built version was placed

whereis ffmpeg
ffmpeg: /usr/local/bin/ffmpeg

And pasted that full path under encoding settings and restarted Jellyfin.

I can see the new version was loaded (the version under support bundle changed to 6.0, whereas before was ffmpeg version 5.1.2-tessus).

However, I still get chromaprint_not_supported. Any ideas on why?

* Jellyfin version: 10.8.10
* Plugin version: 0.1.7
* Queue contents: 0 episodes, 0 seasons
* FFmpeg: `chromaprint_not_supported`

FFmpeg version:

ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers
built with Apple clang version 14.0.3 (clang-1403.0.22.14.1)
configuration: 
libavutil      58.  2.100 / 58.  2.100
libavcodec     60.  3.100 / 60.  3.100
libavformat    60.  3.100 / 60.  3.100
libavdevice    60.  1.100 / 60.  1.100
libavfilter     9.  3.100 /  9.  3.100
libswscale      7.  1.100 /  7.  1.100
libswresample   4. 10.100 /  4. 10.100

FFmpeg muxer list:

File formats:
 D. = Demuxing supported
 .E = Muxing supported
 --
  E 3g2             3GP2 (3GPP2 file format)
  E 3gp             3GP (3GPP file format)
  E a64             a64 - video for Commodore 64
  E ac3             raw AC-3
  E adts            ADTS AAC (Advanced Audio Coding)
  E adx             CRI ADX
  E aiff            Audio IFF
  E alaw            PCM A-law
  E alp             LEGO Racers ALP
  E amr             3GPP AMR
  E amv             AMV
  E apm             Ubisoft Rayman 2 APM
  E apng            Animated Portable Network Graphics
  E aptx            raw aptX (Audio Processing Technology for Bluetooth)
  E aptx_hd         raw aptX HD (Audio Processing Technology for Bluetooth)
  E argo_asf        Argonaut Games ASF
  E argo_cvg        Argonaut Games CVG
  E asf             ASF (Advanced / Active Streaming Format)
  E asf_stream      ASF (Advanced / Active Streaming Format)
  E ass             SSA (SubStation Alpha) subtitle
  E ast             AST (Audio Stream)
  E au              Sun AU
  E audiotoolbox    AudioToolbox output device
  E avi             AVI (Audio Video Interleaved)
  E avif            AVIF
  E avm2            SWF (ShockWave Flash) (AVM2)
  E avs2            raw AVS2-P2/IEEE1857.4 video
  E avs3            AVS3-P2/IEEE1857.10
  E bit             G.729 BIT file format
  E caf             Apple CAF (Core Audio Format)
  E cavsvideo       raw Chinese AVS (Audio Video Standard) video
  E codec2          codec2 .c2 muxer
  E codec2raw       raw codec2 muxer
  E crc             CRC testing
  E dash            DASH Muxer
  E data            raw data
  E daud            D-Cinema audio
  E dfpwm           raw DFPWM1a
  E dirac           raw Dirac
  E dnxhd           raw DNxHD (SMPTE VC-3)
  E dts             raw DTS
  E dv              DV (Digital Video)
  E dvd             MPEG-2 PS (DVD VOB)
  E eac3            raw E-AC-3
  E f32be           PCM 32-bit floating-point big-endian
  E f32le           PCM 32-bit floating-point little-endian
  E f4v             F4V Adobe Flash Video
  E f64be           PCM 64-bit floating-point big-endian
  E f64le           PCM 64-bit floating-point little-endian
  E ffmetadata      FFmpeg metadata in text
  E fifo            FIFO queue pseudo-muxer
  E fifo_test       Fifo test muxer
  E film_cpk        Sega FILM / CPK
  E filmstrip       Adobe Filmstrip
  E fits            Flexible Image Transport System
  E flac            raw FLAC
  E flv             FLV (Flash Video)
  E framecrc        framecrc testing
  E framehash       Per-frame hash testing
  E framemd5        Per-frame MD5 testing
  E g722            raw G.722
  E g723_1          raw G.723.1
  E g726            raw big-endian G.726 ("left-justified")
  E g726le          raw little-endian G.726 ("right-justified")
  E gif             CompuServe Graphics Interchange Format (GIF)
  E gsm             raw GSM
  E gxf             GXF (General eXchange Format)
  E h261            raw H.261
  E h263            raw H.263
  E h264            raw H.264 video
  E hash            Hash testing
  E hds             HDS Muxer
  E hevc            raw HEVC video
  E hls             Apple HTTP Live Streaming
  E ico             Microsoft Windows ICO
  E ilbc            iLBC storage
  E image2          image2 sequence
  E image2pipe      piped image2 sequence
  E ipod            iPod H.264 MP4 (MPEG-4 Part 14)
  E ircam           Berkeley/IRCAM/CARL Sound Format
  E ismv            ISMV/ISMA (Smooth Streaming)
  E ivf             On2 IVF
  E jacosub         JACOsub subtitle format
  E kvag            Simon & Schuster Interactive VAG
  E latm            LOAS/LATM
  E lrc             LRC lyrics
  E m4v             raw MPEG-4 video
  E matroska        Matroska
  E md5             MD5 testing
  E microdvd        MicroDVD subtitle format
  E mjpeg           raw MJPEG video
  E mkvtimestamp_v2 extract pts as timecode v2 format, as defined by mkvtoolnix
  E mlp             raw MLP
  E mmf             Yamaha SMAF
  E mov             QuickTime / MOV
  E mp2             MP2 (MPEG audio layer 2)
  E mp3             MP3 (MPEG audio layer 3)
  E mp4             MP4 (MPEG-4 Part 14)
  E mpeg            MPEG-1 Systems / MPEG program stream
  E mpeg1video      raw MPEG-1 video
  E mpeg2video      raw MPEG-2 video
  E mpegts          MPEG-TS (MPEG-2 Transport Stream)
  E mpjpeg          MIME multipart JPEG
  E mulaw           PCM mu-law
  E mxf             MXF (Material eXchange Format)
  E mxf_d10         MXF (Material eXchange Format) D-10 Mapping
  E mxf_opatom      MXF (Material eXchange Format) Operational Pattern Atom
  E null            raw null video
  E nut             NUT
  E obu             AV1 low overhead OBU
  E oga             Ogg Audio
  E ogg             Ogg
  E ogv             Ogg Video
  E oma             Sony OpenMG audio
  E opus            Ogg Opus
  E psp             PSP MP4 (MPEG-4 Part 14)
  E rawvideo        raw video
  E rm              RealMedia
  E roq             raw id RoQ
  E rso             Lego Mindstorms RSO
  E rtp             RTP output
  E rtp_mpegts      RTP/mpegts output format
  E rtsp            RTSP output
  E s16be           PCM signed 16-bit big-endian
  E s16le           PCM signed 16-bit little-endian
  E s24be           PCM signed 24-bit big-endian
  E s24le           PCM signed 24-bit little-endian
  E s32be           PCM signed 32-bit big-endian
  E s32le           PCM signed 32-bit little-endian
  E s8              PCM signed 8-bit
  E sap             SAP output
  E sbc             raw SBC
  E scc             Scenarist Closed Captions
  E sdl,sdl2        SDL2 output device
  E segment         segment
  E smjpeg          Loki SDL MJPEG
  E smoothstreaming Smooth Streaming Muxer
  E sox             SoX native
  E spdif           IEC 61937 (used on S/PDIF - IEC958)
  E spx             Ogg Speex
  E srt             SubRip subtitle
  E stream_segment,ssegment streaming segment muxer
  E streamhash      Per-stream hash testing
  E sup             raw HDMV Presentation Graphic Stream subtitles
  E svcd            MPEG-2 PS (SVCD)
  E swf             SWF (ShockWave Flash)
  E tee             Multiple muxer tee
  E truehd          raw TrueHD
  E tta             TTA (True Audio)
  E ttml            TTML subtitle
  E u16be           PCM unsigned 16-bit big-endian
  E u16le           PCM unsigned 16-bit little-endian
  E u24be           PCM unsigned 24-bit big-endian
  E u24le           PCM unsigned 24-bit little-endian
  E u32be           PCM unsigned 32-bit big-endian
  E u32le           PCM unsigned 32-bit little-endian
  E u8              PCM unsigned 8-bit
  E uncodedframecrc uncoded framecrc testing
  E vc1             raw VC-1 video
  E vc1test         VC-1 test bitstream
  E vcd             MPEG-1 Systems / MPEG program stream (VCD)
  E vidc            PCM Archimedes VIDC
  E vob             MPEG-2 PS (VOB)
  E voc             Creative Voice
  E w64             Sony Wave64
  E wav             WAV / WAVE (Waveform Audio)
  E webm            WebM
  E webm_chunk      WebM Chunk Muxer
  E webm_dash_manifest WebM DASH Manifest
  E webp            WebP
  E webvtt          WebVTT subtitle
  E wsaud           Westwood Studios audio
  E wtv             Windows Television (WTV)
  E wv              raw WavPack
  E yuv4mpegpipe    YUV4MPEG pipe
ConfusedPolarBear commented 1 year ago

Interesting. During startup, the plugin runs several compatibility checks to ensure that ffmpeg has support for all required muxers & filters. The chromaprint check happens here when the plugin searches the output of ffmpeg -muxers for the chromaprint muxer. The logs in the bundle you posted don't contain that muxer, which is why the chromaprint_not_supported error is being thrown.

Unfortunately, I'm unfamiliar with brew, so I'm not sure what you would have to do to enable chromaprint support beyond passing --with-chromaprint to brew install.

cellulosa commented 1 year ago

Alright, I found a (temporary?) solution.

It seems that the --with-chromaprint brewed version is not linked to the main ffmpeg lib (despite brew claiming it is - I also reported it here). I found the full path of the compiled version, which was: /usr/local/Cellar/ffmpeg/6.0-with-options_1/bin/ffmpeg and I could that that running /usr/local/Cellar/ffmpeg/6.0-with-options_1/bin/ffmpeg -muxers would list chromaprint as an option; so I added that full path under encoding settings, restarted Jellyfin and et voilà!

* Jellyfin version: 10.8.10
* Plugin version: 0.1.7
* Queue contents: 95 episodes, 9 seasons
* FFmpeg: `okay`

FFmpeg version:

ffmpeg version 6.0 Copyright (c) 2000-2023 the FFmpeg developers
built with Apple clang version 14.0.3 (clang-1403.0.22.14.1)
configuration: --prefix=/usr/local/Cellar/ffmpeg/6.0-with-options_1 --enable-shared --cc=clang --host-cflags= --host-ldflags= --enable-gpl --enable-libaom --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-libsnappy --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-demuxer=dash --enable-opencl --enable-audiotoolbox --enable-videotoolbox --disable-htmlpages --enable-chromaprint
libavutil      58.  2.100 / 58.  2.100
libavcodec     60.  3.100 / 60.  3.100
libavformat    60.  3.100 / 60.  3.100
libavdevice    60.  1.100 / 60.  1.100
libavfilter     9.  3.100 /  9.  3.100
libswscale      7.  1.100 /  7.  1.100
libswresample   4. 10.100 /  4. 10.100
libpostproc    57.  1.100 / 57.  1.100

The intro skip task is now working!

cellulosa commented 1 year ago

Update on the above, forcing brew to re-link ffmpeg fixed the issue:

brew link --overwrite ffmpeg

Now when I run ffmpeg -muxers | grep chromaprint I can see chromaprint, and can use the main library /usr/local/bin/ffmpeg on Jellyfin too.

ConfusedPolarBear commented 1 year ago

Fixed by #169