teams-for-linux icon indicating copy to clipboard operation
teams-for-linux copied to clipboard

Custom background images?

Open nitro322 opened this issue 2 years ago • 10 comments

Hello. I'm using your teams-for-linux client again after switching to the "official" client for a couple of years. With the recent news about Microsoft killing off the Linux client, was delighted to see that this project was still going strong, and even more so to learn that you're supporting background blur and images and various other features Microsoft apparently couldn't be bothered to support themselves on Linux. Very much appreciate what you've been doing here.

I'm trying to add a custom background image. My understanding from some basic searching is that there's supposed to be an Add Image option in the background image selector, but I don't seem to have that. Honestly not sure if this is a bug, known limitation, or if I'm just missing something since I've never done this before.

Can you please provide any guidance on whether this is supported and if so, how to use this feature? Apologies for the basic question here, but couldn't find a clear answer and not sure where else to ask. Thanks.

nitro322 avatar Sep 15 '22 22:09 nitro322

Are you referring to background during video calls? If so, it's already working I believe.

jijojosephk avatar Sep 16 '22 08:09 jijojosephk

Adding a custom background image during video calls, yes. If that's working for you, mind sharing how to do that? I'm expecting to see some kind of Add Image link or button in the "Show background effects" pane. I have the ability to select blur and various canned images, and get the Preview and Apply options, but nothing related to adding images.

nitro322 avatar Sep 16 '22 13:09 nitro322

Ok, i understand now. I was referring to predefined backgrounds in the teams app. Never tried uploading image from local machine. Implementing this feature may be difficult. If it's present in web version, it could be possible here as well. I'd have it checked. Thanks.

jijojosephk avatar Sep 16 '22 14:09 jijojosephk

@nitro322

Can you check in chrome?

https://support.microsoft.com/en-us/office/change-your-background-for-a-teams-meeting-f77a2381-443a-499d-825e-509a140f4780

jijojosephk avatar Sep 16 '22 14:09 jijojosephk

I tested with Vivaldi (not Chrome, but uses the same engine and I've never observed any compatibility issues between it and Chrome) and get the same behavior as the electron app. You bring up a good point about the web version - I was thinking of Teams as a desktop application, but if you're essentially re-packaging the web version then I could see where that feature wouldn't be supported. Checking the link you sent, for example, shows instructions for desktop and mobile clients, but not web.

So, looks like this may not be supported after all. Bummer, but not a big deal. Appreciate the dialog. Feel free to close this if you agree this isn't supported with the web app.

nitro322 avatar Sep 16 '22 14:09 nitro322

It's sort of hidden. You can use the teams-for-linux app itself.

  • Start a call
  • Click on ...
  • Show background effects
  • There you go.

Screenshot from 2022-09-16 22-27-06 Screenshot from 2022-09-16 22-27-58

jijojosephk avatar Sep 16 '22 16:09 jijojosephk

Right, I can find that part. I'm talking about custom images. Ie., this (from that same microsoft link you posted above):

You can also replace your background with one of the images provided, or with one of your own choosing. To use an image of your own, select Add new and then select one to upload from your computer. Make sure it's a .JPG, .PNG, or .BMP file.

That "Add new" option doesn't exist for me.

nitro322 avatar Sep 16 '22 17:09 nitro322

Oh, I see. Have you had used the feature on the destop for linux or have you used windows or mac version?

jijojosephk avatar Sep 16 '22 17:09 jijojosephk

It didn't exist in the Linux client. No background effects options existed. No, I've never used the Windows or Mac version, hence my general uncertainty in the OP as I've never actually used this feature myself before. But many of my work colleagues have used it, so I know it works under the right conditions. Seems like those conditions exclude the web client, unfortunately.

nitro322 avatar Sep 16 '22 17:09 nitro322

Right, I see the images are dynamically loaded from a CDN. We might be able to do some hacks to achieve.

For example: https://static.cdn.microsoft.com/image1 request can be locally served using a different image. By faking the response and make the logic believe that it actually came from a web server. We can experiment.

jijojosephk avatar Sep 16 '22 18:09 jijojosephk

Hi there @jijojosephk, I really hope there is something we could do. Is there could you possibly point me to what specific URL I can overwrite to fake the images? I see the above DNS does not actually exist.

malanvaneck avatar Oct 06 '22 08:10 malanvaneck

@malanvaneck that was just a url I added while writing comment. Not an actual one.

Preview: https://statics.teams.cdn.office.net/evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice03_thumb.png?v=0.1

Background: https://statics.teams.cdn.office.net/evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice03.png?v=0.1

jijojosephk avatar Oct 06 '22 16:10 jijojosephk

Thanks @jijojosephk

Actually faking the URL locally will be a problem as its an HTTPS request:

[19537:1011/141457.927329:ERROR:ssl_client_socket_impl.cc(983)] handshake failed; returned -1, SSL error code 1, net_error -202 [ERROR] Unknown cert issuer for url: https://statics.teams.cdn.office.net/evergreen-assets/backgroundimages/fluentSpaces4.png?v=0.1 [ERROR] Issuer Name: Internet Widgits Pty Ltd [ERROR] The unknown certificate fingerprint is: sha256/qF4veWeE4gVPvPp+5bV0ACX4JxChH39nMhTy+in7s3Q=

malanvaneck avatar Oct 11 '22 12:10 malanvaneck

Apologies, only just now saw the --customCACertsFingerprints option. Got around the cert issues like this: teams-for-linux --customCACertsFingerprints sha256/dRZpQs2cfMlKCdkKOMvGNHASikwm0WmHRtIhEypr880=

Images are not successfully being pulled from my mini python server: 127.0.0.1 - - [11/Oct/2022 16:49:08] "OPTIONS /evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice01.png?v=0.1 HTTP/1.1" 200 - 127.0.0.1 - - [11/Oct/2022 16:49:08] "GET /evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice01.png?v=0.1 HTTP/1.1" 200 - 127.0.0.1 - - [11/Oct/2022 16:49:08] "OPTIONS /evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice01.png?v=0.1 HTTP/1.1" 200 - 127.0.0.1 - - [11/Oct/2022 16:49:08] "GET /evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice01.png?v=0.1 HTTP/1.1" 200 -

But black image on teams-for-linux

malanvaneck avatar Oct 11 '22 14:10 malanvaneck

@malanvaneck I think you're pretty close. I also get black background. You're not changing the protocol or scheme. You might be stuck in CORS issue. What do you see in the debugger?

I took a slightly different route. Looks like the approach I'm taking requires some help from electron dev I guess. I left a comment in bug here

What I tried is below with response ERR_UNKNOWN_URL_SCHEME

// In the main file
protocol.registerSchemesAsPrivileged([
	{
		scheme: 'atom',
		privileges: {
			bypassCSP: true,
			corsEnabled: true,
			secure: true,
			standard: true,
			supportFetchAPI: true
		}
	}
]);

// When app is ready
protocol.registerHttpProtocol('atom', (request, callback) => {
		request.url = path.join(__dirname, '../assets/bg/bg1.png');
		callback(request);
});

// Before request
window.webContents.session.webRequest.onBeforeRequest({ urls: ['https://*/*'] }, (details, callback) => {
	if (details.url === 'https://mywebsite.com/bg/bg1.png') {
		callback({
			redirectURL: 'atom://bg1.png'
		});
	} else {
		// Proceed normally
		callback({});
	}
});

net::ERR_UNKNOWN_URL_SCHEME

jijojosephk avatar Oct 11 '22 18:10 jijojosephk

Hi there @jijojosephk, I see these errors in the logs: 41818:1012/093045.034783:ERROR:ssl_client_socket_impl.cc(983)] handshake failed; returned -1, SSL error code 1, net_error -202

Also, I have noticed that overwriting the statics.teams.cdn.office.net DNS name to point to local causes Teams to sometimes be unresponsive.

malanvaneck avatar Oct 12 '22 09:10 malanvaneck

Hello, I'm extremely interested in this feature. I reboot to the other partition literally only to switch on the company-required background for departmental calls and all the rest of the time I'm peacefully in Linux reading chat. With the previous official client I can confirm it was impossible to switch the background, but for the Windows client it was fairly straightforward to add a custom bg.

Where are the default backgrounds stored? Perhaps one of them could be overwritten?

Xisiqomelir avatar Oct 20 '22 01:10 Xisiqomelir

@Xisiqomelir They're not stored locally, served from a MS CDN. I tried to fake the response from a local file but did not succeed. 32253 seems to be blocker from electron framework.

jijojosephk avatar Oct 20 '22 08:10 jijojosephk

Ahh that’s typically M$ and very annoying.

In any case, thanks for your work in keeping the client alive especially this year that they’re trying to kill it.

Xisiqomelir avatar Oct 20 '22 08:10 Xisiqomelir

@jijojosephk It works if you serve the image via https with an Access-Control-Allow-Origin header (just setting it to * worked). Redirecting to a data: url might also work.

cpfeiffer avatar Dec 26 '22 19:12 cpfeiffer

@cpfeiffer Could you tell us how exactly this can be used?

What code do we need given that we have a URL of a custom background picture? And where do we need to put that code?

Speaking as a user of teams-for-linux, not a developer.

DerXteMensch avatar Jan 12 '23 14:01 DerXteMensch

I tried a data URL (that's some Cat Picutre)

window.webContents.session.webRequest.onBeforeRequest({ urls: ['https://*/*'] }, (details, callback) => {
	if (details.url === 'https://statics.teams.cdn.office.net/evergreen-assets/backgroundimages/teamsBackgroundContemporaryOffice03.png?v=0.1') {
		callback({
			redirectURL: 'data:image/png;base64,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'
		});
	} else {
		// Proceed normally
		callback({});
	}
});

But I am getting

Uncaught TypeError: Cannot read properties of undefined (reading 'session')
    at <anonymous>:1:20

(I tried this in the dev tools )

EDIT: tried inserting it into onBeforeRequestHandler / app/mainAppWindow/index.js:135

UNSAFE_REDIRECT .. happens also for data urls

amenk avatar Jan 20 '23 11:01 amenk

@amenk UNSAFE_REDIRECT : Maybe you need to add the Access-Control-Allow-Origin: * header

Not sure how... I found this https://stackoverflow.com/a/52243138/956397

kw-pr avatar Jan 20 '23 12:01 kw-pr

I tried a lot with CORS and the request but it all caused UNSAFE_REDIRECTS or made everything stop working.

But now I found another way to change the background to a custom one, using the debugger.

image

  1. Search for the function configureEffect
  2. Open a new meeting in a channel
  3. Click any of the built-in backgrounds
  4. Code should stop now at that function
  5. Paste A.backgroundImageUrl = "data: ....." with your image into the console, press enter (probably a hosted image works as well?)
  6. Continue the code

The custom image should show in the preview and I tested that it is also visible to the other party in a call.

Unfortunately that custom background is not preserved after restarts.

The other question is if this can be made usable in a nice way - i.e. is the Electron app able to inject / patch Javascript code?

amenk avatar Jan 20 '23 15:01 amenk

@DerXteMensch Sorry, this is nothing for end-users, yet. I was merely trying to check if it works at all, because all previous attempts in this thread appeared to have been unsuccessful. All I did was patch the onBeforeRequestHandler(), check the URL for one of the default background images and redirect to a custom image of my own. The only "special" thing I had to do was return the Access-Control-Allow-Origin: * policy from my custom server.

To make this usable for end-users, one would

  • allow configuring a server-URL hosting custom background images and the appropriate json file so that the images can be listed in the UI
  • or find a way to host them locally, with or without TLS
  • add the redirect in the onBeforeRequestHandler() to the server-URL or locally hosted service

cpfeiffer avatar Jan 22 '23 18:01 cpfeiffer

Well I have something interesting :smile: Once the page is loaded. Open debug->console and execute the script below.

Replace args[0]=<daturl> with base64 converted image of your choice. You may use https://www.base64-image.de/ to convert.

Click calendar Meet Now Select background effect Click any image

May be we're very close :smile:

const controller = typeof window.angular !== 'undefined' ? window.angular.element(document.documentElement).controller() : null;
const x = controller.callingService._deviceManagerService.setBackgroundImageOnDevice;
controller.callingService._deviceManagerService.setBackgroundImageOnDevice = (...args) => {
	args[0] = '<daturl>'; x.apply(controller.callingService._deviceManagerService, [...args]);
};

jijojosephk avatar May 07 '23 08:05 jijojosephk

@amenk @cpfeiffer try the above.

jijojosephk avatar May 07 '23 08:05 jijojosephk

@jijojosephk Seems to work pretty well. It replaces all the in-built images with the custom one. Draft pull request incoming ...

amenk avatar May 07 '23 09:05 amenk

Breakthrough :tada: Now I need to stitch everything together as a feature. Hooray!

The car image is hosted in apache. So we need to have a light weight web server starting with application at a custom port. Then things are pretty doable.

https://user-images.githubusercontent.com/11662148/236913080-4f5ee054-bf76-431b-a17f-511a24643ada.mp4

jijojosephk avatar May 08 '23 19:05 jijojosephk

@nitro322 @malanvaneck @Xisiqomelir @cpfeiffer @DerXteMensch @amenk @kw-pr try 1.0.84 pre-release. Read https://github.com/IsmaelMartinez/teams-for-linux/tree/develop/app/config

jijojosephk avatar May 09 '23 06:05 jijojosephk