Jump to content

Module: Video embed for YouTube/Vimeo (TextformatterVideoEmbed)


Recommended Posts

Video embed for YouTube and Vimeo

ProcessWire Textformatter module that enables translation of YouTube or Vimeo URLs to full embed codes, resulting in a viewable video in textarea fields you apply it to.

How to install

  • Copy the TextformatterVideoEmbed.module file to your /site/modules/ directory (or place it in /site/modules/TextformatterVideoEmbed/).
  • Click check for new modules in ProcessWire Admin Modules screen. Click install for the module labeled: "Video embed for YouTube/Vimeo".

How to use

  • Edit your body field in Setup > Fields (or whatever field(s) you will be placing videos in). On the details tab, find the Text Formatters field and select "Video embed for YouTube/Vimeo". Save.
  • Edit a page using the field you edited and paste in YouTube and/or Vimeo video URLs each on their own paragraph.


How it might look in your editor (like TinyMCE):

Here are two videos about ProcessWire



And here is a great video I watched earlier this week:


How it works

This module uses YouTube and Vimeo oEmbed services to generate the embed codes populated in your content. After these services are queried the first time, the embed code is cached so that it doesn't need to be pulled again.

The advantage of using the oEmbed services is that you get a video formatted at the proper width, height and proportion. You can also set a max width and max height (in the module config) and expect a proportional video.


You may want to update the max width and max height settings on the module's configuration screen. You should make these consistent with what is supported by your site design.

If you change these max width / max height settings you may also want to check the box to clear cache, so that YouTube/Vimeo oembed services will generate new embed codes for you.

Using with Markdown, Textile or other LML

I mostly assume you are using this with TinyMCE. But there's no reason why you can't also use this with something like Markdown or Textile. This text formatter is looking for a YouTube or Vimeo video URL surrounded by paragraph tags. As a result, if you are using Markdown or Textile (or something else like it) you want that text formatter to run before this one. That ensures that the expected paragraph tags will be present when TextformatterVideoEmbed runs. You can control the order that text formatters are run in by drag/drop sorting in the field editor.

Thanks to Pete for tuning me into these oEmbed services provided by YouTube and Vimeo a long time ago in another thread.

  • Like 12
Link to comment
Share on other sites

The good thing about oembed is that you don't rely on third party scripts/services and many services already support it - see Ryan's module code and you'll see YouTube and Vimeo's oembed URLs

As such, this module can easily be expanded upon to provide more services.

Link to comment
Share on other sites

Michael, that looks interesting. Looks like a lot of cool possibilities there and I look forward to taking a closer look and seeing if there might be another module brewing in there. But I have to admit that I find the whole oEmbed thing a bit vulnerable, as it's letting another web site populate raw markup into your site. You must have a lot of trust in whoever you let do that. It's more sensitive than linking to another service's JS. I have that level of trust with YouTube and Vimeo. I suppose I need to convince myself that something like embed.ly doesn't seem like a potential security timebomb, because the potential is very cool. I'm going to spend some more time looking at it.

  • Like 2
Link to comment
Share on other sites

This is great Ryan, thank you! My only comment is that Vimeo seems to default to https - for me at least. When I tried entering a url like

the formatter didn't seem to catch it. To my surprise I could see how to fix it by duplicating the vimeo section and adding changing it to https. Scary!
  • Like 1
Link to comment
Share on other sites

Thanks Marty, I was wondering about https URLs, but hadn't yet seen any so figured they didn't use them. I have just updated the module to support them, so they should work now (vimeo or youtube).

Link to comment
Share on other sites

Most of the time my customers want self hosted videos. Usually I give them a simple File-Field and embed the video with a <video> tag and include a javascript (mediaelementjs.com) with flash fallback for browsers without html5-video support.

Medialement.js even has a youtube plugin so you can Embed youtube videos like this:

<video width="640" height="360" id="player1" preload="none">
<source type="video/youtube" src="https://www.youtube.com/watch?v=nOEw9iiopwI" />

I have not used this module yet, but maybe Medialement.js is a interesting option to include?

Link to comment
Share on other sites

Mediaelement looks pretty cool, I actually have a use for this on another project and am glad to find out about it. I need to take a closer look to determine if this is something that fits the URL-to-embed code purpose of the module without stepping over the line on front-end dev. But it certainly fits with the name and purpose of the module.

Modal popups are a good idea, but things that might be better in one's front-end development rather than in a text formatting module, given that they are more site/need specific and involve linking to local javascript files and such. These common YouTube/Vimeo video embeds are pretty much universal to the point where one almost expects one of their URLs to convert to a player, so that's what the purpose is here. And that's the most likely way this module would grow (adding more services). Still, this module may be a good starting point for branching in less universal, more site specific needs, and I'd encourage extending it like that.

Link to comment
Share on other sites

Also, Ryan, are you on fire or have you just finished million client projects? You seem to work 50 hours a day, lately.

I wish that was me. You are thinking of Marty. :) I've not launched a bunch of projects lately, not by a long shot. The ones I posted about in Pub a month or two ago were done over a long period of time.

Link to comment
Share on other sites

  • 1 month later...

Hi all,

I'm trying to use the Embed video module, but it doesn't work for me... I followed the documentation, but it failed and I keep wondering what I am doing wrong.

Here's my work :

  • Module upload in 'site/modules/' > Check new module > installation
  • Setup > Fields > body > Details > Textformatters > Video embed
  • In my page body field, I have 2 Youtube links, but they stay as links (no embed...).

If you want to have a look at the page, here it is : http://flenglish.tux...s/the-alphabet/

Thanks for your concern ;-) (And sorry not to be able to find the answer myself...)

Link to comment
Share on other sites

@celfred, you've got two problems in that example:

  • YouTube links need to be alone in their own paragraphs, there shouldn't be any other content in same <p> tag -- try adding the descriptions below or above actual YT links (also: now they're in a list, which probably won't work either)
  • Don't make them actual hyperlinks; I might remember wrong, but IMHO that way they won't work -- just plain URL as a string without the <a> tag

I hope this helps a bit.

  • Like 2
Link to comment
Share on other sites

@teppo, Thank you for your help ! It works better now although I had tried doing this, but on the second link and it never worked. Actually, this second link still doesn't work. I've changed it with another equivalent video (for my purpose), and the new link works...

I can't tell what the problem is... If I copy and paste this link, the video is available...

If someone is interested in understanding the issue, here are my 3 Youtube links (preceded by https://www.youtube.com/ [to avoid the max number of media error I get posting in the Forum]):

  1. watch?v=8-NeizIkHBY
  2. watch?v=Imum21-hdNg
  3. watch?v=dsO__o4Ezjw

Number 1 and number 3 : Video embed without any problem since I followed teppo's advice (in their own paragraph's tags).

Number 2 : no embed... Just a regular text...

Thanks again !

Again, if you want to see the original article : http://flenglish.tux...s/the-alphabet/

Link to comment
Share on other sites

@celfred, either the video you're trying to embed has embedding disabled or this could be a problem (or feature, can't really tell yet) at YouTube. There's similar problem reported at the WordPress bug tracking system here: http://core.trac.wordpress.org/ticket/14377.

This example you gave returns code 401 Unauthorized and this is what oembed.com has to say about this particular error code:

The specified URL contains a private (non-public) resource. The consumer should provide a link directly to the resource instead of any embedding any extra information, and rely on the provider to provide access control.

Will have to do some more testing later.. unless, of course, someone else knows a solution / answer to this problem already :)

  • Like 2
Link to comment
Share on other sites

  • 2 weeks later...

I am having problems with this module. It seems to save the embed codes into the database, which is good. Bad thing is that it saves only one line there. This causes every video to be the same. It seems to fail on video_id part, since my only row in textformatter_video_embed table is this:

<iframe width="640" height="360" src="https://www.youtube.com/embed/9StIWIg03eM?fs=1&feature=oembed" frameborder="0" allowfullscreen></iframe>
2012-09-19 10:40:44

So it saves only www. as video_id and seems to that with every video. Is this problem only on my installation or are other experiencing the same? My url in textarea is in this format:

  • Like 2
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Robin S
      This module lets you add some custom menu items to the main admin menu, and you can set the dropdown links dynamically in a hook if needed.
      Sidenote: the module config uses some repeatable/sortable rows for the child link settings, similar to the ProFields Table interface. The data gets saved as JSON in a hidden textarea field. Might be interesting to other module developers?
      Custom Admin Menus
      Adds up to three custom menu items with optional dropdowns to the main admin menu.
      The menu items can link to admin pages, front-end pages, or pages on external websites.
      The links can be set to open in a new browser tab, and child links in the dropdown can be given an icon.
      Requires ProcessWire v3.0.178 or newer.
      Example of menu items

      Module config for the menus

      Link list shown when parent menu item is not given a URL

      Setting child menu items dynamically
      If needed you can set the child menu items dynamically using a hook.
      $wire->addHookAfter('CustomAdminMenus::getMenuChildren', function(HookEvent $event) { // The menu number is the first argument $menu_number = $event->arguments(0); if($menu_number === 1) { $colours = $event->wire()->pages->findRaw('template=colour', ['title', 'url', 'page_icon']); $children = []; foreach($colours as $colour) { // Each child item should be an array with the following keys $children[] = [ 'icon' => $colour['page_icon'], 'label' => $colour['title'], 'url' => $colour['url'], 'newtab' => false, ]; } $event->return = $children; } }); Create multiple levels of flyout menus
      It's also possible to create multiple levels of flyout submenus using a hook.

      For each level a submenu can be defined in a "children" item. Example:
      $wire->addHookAfter('CustomAdminMenus::getMenuChildren', function(HookEvent $event) { // The menu number is the first argument $menu_number = $event->arguments(0); if($menu_number === 1) { $children = [ [ 'icon' => 'adjust', 'label' => 'One', 'url' => '/one/', 'newtab' => false, ], [ 'icon' => 'anchor', 'label' => 'Two', 'url' => '/two/', 'newtab' => false, 'children' => [ [ 'icon' => 'child', 'label' => 'Red', 'url' => '/red/', 'newtab' => false, ], [ 'icon' => 'bullhorn', 'label' => 'Green', 'url' => '/green/', 'newtab' => false, 'children' => [ [ 'icon' => 'wifi', 'label' => 'Small', 'url' => '/small/', 'newtab' => true, ], [ 'icon' => 'codepen', 'label' => 'Medium', 'url' => '/medium/', 'newtab' => false, ], [ 'icon' => 'cogs', 'label' => 'Large', 'url' => '/large/', 'newtab' => false, ], ] ], [ 'icon' => 'futbol-o', 'label' => 'Blue', 'url' => '/blue/', 'newtab' => true, ], ] ], [ 'icon' => 'hand-o-left', 'label' => 'Three', 'url' => '/three/', 'newtab' => false, ], ]; $event->return = $children; } }); Showing/hiding menus according to user role
      You can determine which menu items can be seen by a role by checking the user's role in the hook.
      For example, if a user has or lacks a role you could include different child menu items in the hook return value. Or if you want to conditionally hide a custom menu altogether you can set the return value to false. Example:
      $wire->addHookAfter('CustomAdminMenus::getMenuChildren', function(HookEvent $event) { // The menu number is the first argument $menu_number = $event->arguments(0); $user = $event->wire()->user; // For custom menu number 1... if($menu_number === 1) { // ...if user does not have some particular role... if(!$user->hasRole('foo')) { // ...do not show the menu $event->return = false; } } });  
    • By tcnet
      This module for ProcessWire sends a notification email for each failed login attempt. Similar modules exists already in the module directory of ProcessWire. However, this module is designed to notify, even if specified user doesn't exist.
      The settings for this module are located in the menu Modules=>Configure=>LoginFailNotifier.
      Notification email
      Specifies the email address to which the notification emails should be sent.
        Email subject
      Specifies the subject line for the notification email.
        Post variables
      Specifies the $_POST variables to be included in the notification email. Each variable must be separated by a comma. For example: login_name,login_pass
        Server variables
      Specifies the $_SERVER variables to be included in the notification email. Each variable must be separated by a comma. For example: REMOTE_ADDR,HTTP_USER_AGENT
      Link to ProcessWire module directory:
      Link to github.com:
    • By Fokke
      ProcessWire 3.x markup module for rendering meta tags in HTML document head section. Note that this module is not a full-blown SEO solution, but rather a simple tool for rendering meta tags based on module configuration. Adding custom meta tags is also supported.
      Built-in meta tags
      The following meta tags are supported out-of-the-box:
      Document title consisting of page title and site name Character set Canonical Viewport Description Keywords Hreflang tags Open Graph og:title og:site_name og:type og:url og:description og:image og:image:width og:image:height Twitter meta tags twitter:card twitter:site twitter:creator twitter:title twitter:description twitter:image Facebook meta tags fb:app_id The full documentation with configurable options can be found here: https://github.com/Fokke-/MarkupMetadata
      ProcessWire>=3.0.0 PHP >=7.1 Installation using Composer
      composer require fokke/markup-metadata Manual installation
      Download latest version from https://github.com/Fokke-/MarkupMetadata/archive/master.zip Extract module files to site/modules/MarkupMetadata directory.
    • By m.sieber
      ITRK-Service for ProcessWire
      Module for the automated transfer of imprint, data protection declaration and terms and conditions from IT-Recht Kanzlei to your ProcessWire installation
      What is ITRK Service for ProcessWire?
      ITRK-Service for ProcessWire is a free module for ProcessWire CMS. It provides an interface to the update service of IT-Recht Kanzlei, via which the legal texts of your online presence are automatically updated. In this way, the texts remain legally secure and warning-proof in the long term. Imprint, data protection declaration, revocation and general terms and conditions are currently supported.
      You can find our documentation (in german language) here: https://www.pupit.de/itrk-service-for-processwire/dokumentation/

      Download: https://www.pupit.de/itrk-service-for-processwire/
      Github: https://github.com/pupit-de/pwItrkServiceConnector
    • By LuisM
      Symprowire is a PHP MVC Framework based and built on Symfony using ProcessWire 3.x as DBAL and Service-Provider
      It acts as a Drop-In Replacement Module to handle the Request/Response outside the ProcessWire Admin. Even tough Symfony or any other mature MVC Framework could be intimidating at first, Symprowire tries to abstract Configuration and Symfony Internals away as much as possible to give you a quick start and lift the heavy work for you.
      The main Goal is to give an easy path to follow an MVC Approach during development with ProcessWire and open up the available eco-system.
      You can find the GitHub Repo and more Information here: https://github.com/Luis85/symprowire
      The Symprowire Wiki https://github.com/Luis85/symprowire/wiki How to create a simple Blog with Symprowire https://github.com/Luis85/symprowire/wiki/Symprowire-Blog-Tutorial Last Update
      16.07.2021 // RC 1 v0.6.0 centralized ProcessWire access trough out the Application by wrapping to a Service https://github.com/Luis85/symprowire/releases/tag/v0.6.0-rc-1 Requirements
      PHP ^7.4 Fresh ProcessWire ^3.0.181 with a Blank Profile Composer 2 (v1 should work, not recommended) The usual Symfony Requirements Features
      Twig Dependency Injection Monolog for Symprowire Support for .env YAML Configuration Symfony Console and Console Commands Symfony Webprofiler Full ProcessWire access inside your Controller and Services Webpack Encore support Caveats
      Symfony is no small Framework and will come with a price in terms of Memory Usage and added Overhead. To give you a taste I installed Tracy Debugger alongside to compare ProcessWire profiling with the included Symfony Webprofiler

      So in a fresh install Symprowire would atleast add another 2MB of Memory usage and around 40ms in response time, should be less in production due to the added overhead of the Webprofiler in dev env
  • Create New...