Problem/Motivation
When adding an oembed remote video with the media module, the resulting video always displays at width 200px height 113px.
This is unlikely to be the desired outcome.
It is likely that most people will expect the video to display at the smaller of 100% width (of the content area) or the original width of the media in px, and maintain the original correct aspect ratio.
#3060968: Some oEmbed videos do not maintain aspect ratio has some examples of alternate .css in comment 27 and 62 to address the issue.
However this suffers from an assumption as to the desired ratio of the source video.
Steps to reproduce
This can be seen on any clean install of Drupal 10.x
1. Install Drupal
2. Enable the media module.
3. Insert a media field into the basic page content type
4. Create a content item with a remote oembed youtube video
It can be observed here:
https://tugboat10-radtonmrxxuykt76b3oveqdu9pp4zqwg.tugboatqa.com/node/59
Proposed resolution
Two potential solutions:
- Alter the attributes of the iframe & its parent in PHP to add inline styles
- Add JavaScript that adds inline styles to set the aspect ratio of the iFrame's parent
| Comment | File | Size | Author |
|---|---|---|---|
| Screenshot 2023-03-24 210222.png | 95.35 KB | martin@manarock.co.uk |
Issue fork drupal-3350299
Show commands
Start within a Git clone of the project using the version control instructions.
Or, if you do not have SSH keys set up on git.drupalcode.org:
Comments
Comment #2
andy-blumComment #3
gauravvvv commentedAs all the modern browsers supports the aspect-ratio property. I have used the same and fixes the issue. please review
Comment #4
martin@manarock.co.uk commentedThis will work for a 16/9 video - do we want to (or should we?) try to solve for other use cases? I don't know if there is a standard approach to a core theme, but either:
1 - We could add classes that allow for common video ratios, probably something like:
16:9 (Widescreen) 16:9
9:16 (Vertical) ...
1:1 (Square) ...
4:3 (Fullscreen) ...
21:9 (Cinematic Widescreen)
2 - We could look to calculate the ratio? I am aware of https://github.com/davatron5000/FitVids.js as jquery solution, and am also aware that jquery is no longer native in 9.x onwards. Is there a javascript approach in core that would help?
Of course these points are moot if its ok for the theme to be opinionated about 16/9 ratios being expected!
Comment #5
andy-blumAs mentioned in #4, this is a very rigid solution, but I don't think adding more, different rigid solutions is the answer. Instead, we probably want to access the iframe's set width/height. Those attributes are set here, but I'm not really sure how we would best make use of them. I'll reach out to the media maintainers to see if they have any input.
Comment #6
andy-blumNew patch attached with new approach that should be more flexible.
Comment #7
smustgrave commentedCould this be related #2966656: Negotiate max width/height of oEmbed assets more intelligently
Comment #8
marcoscanoYes, media using oEmbed in core isn't fully responsive and there are issues in certain scenarios dealing with dimensions (or lack of) that come from the providers. For example:
#3060968: Some oEmbed videos do not maintain aspect ratio
#3061134: oEmbed videos are not fully responsive
#2966656: Negotiate max width/height of oEmbed assets more intelligently
each focusing on one aspect of the same problem, IMO.
So ultimately, I believe this should be solved by the core media module in a generic way for all providers. Having that said, if in the meantime Olivero has a way to workaround it in a generic and simple way, maybe that's reasonable, and also serves as example of how sites can do it in their themes? We could leave a
@todoin the workaround to remove it when the iframe is made fully responsible by the core media module?Also a little suggestion on the latest patch:
This field can be named anything really. It would be great if we could target this in a more generic way. How about something like this instead?
Comment #9
andy-blumComment #10
andy-blumThanks for the feedback, Marcos!
Moved to a MR because I hate making interdiffs.
Comment #12
smustgrave commentedSurprised the bot hasn't got this. But build failure in MR.
Also FWIW I'm reviewing #2966656: Negotiate max width/height of oEmbed assets more intelligently right now too.
Comment #14
rpayanmTrying to fix the CC Failed and improved one line of code.
Comment #15
rpayanmPlease review.
Comment #16
smustgrave commentedAdded 1 comment to MR.
Comment #19
smustgrave commentedCan anyone confirm #2966656: Negotiate max width/height of oEmbed assets more intelligently solve the problem.
Comment #20
dalemoore commentedHi @smustgrave, that issue doesn't fully solve the issue that this issue brings up. While it will return something that isn't 200x113 if you set a maxwidth and maxheight, it only does so for the
<video>. The enclosingiframewill create black bars around the video depending on the width of the viewport or width of the container the iframe is in. It's definitely better than before though!Now that #2966656 is in, I think maybe the issue is the styling of the iframe's aspect ratio.
From what I can tell the only CSS that gets added by default to the iframe is:
That max-width: 100% keeps the iframe from breaking out of its container, making it responsive, but does nothing for maintaining the aspect ratio. If you have a 16/9 video and shrink your browser down to a mobile width size, the video becomes a square. It will still play the video itself at 16/9, but there will be two huge black bars on top and bottom. Ideally, those won't be there.
Using CSS like in #3 won't work as that will affect ALL oEmbeds, such as podcast players, 3D models, etc. Anything that can be embedded via oEmbed by the oEmbed Providers module for example. I tried it and had a too tall Podbean player.
I tested a YouTube embed in WordPress, both a 16/9 one and a different video (https://www.youtube.com/watch?v=UDIQwGb-4YQ) that isn't 16/9, but it looks like WP always embeds at 16/9 and you're just stuck with black bars. So maybe that's the answer here, you'd just need to deal with it in your theme. But if we could manually choose what we want the video's aspect ratio to be, on a per-video basis, that would be great. I'm not sure how to do that though.
For the record, changing the above code to this:
will get rid of the black bars, but then you're hard-coding the aspect-ratio for all oEmbeds. which isn't good. The only thing I can think of is a field on the media item that lets you select an aspect ratio, and then it will add CSS classes (or inline styles) to the media item somehow. 🤷🏻♂️
Comment #21
imclean commentedThe iframe element will have the correct
width=""andheight=""attributes based on the oembed return values.Also, the width and height values returned from the oembed provider will allow you to work out the aspect ratio, but this would require more than just CSS to make use of.
That said, I tend to use FitVids to solve this problem.
Comment #22
winkflo commentedThank you @dalemoore for the CSS. This works for my case. I am only embedding Vimeo Videos. So default aspect-ratio:16/9 is fine for me.
Comment #23
jeffc518 commentedThere is a vanilla JS equivalent of the old jQuery FitVids library - Reframe.js - https://dollarshaveclub.github.io/reframe.js/
It's available as an NPM or Yarn package, so I was able to apply it as simply as this:
Replace the video-frame class with whatever class the parent div of the iframe has in your installation. It applies top padding based on the video's aspect ratio.
Comment #24
smustgrave commented