Skip to content

A shortcode for Textpattern CMS which allows the easy embedding of local or external media in articles.

License

Notifications You must be signed in to change notification settings

colak/txp-media-shortcode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

txp-media-shortcode

Introduction

This textpattern shortcode draws inspiration from Nicolas Morand's oui_player plugin and tries to produce similar results using textapattern's native tags but also make the players GDPR compliant. In the case of locally hosted media no cookie consent is required. This work was encouraged by Stef Dawson, who first developed the smd_macro textpattern plugin. This later became part of txp's core code thanks to Oleg's reworking of the native <txp:yield /> tag. Finally, many thanks are also due to Michael K. Pate for the exhaustive testing and help for the detection of numerous bugs.

Disclaimer (further to the one in the Licence)

Obviously, the author does not agree with one, or any of the policies or content of the providers the shortcode supports.

Dependencies

  • Textpattern 4.7+
  • oui_cookie
  • etc_query
  • The media hosts' url schemas and embed codes.
  • Georestrictions and privacy settings of individual media.
  • The availability of the content. Millions of videos and sound-files are taken off the web daily. This is because they are removed by the original uploader or blocked by the hosts (usually because of DMCA notices).

Advantages and disadvantages of shortcodes

Shortcodes are easy to edit by those without any knowledge of php but with sufficient knowledge of html and txp tags.

If you often embed media in your website, it is much easier to update the shortcode when providers change their embed scripts rather than find and change all instances of the embedded content in your articles.

The shortcode's GDPR warnings are parsed automatically, which save on typing, remembering cookie names, and privacy policy links.

When visitors accept a particular host's cookies, they do so for all embeds from that host site-wide.

Shortcodes are normally slightly slower in execution than raw php, or txp plugins.

Installing

  1. Copy the latest txp snippet from the GitHub project page,
  2. Create a new miscellaneous form in your Textpattern administration interface and name it media,
  3. Paste the code into the form you created, and save.
  4. Copy the media providers you are using for your website and paste those codes in new miscellaneous forms, using the same names as the ones provided without the tpl extension. For example media_yt.tplshould be media_yt.
  5. Copy and paste the provided css in your style sheet and edit it to your liking.

Cookies

According to GDPR, webmasters should never serve any tracking cookies without their visitors' explicit consent. The GDPR gives the right to any EU citizen to legally institute legal proceedings against any website owner, regardless of the website's or owner's location. The cookies served by the oui_cookie plugin do not track, but most media hosting providers do include tracking in their embeddable content. The acceptance cookies last for a duration of one year.

The above is but only one of the steps needed for full adherence to the EU law which also requests for a privacy policy and a description of the first and third party cookies served. Examples of such pages can be found in the neme.org site on:

Usage

  1. To embed the media, simply use

==<txp::media from="xxx" media="yyy" title="my text here" />==

  1. Using the shortcode above, insert the id of the media file in the media attribute. The id can normally be found in the url of the video. For example:
  1. Use the title attribute should you wish to have a textile enabled descriptive text in the GDPR container. This text is replaced by the embed container once the cookie for the particular provider is accepted.

  2. The url attribute is used in different ways, explained in the examples.

Errors and warnings

You may see some errors and warnings after posting your shortcodes. These can appear before or after the cookies are accepted and they are only visible to logged-in users. They were added as prompts to promote the proper usage of the attributes.

Attributes

  1. from (required)
  2. media (required)
  3. title (recommended)
  4. url (Required or recommended by some hosts)
  5. img (optional id of an image from the database)
  6. others. (See examples.)

Details

Media hosts from url title img others Examples
Video or audio
Local local url="v" ISO 639-1 âś“ mp4, ogg, mpeg-4, flac, webm, m4v, mpg (5)
url="a" NA NA m4a, mp3, ogg, mp4, sac, webm, flac (3)
Internet Archive ia url="v" âś“ âś“ NA (7)
url="a" NA
Video
YouTube yt   ✓ ✓ 0 (6)
url="pl"
url="user"
Vimeo v   ✓ ✓ NA (1)
url="a"
url="vr"
DailyMotion dm NA âś“ âś“ 0
Utreon u NA âś“ âś“ 0
Utreon twitch NA âś“ âś“ 0
PeerTube peer NA âś“ âś“ 0
Rumble rum NA âś“ NA NA
TED ted NA âś“ âś“ NA
Vidyard vy NA âś“ âś“ 0
Vlare vl NA âś“ âś“ NA
Freespeechtube fst NA âś“ âś“ NA
BitChute bc NA âś“ âś“ NA
Playtube pt NA âś“ âś“ 0
YouTube-nocookie 1 ytnc NA âś“ âś“ 0
MetaCafe mc NA âś“ âś“ 0 Rebranded as Videoshub
Coub cb NA âś“ âś“ NA
Video and GIF
Giphy gp url="g" âś“ âś“ NA (4)
url="v"
Audio
AudioBoom ab NA âś“ NA NA
IndieSound is NA âś“ NA NA
SoundCloud sc url in SoundCloud âś“ NA NA (2)
Spotify sf NA âś“ âś“ NA
BandCamp (albums) bac Artist’s name as it appears in the subdomain NA ✓ NA (8)
MixCloud mix Artist’s name as it appears in the url ✓ NA NA (9)
Others
Google Maps 2 gm NA âś“ âś“ NA
Datawrapper dw NA âś“ âś“ NA

Examples

1. Embed from Vimeo

The shortcode allows for individual video embeds and Vimeo albums.

To embed an individual video use

<txp::media from="v" media="336049258" title="My awesome video" img="33" />

Resulting code before cookie is accepted

<div class="gdpr">
	<img src="http(s)://site.tld/images/33.jpg" width="720" height="576" alt="still from my ausome video" />
	<p>My awesome video</p>
	<p>Hosted by Vimeo on <a rel="external noopener" href="https://vimeo.com/336049258">vimeo.com/336049258</a>.</p>
	<p><a rel="external noopener" href="https://vimeo.com/privacy">Vimeo&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_vimeo_cookie=yes#m_336049258">View it here</a></p>
</div>

Resulting code after cookie is accepted

<div class="embed-container" id="m_336049258" itemscope itemtype="http://schema.org/VideoObject">
	<iframe src="https://player.vimeo.com/video/336049258?title=0&amp;byline=0&amp;portrait=0" allowfullscreen></iframe>
</div>

The title attribute is textile enabled. As such you can have

<txp::media from="v" media="336049258" title="h3. My awesome video" img="33" />

Resulting code before cookie is accepted

<div class="gdpr">
	<txp:img src="http(s)://site.tld/images/33.jpg" width="720" height="576" alt="still from my ausome video" />
	<h3>My awesome video</h3>
	<p>Hosted by Vimeo on <a rel="external noopener" href="https://vimeo.com/336049258">vimeo.com/336049258</a>.</p>
	<p><a rel="external noopener" href="https://vimeo.com/privacy">Vimeo&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_vimeo_cookie=yes#m_336049258">View it here</a></p>
</div>

For Vimeo albums use the url="a" attribute

<txp::media from="v" media="2217152" url="a" title="Through the Roadblocks" img="33" />

Resulting code after cookie is accepted

<div class="embed-container" id="m_2217152" itemscope itemtype="http://schema.org/VideoObject">
	<iframe src='https://vimeo.com/showcase/2217152/embed' allowfullscreen frameborder='0' style='position:absolute;top:0;left:0;width:100%;height:100%;'></iframe>		</div>

<txp::media from="v" media="336049258" title="My awesome video" img="33" />

2. Embed from SoundCloud

<txp::media from="sc" media="336049258" title="News from Nowhere" />

Resulting code before cookie is accepted

<div class="gdpr">
	<p>News from Nowhere</p>
    	<p>Hosted by  <a rel="external noopener" href="https://soundcloud.com/">SoundCloud</a>.</p>
	<p><a rel="external noopener" href="https://soundcloud.com/pages/privacy">SoundCloud&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_soundcloud_cookie=yes#m_336049258">Listen to it here</a></p>
</div>

Resulting code after cookie is accepted

<div class="embed-container" id="m_336049258" itemscope itemtype="http://schema.org/AudioObject">
	<iframe width="100%" height="300" scrolling="no" frameborder="no" allow="autoplay" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/336049258&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=true&amp;show_comments=false&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true"></iframe>
</div>

Embed from SoundCloud using the url attribute

<txp::media from="sc" media="336049258" title="News from Nowhere" url="https://soundcloud.com/furtherfield/news-from-where-we-are-1" />

Resulting code before cookie is accepted

<div class="gdpr">
	<p>News from Nowhere</p>
	<p>Hosted by SoundCloud on <a rel="external noopener" href="https://soundcloud.com/furtherfield/news-from-where-we-are-1">https://soundcloud.com/furtherfield/news-from-where-we-are-1</a>.</p>
	<p><a rel="external noopener" href="https://soundcloud.com/pages/privacy">SoundCloud&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_soundcloud_cookie=yes#m_336049258">Listen to it here</a></p>
</div>

The resulting code after the cookie is accepted is the same as the one in the second example.

3. Embed local audio

The html5 audio tag, allows for the embedding of multiple formats to enhance compatibility with the various browsers and computer setups. To embed music residing in your installation's files directory, first upload the audio files using the same name followed by the extension. In your articles call the file name and state the extensions you have encoded those files to. (Currently the tag supports m4a, mp3, mp4, aac, webm, flac and ogg). You may want to check the formats supported by different web browsers.

<txp::media from="local" url="a" media="my_title" m4a mp3 flac />

The resulting code will be

<span itemscope itemtype="http://schema.org/AudioObject">
	<audio controls>
		<source src="http(s)://site.tld/files/files/my_title.m4a" type="audio/m4a">
		<source src="http(s)://site.tld/files/files/my_title.mp3" type="audio/mpeg">
		<source src="http(s)://site.tld/files/files/my_title.flac" type="audio/flac">
		<p>Your browser does not support the audio element.</p>
	</audio>
</span>

4. Embed from Giphy

Giphy offers two types of urls based on the media type, gif and video.

  • giphy.com/gifs/name
  • giphy.com/videos/name

To embed a gif from Giphy use

<txp::media from="gp" media="QZyYmcnN7uYgx6uGyL" title="We want justice" url="g" />

Resulting code before cookie is accepted

<div class="gdpr">
	<p>We want justice</p>
	<p>Hosted by Giphy on <a rel="external noopener" href="https://giphy.com/gifs/QZyYmcnN7uYgx6uGyL">giphy.com/gifs/QZyYmcnN7uYgx6uGyL</a>.</p>
	<p><a rel="external noopener" href="https://support.giphy.com/hc/en-us/articles/360032872931-GIPHY-Privacy-Policy">Giphy&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_giphy_cookie=yes#m_QZyYmcnN7uYgx6uGyL">View to it here</a></p>
</div>

Resulting code after cookie is accepted

<div class="embed-container" id="m_QZyYmcnN7uYgx6uGyL"  itemscope itemtype="http://schema.org/ImageObject">
	<iframe src="https://giphy.com/embed/QZyYmcnN7uYgx6uGyL" frameBorder="0" allowFullScreen></iframe>
</div>

To embed a video from Giphy use

<txp::media from="gp" media="YOMRpF8MSxjMqlPO6h" title="Tear Gas" url="v" />

Resulting code before cookie is accepted

<div class="gdpr">
	<p>Tear Gas</p>
	<p>Hosted by Giphy on <a rel="external noopener" href="https://giphy.com/videos/YOMRpF8MSxjMqlPO6h">giphy.com/videos/YOMRpF8MSxjMqlPO6h</a>.</p>
	<p><a rel="external noopener" href="https://support.giphy.com/hc/en-us/articles/360032872931-GIPHY-Privacy-Policy">Giphy&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_giphy_cookie=yes#m_YOMRpF8MSxjMqlPO6h">View to it here</a></p>
</div>

Resulting code after cookie is accepted

<div class="embed-container" id="YOMRpF8MSxjMqlPO6h"  itemscope itemtype="http://schema.org/VideoObject">
	<iframe src="https://giphy.com/embed/YOMRpF8MSxjMqlPO6h" frameBorder="0" allowFullScreen></iframe>
</div>

5. Embed a local video

The html5 video tag, allows for the embedding of multiple formats to enhance compatibility with the various browsers and computer setups. To embed your videos residing in your installation's files directory, first upload the video files using the same name followed by the extension. In your articles call the file name and state the extensions you have encoded those files to. (Currently the tag supports mp4, ogg, mpeg-4, flac, webm). You may want to check the status of video format support in each web browser.

<txp::media from="local" url="v" media="my_title" mp4 webm />

The resulting code will be

<span itemscope itemtype="http://schema.org/VideoObject">
	<video width="100%" height="100%" controls>
		<source src="http(s)://site.tld/files/my_video.mp4" type="video/mp4">
		<source src="http(s)://site.tld/files/my_video.webm" type="video/webm">
		<p>Your browser does not support the video element.</p>
	</video>
</span>

If you wish to include a poster-frame for the video use

<txp::media from="local" url="v" media="my_title" mp4 webm img="32" />

Where the 32 is the id number of your selected image from the database.

The resulting code will be

<span itemscope itemtype="http://schema.org/VideoObject">
	<video width="100%" height="100%" controls poster="http(s)://site.tld/images/32.jpg">
		<source src="http(s)://site.tld/files/my_video.mp4" type="video/mp4">
		<source src="http(s)://site.tld/files/my_video.webm" type="video/webm">
		<p>Your browser does not support the video element.</p>
	</video>
</span>

HTML5 allows the addition of subitiles in the videos and suport for one srt subtitle track is provided. The track should have the same name as the video file with the addition of _language, so for an english subtitled track the name of the file could be my_video_en.srt. The language string should use the ISO 639-1 standard.

So for:

<txp::media from="local" url="v" media="my_title" mp4 webm img="32" title="en" />

The resulting code will be

<span itemscope itemtype="http://schema.org/VideoObject">
	<video width="100%" height="100%" controls poster="http(s)://site.tld/images/32.jpg">
		<source src="http(s)://site.tld/files/my_video.mp4" type="video/mp4">
		<source src="http(s)://site.tld/files/my_video.webm" type="video/webm">
		<track enabled="true" kind="subtitles" label="en" srclang="en" type="text/x-srt" src="http(s)://site.tld/files/my_video_en.srt" /></track>
		<p>Your browser does not support the video element.</p>
	</video>
</span>

6. Embed from YouTube

YouTube's url structures allow for the presentation of the video thumbnail before their cookies are served. As such the code below also embeds the thumbnail before the cookie is accepted.

The shorcode allows for embeding individual videos, YouTube playlists, or a feed from a YouTube user.

Embed an individual video

<txp::media from="yt" media="zlZTghhCuxg" title="Delivery for Mr. Assange" />

Resulting code before cookie is accepted

<div class="gdpr">
	<img src="https://i3.ytimg.com/vi/zlZTghhCuxg/hqdefault.jpg" srcset="https://i3.ytimg.com/vi/zlZTghhCuxg/hqdefault.jpg 480w, https://i3.ytimg.com/vi/zlZTghhCuxg/maxresdefault.jpg 1280w" alt="Delivery for Mr. Assange" itemscope itemtype="http://schema.org/ImageObject" /><picture>
	<p>Delivery for Mr. Assange</p>
	<p>Hosted by YouTube on <a rel="external noopener" href=https://youtu.be/zlZTghhCuxg">youtu.be/zlZTghhCuxg</a>.</p>
	<p><a rel="external noopener" href="https://youtube.com/privacy">YouTube&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_youtube_cookie=yes#m_zlZTghhCuxg">View it here</a></p>
</div>

Resulting code after cookie is accepted

<div class="embed-container" id="m_zlZTghhCuxg"  itemscope itemtype="http://schema.org/VideoObject">
	<iframe src="https://www.youtube.com/embed/zlZTghhCuxg?rel=0" frameborder="0" allowfullscreen></iframe>
</div>

The default, pre cookie acceptance behaviour, calls the images from YouTube and some may find this unacceptable so I provided an option to include an image from the database. For that you can use:

<txp::media from="yt" media="zlZTghhCuxg" title="Delivery for Mr. Assange" img="34" />

Resulting code before cookie is accepted

<div class="gdpr">
	<img src="http(s)://site.tld/images/34.jpg" alt="Delivery for Mr. Assange" width="720" height="576" /> 
	<p>Delivery for Mr. Assange</p>
	<p>Hosted by YouTube on <a rel="external noopener" href=https://youtu.be/zlZTghhCuxg">youtu.be/zlZTghhCuxg</a>.</p>
	<p><a rel="external noopener" href="https://youtube.com/privacy">YouTube&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_youtube_cookie=yes#m_zlZTghhCuxg">View it here</a></p>
</div>

If an image is not desired before the cookie acceptance use

<txp::media from="yt" media="zlZTghhCuxg" title="Delivery for Mr. Assange" 0 />

Resulting code before cookie is accepted

<div class="gdpr">
	<p>Delivery for Mr. Assange</p>
	<p>Hosted by YouTube on <a rel="external noopener" href=https://youtu.be/zlZTghhCuxg">youtu.be/zlZTghhCuxg</a>.</p>
	<p><a rel="external noopener" href="https://youtube.com/privacy">YouTube&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_youtube_cookie=yes#m_zlZTghhCuxg">View it here</a></p>
</div>

To embed a YouTube user's feed use the media attribute for the user handle and the url attribute to prompt the shortcode that it will will be embedding the feed.

<txp::media from="yt" url="user" media="thejuicemedia" title="The Juice Media" />

Resulting code after cookie is accepted

<div class="embed-container">
	<iframe src="https://www.youtube.com/embed?listType=user_uploads&amp;list=thejuicemedia" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>

To embed a playlist from YouTube use the url attribute to prompt the shortcode that it will be loading a playlist and the media attribute for the playlist ID. Note that YouTube playlist IDs always start with PL.

<txp::media from="yt" url="pl" media="PLAC463A2B6B2CEC7F" title="TED talks" />

Resulting code after cookie is accepted

<div class="embed-container">
	<iframe src="https://www.youtube.com/embed/videoseries?list=PLAC463A2B6B2CEC7F" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div>

7. Embed from the Internet archive

The Internet archive allows the embedding of both video and audio files.

To embed a video from the the Archive simply, use

<txp::media from="ia" url="v" media="PiesAndaluzyjski" title="Luis Bunuel: Un Chien Andalou, 1929" />

The resultig code before cookie is accepted

<div class="gdpr">
	<p>Luis Bunuel: Un Chien Andalou, 1929</p>
	<p>Hosted by Vimeo on <a rel="external noopener" href="https://archive.org/details/PiesAndaluzyjski">archive.org/details/PiesAndaluzyjski</a>.</p>
	<p><a rel="external noopener" href="https://archive.org/about/terms.php">Internet Archive&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow noindex" href="?My_Site_iarchive_cookie=yes#m_PiesAndaluzyjski">View it here</a></p>
</div>

Resulting code after cookie is accepted

<div class="embed-container" id="m_PiesAndaluzyjski">
	<iframe src="https://archive.org/embed/PiesAndaluzyjski" frameborder="0" webkitallowfullscreen="true" mozallowfullscreen="true" allowfullscreen></iframe>
</div>

You may have noticed that the parsed code of the embed-container, after the cookie is accepted, does not include ARIA. This is because the Object types (video or audio) need to be specified. You can do that by typing: url="v" or url="a", where v is for video and a is for audio.

8. Embed from Bandcamp

Bandcamp offers subdomains for their artists and normalised urls do not appear to be supported. The id of the tracks can be found in their embed code but found no way to link to their pages by using those ids. Having this in mind, to embed from Bandcamp use

<txp::media from="bac" media="600847421" title="Icarus" url="jabbacartel" />

Resulting code after cookie is accepted:

<div class="embed-container" id="m_<txp:yield name="media" />" itemscope itemtype="http://schema.org/AudioObject">
	<iframe style="border: 0; width: 100%; height: 274px;" src="https://bandcamp.com/EmbeddedPlayer/album=600847421/size=large/bgcol=ffffff/linkcol=0687f5/artwork=small/transparent=true/" seamless></iframe>
</div>

Resultig code before cookie is accepted

<div class="gdpr">
	<p>Icarus</p>
	<p>Hosted by BandCamp on <a rel="external noopener" href="https://jabbacartel.bandcamp.com/album/icarus">jabbacartel.bandcamp.com/album/icarus</a>.</p>
	<p><a rel="external noopener" href="https://bandcamp.com/privacy">BandCamp&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_bandcamp_cookie=yes#m_600847421">Listen to it here</a></p>
</div>

If the url attribute is not used, a warning, only visible to logged in users will be provided

<div class="gdpr">
	<p>Icarus</p>
	<p>Hosted by <a rel="external noopener" href="https://bandcamp.com">BandCamp</a>.</p>
	<p><a rel="external noopener" href="https://bandcamp.com/privacy">BandCamp&#8217;s private policy</a>.</p>
	<p class="error">Warning: <b>url</b> is a recommended attribute. Use url="artistname" and replace <i>artistname</i> with the name appearing in the subdomain.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_bandcamp_cookie=yes#m_600847421">Listen to it here</a></p>
</div>

9. Embed from Mixcloud

Mixcloud offers subdirectories for their artists and normalised urls do not appear to be supported. The id of the tracks can be found in their embed code but found no way to link to their pages by using those ids. Also the artist's name is a required field and should be used under the url attribute. Having this in mind, to embed from Mixcloud use

<txp::media from="mix" media="midnight-silhouettes-7-5-20" title="Midnight silhouettes" url="eyeam4real" />

Resulting code after cookie is accepted:

<div class="embed-container" id="m_<txp:yield name="media" />" itemscope itemtype="http://schema.org/AudioObject">
	<iframe width="100%" height="120" src="https://www.mixcloud.com/widget/iframe/?hide_cover=1&light=1&feed=%2Feyeam4real%2Fmidnight-silhouettes-7-5-20%2F" frameborder="0" ></iframe>
</div>

Resultig code before cookie is accepted

<div class="gdpr">
	<p>Midnight silhouettes</p>
	<p>Hosted by Mixcloud on <a rel="external noopener" href="https://www.mixcloud.com/eyeam4real/midnight-silhouettes-7-5-20/">mixcloud.com/eyeam4real/midnight-silhouettes-7-5-20/</a>.</p>
	<p><a rel="external noopener" href="https://mixcloud.com/privacy">Mixcloud&#8217;s private policy</a>.</p>
	<p class="accept"><a rel="nofollow" href="?My_Site_mixcloud_cookie=yes#m_idnight-silhouettes-7-5-20">Listen to it here</a></p>
</div>

If the required url attribute is not used, an error will be presented

Resultig code before cookie is accepted

<div class="gdpr">
	<p>Midnight silhouettes</p>
	<p class="error">Error: <b>url</b> is a required attribute.</p> <!-- only visible to logged-in users -->
</div>

Resultig code after cookie is accepted

<div class="embed_container"> <!-- only visible to logged-in users -->
	<p class="error">Error: <b>url</b> is a required attribute.</p>
</div>

Licence

This shortcode is released as free and unencumbered software. Read about it on https://github.com/colak/txp-media-shortcode/blob/master/LICENCE.md.

Support

Please post any questions requests, or bugs on https://forum.textpattern.com/viewtopic.php?id=50879

Not what you are looking for?

If you are not using textpattern or if you are looking for a general php which can embed from anywhere, you may want to have a look at Oscar Otero's Embed.

Notes

1 I have detected that embedded videos from youtube-nocookies do serve 3 cookies, 2 of which are from youtube. I have nevertheless included it in the list as, unlike Youtube, the embedded videos do not show related content when a video is paused or finished.

2 Created in and shared from the My Maps API.

About

A shortcode for Textpattern CMS which allows the easy embedding of local or external media in articles.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published