samuelmaddock / metastream Goto Github PK
View Code? Open in Web Editor NEWWatch streaming media with friends.
Home Page: https://getmetastream.com/
Watch streaming media with friends.
Home Page: https://getmetastream.com/
Metastream is built using Muon, a fork of Electron for building secure browsers. Muon is being developed by Brave and will soon be abandoned in favor of their own Chromium fork.
While forking Chromium would be ideal for this project, I don't have the resources to do so. This leaves the option of switching back to using Electron.
Electron has recently made some good progress in keeping up-to-date with Chromium (electron/electron#13756) and improving sandboxing support (various). It will need to be evaluated if we can get the same level of security using Electron now, assuming they eventually catch up with Chromium.
One roadblock for using Electron is the lack of a Chrome Extensions API (electron/electron#1498). Metastream's media synchronization is built on top of Muon's extensions API, although it might be possible to implement using a preload script. This also means adding extensions like uBlock Origin would no longer be possible.
Update: https://blog.samuelmaddock.com/posts/google-widevine-blocked-my-browser/
all_frames
content script option. electron/electron#17258chrome.*
APIs to support advanced extensions such as adblockers.ipcRenderer
API to content scripts to support Metastream media remote extension. Or figure out another way to pass messages between renderer and content scripts.It'd be nice if Metastream had continuous integration setup to automatically create new builds.
I'm not yet sure how this would work with an Electron-based app and possibly with codesigning.
A configurable fade time for chat would be nice - it fades a little quickly. Maybe also allow the chat to always be displayed.
Also, being able to drag the edges and resize the chat would be useful (somewhat related to #18).
Let me know what other documentation would be useful for people.
A lot of us use local files and it will be great to be able to watch them together. I don't think it should be that difficult, maybe check if all participants are using the same file and then play the files together?
Release binaries are currently available through a private Amazon S3 account I'm using. GitHub releases will be a better option going forward after open sourcing.
ability to add local or even account based bookmarks (if you go that route) on the add selection page. (maybe next to the the recommended websites like youtube and etc.)
Adding ability to just make the session audio only. for listening to music, podcasts and etc. together with other people.
How about a feature that lets you add local files?
So that you can watch series you own together with friends that are nor around
The program doesn't allow copying or pasting with the right clicking. Both functions are allowed through the Control functions, but it would be easier to use if you could right click.
edit: Localization is now supported. See contribution guide for localizing.
I'd love to be able to support new languages for Metastream. I've started moving strings into their own location https://github.com/samuelmaddock/metastream/tree/master/app/locale
Still need to put some thought into how language changing would affect UX. Also need to implement a way for mixing in strings as in ${username} has added "${mediaTitle}" to the queue
.
Anyone have recommendations for how to coordinate the community in adding translations? It probably wouldn't be great to force them to fork the Git repo.
Is there any way to fix this without doing the direct connection port forward thing?
I really dont want the port forward way.
When a client's local video stream falls out of sync with the session playback time, display an indicator that they're behind. If clicked, it will go away and attempt to resync the video.
Due to video buffering, it may not be possible to ever be 100% in sync depending on the video service. Some kind of buffering prediction could help mitigate this by seeking a little ahead of the session time to counteract buffering time.
Currently the only way to fix being out of sync is to use the Reload button in the playback bar's extra menu OR have the host seek/playpause.
If a user has a playlist of links they'd like to add, support someway to enter these (e.g. csv, txt, input).
If someone is from Portugal for example, He/She will want to use Brazilian Portuguese, so it can use it.
As far as I can tell, there's nothing native specific here right? Just needs to be built and packaged? I can help.
Hi.
Is it possible to use Ethereum Swarm in your app?
Do you support bzz:/ urls?
After logging in to Netflix and selecting the series for example Big Mouth Metastream plays the trailer of the series instead of the episode. This error is in most series, but there are cases where the series is played normally for example Your lie in April.
Users should be protected from websites others have requested into the queue. It would be a good idea to prevent showing websites until the client explicitly approves showing them.
A default allowed list could be included with sites like youtube.com, twitch.tv, etc.
Letting normal or any users request a timestamp change.
in concept normal users can hover over the media controls bar in the timestamp bar, they get a line where they can see exactly where they going to click on hover.
in addition on hovering over the timestamp with mouse you could see a image preview to know exactly where you want to request a timestamp change (similar to something like YouTube player).
After you find where you want to your timestamp change, you just click on the time u want and then you get a pop up confirmation menu/box where you can select "Request" or "Close". On Request, the host or DJ will see a small popup message bubble on top of the timestamp bar where the time change has been requested saying "User123 has requested timestamp change" . it does fade away after (selected seconds) and it will just be a small circle perhaps on top of the timestamp bar and not visible if idle. then if the host wants to do the change he can click on the circle and it will open a confirmation menu/box with options to "Change to 00:00" and "Ignore" or "Deny". and then it just changes to that specific time. this should also be a session option that can be turned off if the host gets annoyed or whatever.
Use cases would be if someone missed something they can always Request for going backwards or if someone for example wants to show something they can request to that point of the video to show it
Steps to Reproduce:
From a report in the Discord channel, Google Drive doesn't autoplay. Seeking was also required to get it to sync up properly.
https://discordapp.com/channels/417584997533483009/489581274537787419/515757367506370560
Something that would be convenient would be the ability to stay on a page after adding a video to the list. That way you don't need to keep reloading sites if you want to add multiple videos from the same playlist/series/channel.
Steps to Reproduce:
The media playback time will be off on the client as the server clock skew was never updated.
A few issues to look into
VrV is completely nonfunctional. I cant watch anything with my buddy who already has an account, yet can see the scrubbing bar and everything
Adding a function/keybind to move the UI boxes on the session UI or even toggle them (only visible on hover maybe?) .
like lets say I could move the chat freely where I want it to be, like being it on the left side.
Steps to Reproduce:
Observe JavaScript error:
Uncaught Exception:
Error: dlopen(/Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/node-67.node, 1): Library not loaded: @loader_path/libsodium.dylib
Referenced from: /Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/node-67.node
Reason: no suitable image found. Did find:
/Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/libsodium.dylib: code signature invalid for '/Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/libsodium.dylib'
/Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/libsodium.dylib: code signature invalid for '/Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/libsodium.dylib'
at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:168:20)
at Object.Module._extensions..node (module.js:596:18)
at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:182:18)
at Module.load (module.js:488:32)
at tryModuleLoad (module.js:447:12)
at Function.Module._load (module.js:439:3)
at Module.require (module.js:498:17)
at require (internal/module.js:20:19)
at load (/Applications/Metastream.app/Contents/Resources/app.asar/node_modules/node-gyp-build/index.js:13:10)
at /Applications/Metastream.app/Contents/Resources/app.asar/node_modules/sodium-native/index.js:1:186
Error: stream.push() after EOF
at readableAddChunk (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\node_modules\readable-stream\lib\_stream_readable.js:264:1)
at Decoder.module.exports../node_modules/swarm-peer-server/node_modules/readable-stream/lib/_stream_readable.js.Readable.push (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\node_modules\readable-stream\lib\_stream_readable.js:238:1)
at Decoder.module.exports../node_modules/swarm-peer-server/node_modules/readable-stream/lib/_stream_transform.js.Transform.push (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\node_modules\readable-stream\lib\_stream_transform.js:146:1)
at Decoder.module.exports../node_modules/swarm-peer-server/node_modules/length-prefixed-stream/decode.js.Decoder._push (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\node_modules\length-prefixed-stream\decode.js:28:1)
at Decoder.module.exports../node_modules/swarm-peer-server/node_modules/length-prefixed-stream/decode.js.Decoder._parseMessage (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\node_modules\length-prefixed-stream\decode.js:57:1)
at Decoder.module.exports../node_modules/swarm-peer-server/lib/socket.js.Decoder._transform (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\lib\socket.js:22:1)
at Decoder.module.exports../node_modules/swarm-peer-server/node_modules/readable-stream/lib/_stream_transform.js.Transform._read (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\node_modules\readable-stream\lib\_stream_transform.js:182:1)
at Decoder.module.exports../node_modules/swarm-peer-server/node_modules/readable-stream/lib/_stream_transform.js.Transform._write (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\node_modules\readable-stream\lib\_stream_transform.js:170:1)
at doWrite (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\node_modules\readable-stream\lib\_stream_writable.js:406:52)
at writeOrBuffer (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\node_modules\readable-stream\lib\_stream_writable.js:395:1)
at Decoder.module.exports../node_modules/swarm-peer-server/node_modules/readable-stream/lib/_stream_writable.js.Writable.write (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\webpack:\node_modules\swarm-peer-server\node_modules\readable-stream\lib\_stream_writable.js:322:1)
at Connection.ondata (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\node_modules\readable-stream\lib\_stream_readable.js:619:20)
at emitOne (events.js:96:13)
at Connection.emit (events.js:191:7)
at addChunk (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\node_modules\readable-stream\lib\_stream_readable.js:291:12)
at readableAddChunk (C:\Users\Sorin\AppData\Local\Programs\metastream\resources\app.asar\node_modules\readable-stream\lib\_stream_readable.js:278:11)
If you're coming from Google, please see the FAQ for general questions.
Steps to Reproduce:
Error: The specified module could not be found.
To fix this, the user needs to install Visual C++ Redistributable for Visual Studio 2015
https://www.microsoft.com/en-us/download/details.aspx?id=48145
This error should be caught on startup and a dialog should instruct the user to download this.
Please upload the AppImage to GitHub Releases, thanks.
Like changing text color, giving it shadow, adding a backdrop fade for better reading. (not only when using the chat).
something similar to rabb.it's reacting emojis on the bottom that pops up on the whole screen.
When a host has to disconnect from a session, everyone else has to disconnect as well. By implementing host migration, other users could continue the session uninterrupted.
A deterministic strategy for selecting a new host needs to be decided. That host will need to create a new lobby and retain the existing media from the session.
If host migration fails, perhaps users could iterate through the next candidate.
Steps to Reproduce:
The app will navigate back to the main menu. It would probably be a good idea to disable this since it might unexpected.
Users can double-click on a page to interact with it. This isn't intuitive and needs some better instructions.
Current thinking for a solution is to add a hint that follows the cursor when a user clicks on the screen.
Double-click to interact with the webpage.
When a user joins a session with the same name as an existing user in the session, there's no way to differentiate them.
Users with the same name should have a duplicate count added to the end of their name. e.g. Sam (2)
Add an option to the session settings menu for changing the max user limit for the session. Should still allow limit to be turned off (maybe 0
is equivalent to infinite?).
Reflect this change in Discord RP invites.
At the moment when you make a new session its going to open the last url u added from the last session you made (Pick up where you left off way of doing it). Maybe a better solution would be something like the settings in google chrome where you can pick between:
In Metastream it could be something more like this:
Steps to Reproduce:
Observed: Client fails to parse update payload and doesn't display new media.
The delta update may be inefficiently networking the shift of items in the queue, resulting in a large payload size. The payload is likely broken up into fragments which aren't being accounted for.
I just find out this program and its amazing. I know u could do something similar with vlc player but only with actual video links and not whole web sync.
Anyway I wanted to ask if you could add a adblock feature. especially for muting video ads. (didnt know it supports chrome extensions)
Another thing is to have link invites instead of codes. And also for public rooms, make something similar to plugdj or rabbit. where you can see a lot of rooms and you can just join any public room to watch with anyone. Also could you please add a chat customization? like so you can move it somewhere else of the screen, toggle it off, add custom backdrop to make it more readable and etc.
Thanks for the work tho, its amazing thing for small or even big communities that want to watch things together.
A lot of video players will go out of full screen if you press escape, yet you also need to press escape to cancel out of Interact mode, so maybe this key can be changed or you can rebind it?
Rich Presence is a feature for Discord for showing the status of a game or app running on a user's machine. They have a Spotify integration which shows the currently playing track which could be cool for Metastream as well.
And while looking at the documentation, they also support multiplayer lobbies. Could be a cool way to perform WebRTC signalling. https://discordapp.com/developers/docs/game-sdk/lobbies
When a large media queue or user list has an item removed, the resulting delta replicated to clients is much larger than it needs to be. Often shifting multiple items in the array instead of simply removing one.
The data structure used for arrays of objects could be changed to an array of object IDs which then index into a map.
interface Item {
id: string
}
interface State {
items: string[]
itemMap: { [key: string]: Item }
}
The resulting delta would still replicate multiple shifted entries, but they would be small strings instead of entire objects.
When I downloaded Metastream on my new mac then out of know where this error pops up after downloading it
Error:
dlopen(/Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/node-67.node, 1): Library not loaded: @loader_path/libsodium.dylib
Referenced from: /Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/node-67.node
Reason: no suitable image found. Did find:
/Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/libsodium.dylib: code signature invalid for '/Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/libsodium.dylib'
/Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/libsodium.dylib: code signature invalid for '/Applications/Metastream.app/Contents/Resources/app.asar.unpacked/node_modules/sodium-native/prebuilds/darwin-x64/libsodium.dylib'
at process.module.(anonymous function) [as dlopen] (ELECTRON_ASAR.js:168:20)
at Object.Module._extensions..node (module.js:596:18)
at Object.module.(anonymous function) [as .node] (ELECTRON_ASAR.js:182:18)
at Module.load (module.js:488:32)
at tryModuleLoad (module.js:447:12)
at Function.Module._load (module.js:439:3)
at Module.require (module.js:498:17)
at require (internal/module.js:20:19)
at load (/Applications/Metastream.app/Contents/Resources/app.asar/node_modules/node-gyp-build/index.js:13:10)
at /Applications/Metastream.app/Contents/Resources/app.asar/node_modules/sodium-native/index.js:1:186
Steps to Reproduce:
Picture of issue: https://i.imgur.com/Ybo4xv6.png
Other notes: Despite going fullscreen, the taskbar does not disappear. It is also a 50/50 chance of replicating it perfectly every time, as it takes some playing around with fullscreen and minimizing/maximizing. It's a very strange bug, but others might wonder what is happening in the future.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.