MultiFunPlayer
repository·master·Indexed 42 days ago
https://github.com/yoooi0/multifunplayerA synchronization engine that links video playback with hardware device motion using scripts. It supports multiple concurrent outputs, a wide range of video players (including DeoVR, MPV, VLC, and Plex), and various output protocols such as buttplug.io, TCP, UDP, and websockets. The tool features automatic script loading via naming conventions for TCode v0.2 and v0.3, and is extendable via a C# plugin system.
What's inside MultiFunPlayer
- MultiFunPlayer is a synchronization tool that uses scripts to synchronize multiple devices with video files simultaneously. It allows for an enhanced experience by enabling multiple concurrent outputs and supporting a wide range of video players and device protocols.
What is MultiFunPlayer
masterMultiFunPlayer is a synchronization tool that uses scripts to synchronize multiple devices with video files simultaneously. It allows for enhanced experiences by managing multiple scripts and multiple devices at the same time.Supported Output Protocols and Devices
masterThe application supports various output methods to control devices:
Protocols & Interfaces:
- buttplug.io
- TCP
- UDP
- Websockets
- Namedpipes
- Serial
- File
- The Handy (experimental)
Device Support:
- TCode v0.2
- TCode v0.3 (with advanced customization)
Supported Video Players and Script Repositories
masterMultiFunPlayer integrates with a wide variety of video players and script management systems:
Video Players:
- DeoVR
- MPV
- MPC-HC/BE
- HereSphere
- OpenFunscripter
- VLC
- Whirligig
- Plex
- Emby
- Jellyfin
Script Repositories:
- XBVR
- Stash
How to synchronize devices with videos
masterFollow these steps to set up synchronization:
- Add Video Player: Click the top-right "plus" button to add your desired video player.
- Configure Player: Expand settings using the "arrow" button on the right side of the player entry if needed.
- Connect Player: Click Connect.
- Note: For DeoVR, Whirligig, and HereSphere, you must enable remote server/control support in their respective settings.
- Add Output: Click the bottom-right "plus" button to add your desired output device.
- Configure Output: Expand settings using the "arrow" button on the right side.
- Connect Output: Click Connect.
Once connected, you can load scripts manually (drag and drop onto an axis
Filetext box or useScript->Load) or automatically via naming conventions.Install and Setup MultiFunPlayer
masterBefore running MultiFunPlayer, ensure you have the following prerequisites installed on your system:
MultiFunPlayer is a true portable app; no files are created or edited outside of the executable folder.
Download MultiFunPlayer
masterYou can download the latest stable release or check the latest pre-release builds via the following links:
- Latest Release: Available on the GitHub Releases page.
- Pre-release/CI Builds: Available via GitHub Actions.
Extend MultiFunPlayer with C# Plugins
masterMultiFunPlayer features a C# plugin system that allows developers to implement custom behaviors and integrations.Configure the Navbar and Footer in themeConfig
masterThe
themeConfigobject controls the visual components of the site:Navbar Configuration:
title: The text displayed in the navbar.logo: An object containingalttext andsrcpath for the site logo.items: An array of navigation items. Usetype: 'doc'to link to specific documentation pages viadocId.
Footer Configuration:
style: The visual style (e.g.,'dark').links: An array of link groups. Each group has atitleand an array ofitems(each withlabelandhref).copyright: The copyright string displayed in the footer.
themeConfig: ({ navbar: { title: 'MultiFunPlayer', logo: { alt: 'Logo', src: 'img/logo.svg', }, items: [ { type: 'doc', docId: 'intro', position: 'left', label: 'Documentation', }, ], }, footer: { style: 'dark', links: [ { title: 'Links', items: [ { label: 'GitHub', href: 'https://github.com/Yoooi0/MultiFunPlayer', }, ], }, ], copyright: `Copyright © ${new Date().getFullYear()} Yoooi0.`, }, });Configure Docusaurus for MultiFunPlayer documentation
masterThe
docusaurus.config.jsfile defines the site metadata, presets, and theme configuration for the MultiFunPlayer documentation site. Key configuration areas include:- Site Metadata:
title,tagline,favicon,url, andbaseUrl. - Organization Info:
organizationNameandprojectName(used for GitHub Pages integration). - Link Handling:
onBrokenLinks(set to'throw') andonBrokenMarkdownLinks(set to'warn'). - Internationalization (i18n): Configures
defaultLocaleand availablelocales. - Presets: Uses the
'classic'preset with specific settings fordocs(includingsidebarPathandeditUrl),blog(disabled), andtheme(custom CSS path). - Theme Configuration: Defines the
navbar(with logo and navigation items),footer(with links and copyright), andprism(syntax highlighting themes).
import {themes as prismThemes} from 'prism-react-renderer'; /** @type {import('@docusaurus/types').Config} */ const config = { title: 'MultiFunPlayer', tagline: 'Flexible application to synchronize various devices with media playback', favicon: 'img/favicon.ico', url: 'https://yoooi0.github.io', baseUrl: '/MultiFunPlayer/', organizationName: 'Yoooi0', projectName: 'MultiFunPlayer', onBrokenLinks: 'throw', onBrokenMarkdownLinks: 'warn', trailingSlash: false, i18n: { defaultLocale: 'en', locales: ['en'], }, presets: [ [ 'classic', ({ docs: { sidebarPath: './sidebars.js', editUrl: 'https://github.com/Yoooi0/MultiFunPlayer/tree/master/Docs/', }, blog: false, theme: { customCss: './src/css/custom.css', }, }), ], ], themeConfig: ({ navbar: { title: 'MultiFunPlayer', logo: { alt: 'Logo', src: 'img/logo.svg', }, items: [ { type: 'doc', docId: 'intro', position: 'left', label: 'Documentation', }, ], }, footer: { style: 'dark', links: [ { title: 'Links', items: [ { label: 'GitHub', href: 'https://github.com/Yoooi0/MultiFunPlayer', }, { label: 'Patreon', href: 'https://www.patreon.com/yoooi', }, ], }, ], copyright: `Copyright © ${new Date().getFullYear()} Yoooi0.`, }, prism: { theme: prismThemes.github, darkTheme: prismThemes.dracula, }, }), }; export default config;- Site Metadata:
Configure the Docusaurus Docs preset
masterWithin the
presetsarray, thedocsobject allows you to customize how documentation is handled.sidebarPath: Path to the file defining the sidebar structure (e.g.,./sidebars.js).editUrl: The URL where users can go to edit the documentation directly in the source repository (e.g.,https://github.com/Yoooi0/MultiFunPlayer/tree/master/Docs/).
// Inside presets -> classic -> docs docs: { sidebarPath: './sidebars.js', editUrl: 'https://github.com/Yoooi0/MultiFunPlayer/tree/master/Docs/', }Automatic script loading via file naming conventions
masterMultiFunPlayer can automatically load scripts based on the currently played video file name if they follow specific naming patterns. The scripts must be named
<video name>.<suffix>.funscript.Standard Axis Naming
Axis Description Valid file name suffix L0 Up/Down .funscriptL1 Forward/Backward .surge.funscriptL2 Left/Right .sway.funscriptR0 Twist .twist.funscriptR1 Roll .roll.funscriptR2 Pitch .pitch.funscriptTCode v0.2 Naming
Axis Description Valid file name suffix V0 Vibrate .vib.funscriptV1 Pump .lube.funscriptL3 Suction .suck.funscriptTCode v0.3 Naming
Axis Description Valid file name suffix V0 Vibrate .vib.funscriptA0 Valve .valve.funscriptA1 Suction .suck.funscriptA2 Lube .lube.funscriptThese file names are matched in all script libraries and in the currently playing video directory.