4 <meta http-equiv=
"X-UA-Compatible" content=
"IE=edge">
5 <meta name=
"viewport" content=
"width=device-width, initial-scale=1">
6 <meta name=
"description" content=
"">
7 <meta name=
"keywords" content=
" ">
8 <title>Media Provider Package Installation Plugin | WoltLab Suite
5.3 Documentation
</title>
10 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/syntax.css">
11 <link rel=
"stylesheet" href=
"https://fonts.googleapis.com/css?family=Open+Sans:400,300,600">
12 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/font-awesome.min.css">
13 <!--<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">-->
14 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/modern-business.css">
15 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/lavish-bootstrap.css">
16 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/customstyles.css">
17 <link rel=
"stylesheet" href=
"https://docs.woltlab.com/5.3/css/theme-blue.css?v=3">
19 <script src=
"https://docs.woltlab.com/5.3/js/jquery.min.js"></script>
20 <script src=
"https://docs.woltlab.com/5.3/js/jquery.cookie.min.js"></script>
21 <script src=
"https://docs.woltlab.com/5.3/js/jquery.navgoco.min.js"></script>
22 <script src=
"https://docs.woltlab.com/5.3/js/bootstrap.min.js"></script>
23 <script src=
"https://docs.woltlab.com/5.3/js/anchor.min.js"></script>
24 <script src=
"https://docs.woltlab.com/5.3/js/toc.js"></script>
25 <script src=
"https://docs.woltlab.com/5.3/js/customscripts.js"></script>
27 <link rel=
"shortcut icon" href=
"https://docs.woltlab.com/5.3/images/favicon.ico">
29 <link rel=
"alternate" type=
"application/rss+xml" title=
"woltlab.github.io" href=
"https://docs.woltlab.com/5.3feed.xml">
32 $(document).ready(function() {
33 // Initialize navgoco with default options
34 $(
"#mysidebar").navgoco({
37 openClass: 'active', // open
38 save: false, // leave false or nav highlighting doesn't work right
50 $(
"#collapseAll").click(function(e) {
52 $(
"#mysidebar").navgoco('toggle', false);
55 $(
"#expandAll").click(function(e) {
57 $(
"#mysidebar").navgoco('toggle', true);
65 $('[
data-toggle=
"tooltip"]').tooltip()
73 <nav class=
"navbar navbar-inverse navbar-fixed-top">
74 <div class=
"container topnavlinks">
75 <div class=
"navbar-header">
76 <button type=
"button" class=
"navbar-toggle" data-toggle=
"collapse" data-target=
"#bs-example-navbar-collapse-1">
77 <span class=
"sr-only">Toggle navigation
</span>
78 <span class=
"icon-bar"></span>
79 <span class=
"icon-bar"></span>
80 <span class=
"icon-bar"></span>
82 <a class=
"fa fa-home fa-lg navbar-brand" href=
"index.html"> <span class=
"projectTitle"> WoltLab Suite
5.3 Documentation
</span></a>
84 <div class=
"collapse navbar-collapse" id=
"bs-example-navbar-collapse-1">
85 <ul class=
"nav navbar-nav navbar-right">
86 <!-- entries without drop-downs appear here -->
90 <li><a href=
"https://www.woltlab.com" target=
"_blank">woltlab.com
</a></li>
96 <li><a href=
"https://github.com/WoltLab/WCF/" target=
"_blank">Code on github.com
</a></li>
100 <!-- entries with drop-downs appear here -->
101 <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->
104 <!--comment out this block if you want to hide search-->
107 <div id=
"search-demo-container">
108 <input type=
"text" id=
"search-input" placeholder=
"search...">
109 <ul id=
"results-container"></ul>
111 <script src=
"https://docs.woltlab.com/5.3/js/jekyll-search.js" type=
"text/javascript"></script>
112 <script type=
"text/javascript">
113 SimpleJekyllSearch.init({
114 searchInput: document.getElementById('search-input'),
115 resultsContainer: document.getElementById('results-container'),
116 dataSource: 'https://docs.woltlab.com/
5.3/search.json',
117 searchResultTemplate: '
<li><a href=
"{url}" title=
"Media Provider Package Installation Plugin">{title}
</a></li>',
118 noResultsText: 'No results found.',
132 <div class=
"container">
133 <div class=
"col-lg-12"> </div>
136 <div class=
"col-md-3">
140 <ul id=
"mysidebar" class=
"nav">
141 <li class=
"sidebarTitle">WoltLab Suite
5.3</li>
146 <a href=
"#">Getting Started
</a>
152 <li data-identifier=
"index"><a href=
"index.html">Introduction
</a></li>
161 <li data-identifier=
"getting-started_quick-start"><a href=
"getting-started_quick-start.html">Quick Start
</a></li>
171 <a href=
"#">PHP API
</a>
177 <li data-identifier=
"php_pages"><a href=
"php_pages.html">Pages
</a></li>
186 <li data-identifier=
"php_database-objects"><a href=
"php_database-objects.html">Database Objects
</a></li>
195 <li data-identifier=
"php_database-access"><a href=
"php_database-access.html">Database Access
</a></li>
204 <li data-identifier=
"php_exceptions"><a href=
"php_exceptions.html">Exceptions
</a></li>
213 <li class=
"subfolders">
219 <li data-identifier=
"php_api_caches"><a href=
"php_api_caches.html">Caches
</a></li>
224 <li data-identifier=
"php_api_comments"><a href=
"php_api_comments.html">Comments
</a></li>
229 <li data-identifier=
"php_api_cronjobs"><a href=
"php_api_cronjobs.html">Cronjobs
</a></li>
234 <li data-identifier=
"php_api_events"><a href=
"php_api_events.html">Events
</a></li>
239 <li data-identifier=
"php_api_form_builder"><a href=
"php_api_form_builder.html">Form Builder
</a></li>
244 <li data-identifier=
"php_api_package_installation_plugins"><a href=
"php_api_package_installation_plugins.html">Package Installation Plugins
</a></li>
249 <li data-identifier=
"php_api_user_activity_points"><a href=
"php_api_user_activity_points.html">User Activity Points
</a></li>
254 <li data-identifier=
"php_api_user_notifications"><a href=
"php_api_user_notifications.html">User Notifications
</a></li>
259 <li data-identifier=
"php_api_sitemaps"><a href=
"php_api_sitemaps.html">Sitemaps
</a></li>
269 <li data-identifier=
"php_code-style"><a href=
"php_code-style.html">Code Style
</a></li>
278 <li data-identifier=
"php_apps"><a href=
"php_apps.html">Apps
</a></li>
287 <li data-identifier=
"php_gdpr"><a href=
"php_gdpr.html">GDPR
</a></li>
297 <a href=
"#">Languages, Templates & CSS
</a>
303 <li data-identifier=
"view_languages"><a href=
"view_languages.html">Languages
</a></li>
312 <li data-identifier=
"view_templates"><a href=
"view_templates.html">Templates
</a></li>
321 <li data-identifier=
"view_css"><a href=
"view_css.html">CSS
</a></li>
331 <a href=
"#">JavaScript API
</a>
337 <li data-identifier=
"javascript_general-usage"><a href=
"javascript_general-usage.html">General Usage
</a></li>
346 <li class=
"subfolders">
347 <a href=
"#">New API
</a>
352 <li data-identifier=
"javascript_new-api_writing-a-module"><a href=
"javascript_new-api_writing-a-module.html">Writing a module
</a></li>
357 <li data-identifier=
"javascript_new-api_data-structures"><a href=
"javascript_new-api_data-structures.html">Data Structures
</a></li>
362 <li data-identifier=
"javascript_new-api_core"><a href=
"javascript_new-api_core.html">Core Functions
</a></li>
367 <li data-identifier=
"javascript_new-api_dom"><a href=
"javascript_new-api_dom.html">DOM
</a></li>
372 <li data-identifier=
"javascript_new-api_events"><a href=
"javascript_new-api_events.html">Event Handling
</a></li>
377 <li data-identifier=
"javascript_new-api_ajax"><a href=
"javascript_new-api_ajax.html">Ajax
</a></li>
382 <li data-identifier=
"javascript_new-api_dialogs"><a href=
"javascript_new-api_dialogs.html">Dialogs
</a></li>
387 <li data-identifier=
"javascript_new-api_browser"><a href=
"javascript_new-api_browser.html">Browser and Screen Sizes
</a></li>
392 <li data-identifier=
"javascript_new-api_ui"><a href=
"javascript_new-api_ui.html">User Interface
</a></li>
402 <li data-identifier=
"javascript_legacy-api"><a href=
"javascript_legacy-api.html">Legacy API
</a></li>
411 <li data-identifier=
"javascript_helper-functions"><a href=
"javascript_helper-functions.html">Helper Functions
</a></li>
420 <li data-identifier=
"javascript_code-snippets"><a href=
"javascript_code-snippets.html">Code Snippets
</a></li>
430 <a href=
"#">Package Components
</a>
436 <li data-identifier=
"package_package-xml"><a href=
"package_package-xml.html">package.xml
</a></li>
445 <li data-identifier=
"package_pip"><a href=
"package_pip.html">PIPs
</a></li>
455 <a href=
"#">Migration
</a>
461 <li class=
"subfolders">
462 <a href=
"#">Migrating from WSC
5.2</a>
467 <li data-identifier=
"migration_wsc-52_php"><a href=
"migration_wsc-52_php.html">PHP API
</a></li>
472 <li data-identifier=
"migration_wsc-52_templates"><a href=
"migration_wsc-52_templates.html">Templates and Languages
</a></li>
477 <li data-identifier=
"migration_wsc-52_libraries"><a href=
"migration_wsc-52_libraries.html">Third Party Libraries
</a></li>
483 <li class=
"subfolders">
484 <a href=
"#">Migrating from WSC
3.1</a>
489 <li data-identifier=
"migration_wsc-31_php"><a href=
"migration_wsc-31_php.html">PHP API
</a></li>
495 <li class=
"subfolders">
496 <a href=
"#">Migrating from WSC
3.0</a>
501 <li data-identifier=
"migration_wsc-30_php"><a href=
"migration_wsc-30_php.html">PHP API
</a></li>
506 <li data-identifier=
"migration_wsc-30_javascript"><a href=
"migration_wsc-30_javascript.html">JavaScript API
</a></li>
511 <li data-identifier=
"migration_wsc-30_templates"><a href=
"migration_wsc-30_templates.html">Templates
</a></li>
516 <li data-identifier=
"migration_wsc-30_css"><a href=
"migration_wsc-30_css.html">CSS
</a></li>
521 <li data-identifier=
"migration_wsc-30_package"><a href=
"migration_wsc-30_package.html">Package Components
</a></li>
527 <li class=
"subfolders">
528 <a href=
"#">Migrating from WCF
2.1</a>
533 <li data-identifier=
"migration_wcf-21_php"><a href=
"migration_wcf-21_php.html">PHP API
</a></li>
538 <li data-identifier=
"migration_wcf-21_templates"><a href=
"migration_wcf-21_templates.html">Templates
</a></li>
543 <li data-identifier=
"migration_wcf-21_css"><a href=
"migration_wcf-21_css.html">CSS
</a></li>
548 <li data-identifier=
"migration_wcf-21_package"><a href=
"migration_wcf-21_package.html">Package Components
</a></li>
559 <a href=
"#">Tutorials
</a>
565 <li data-identifier=
"tutorial_tutorial-series"><a href=
"tutorial_tutorial-series.html">Tutorial Series
</a></li>
579 var sidebar = $('#mysidebar');
580 var item = sidebar.find('.active');
581 if (item.length ===
0) {
582 var parent = 'package_pip';
584 sidebar.find('li[
data-identifier=
"' + parent + '"]').addClass('active');
588 sidebar.find(
".active").parents('li').toggleClass(
"active");
594 <div class=
"col-md-9">
595 <div class=
"post-header">
596 <h1 class=
"post-title-main">Media Provider Package Installation Plugin
</h1>
601 <div class=
"post-content">
607 <!-- this handles the automatic toc. use ## for subheads to auto-generate the on-page minitoc. if you use html tags, you must supply an ID for the heading element in order for it to appear in the minitoc. -->
609 $( document ).ready(function() {
610 // Handler for .ready() called.
612 $('#toc').toc({ minimumHeaders:
0, listType: 'ul', showSpeed:
0, headers: 'h2,h3,h4' });
614 /* this offset helps account for the space taken up by the floating toolbar. */
615 $('#toc').on('click', 'a', function() {
616 var target = $(this.getAttribute('href'))
617 , scroll_target = target.offset().top
619 $(window).scrollTop(scroll_target -
10);
630 <div class=
"bs-callout bs-callout-info">Available since WoltLab Suite
3.1</div>
632 <p>Media providers are responsible to detect and convert links to a
3rd party service inside messages.
</p>
634 <h2 id=
"components">Components
</h2>
636 <p>Each item is described as a
<code class=
"language-plaintext highlighter-rouge"><provider
></code> element with the mandatory attribute
<code class=
"language-plaintext highlighter-rouge">name
</code> that should equal the lower-cased provider name. If a provider provides multiple components that are (largely) unrelated to each other, it is recommended to use a dash to separate the name and the component, e. g.
<code class=
"language-plaintext highlighter-rouge">youtube-playlist
</code>.
</p>
638 <h3 id=
"title"><code class=
"language-plaintext highlighter-rouge"><title
></code></h3>
640 <p>The title is displayed in the administration control panel and is only used there, the value is neither localizable nor is it ever exposed to regular users.
</p>
642 <h3 id=
"regex"><code class=
"language-plaintext highlighter-rouge"><regex
></code></h3>
644 <p>The regular expression used to identify links to this provider, it must not contain anchors or delimiters. It is strongly recommended to capture the primary object id using the
<code class=
"language-plaintext highlighter-rouge">(?P
<ID
>...)
</code> group.
</p>
646 <h3 id=
"classname"><code class=
"language-plaintext highlighter-rouge"><className
></code></h3>
648 <div class=
"bs-callout bs-callout-warning"><code class=
"language-plaintext highlighter-rouge"><className
></code> and
<code class=
"language-plaintext highlighter-rouge"><html
></code> are mutually exclusive.
</div>
650 <p>PHP-Callback-Class that is invoked to process the matched link in case that additional logic must be applied that cannot be handled through a simple replacement as defined by the
<code class=
"language-plaintext highlighter-rouge"><html
></code> element.
</p>
652 <p>The callback-class must implement the interface
<code class=
"language-plaintext highlighter-rouge">\wcf\system\bbcode\media\provider\IBBCodeMediaProvider
</code>.
</p>
654 <h3 id=
"html"><code class=
"language-plaintext highlighter-rouge"><html
></code></h3>
656 <div class=
"bs-callout bs-callout-warning"><code class=
"language-plaintext highlighter-rouge"><className
></code> and
<code class=
"language-plaintext highlighter-rouge"><html
></code> are mutually exclusive.
</div>
658 <p>Replacement HTML that gets populated using the captured matches in
<code class=
"language-plaintext highlighter-rouge"><regex
></code>, variables are accessed as
<code class=
"language-plaintext highlighter-rouge">{$VariableName}
</code>. For example, the capture group
<code class=
"language-plaintext highlighter-rouge">(?P
<ID
>...)
</code> is accessed using
<code class=
"language-plaintext highlighter-rouge">{$ID}
</code>.
</p>
660 <h2 id=
"example">Example
</h2>
662 <div class=
"language-xml highlighter-rouge"><div class=
"highlight"><pre class=
"highlight"><code><span class=
"cp"><?xml
version=
"1.0" encoding=
"UTF-8"?
></span>
663 <span class=
"nt"><data
</span> <span class=
"na">xmlns=
</span><span class=
"s">"http://www.woltlab.com"</span> <span class=
"na">xmlns:xsi=
</span><span class=
"s">"http://www.w3.org/2001/XMLSchema-instance"</span> <span class=
"na">xsi:schemaLocation=
</span><span class=
"s">"http://www.woltlab.com http://www.woltlab.com/XSD/2019/mediaProvider.xsd"</span><span class=
"nt">></span>
664 <span class=
"nt"><import
></span>
665 <span class=
"nt"><provider
</span> <span class=
"na">name=
</span><span class=
"s">"youtube"</span><span class=
"nt">></span>
666 <span class=
"nt"><title
></span>YouTube
<span class=
"nt"></title
></span>
667 <span class=
"nt"><regex
></span><span class=
"cp"><![CDATA[https?://(?:.+?\.)?youtu(?:\.be/|be\.com/(?:#/)?watch\?(?:.*?
&)?v=)(?P
<ID
>[a-zA-Z0-
9_-]+)(?:(?:\?|
&)t=(?P
<start
>[
0-
9hms]+)$)?]]
></span><span class=
"nt"></regex
></span>
668 <span class=
"c"><!-- advanced PHP callback --
></span>
669 <span class=
"nt"><className
></span><span class=
"cp"><![CDATA[wcf\system\bbcode\media\provider\YouTubeBBCodeMediaProvider]]
></span><span class=
"nt"></className
></span>
670 <span class=
"nt"></provider
></span>
672 <span class=
"nt"><provider
</span> <span class=
"na">name=
</span><span class=
"s">"youtube-playlist"</span><span class=
"nt">></span>
673 <span class=
"nt"><title
></span>YouTube Playlist
<span class=
"nt"></title
></span>
674 <span class=
"nt"><regex
></span><span class=
"cp"><![CDATA[https?://(?:.+?\.)?youtu(?:\.be/|be\.com/)playlist\?(?:.*?
&)?list=(?P
<ID
>[a-zA-Z0-
9_-]+)]]
></span><span class=
"nt"></regex
></span>
675 <span class=
"c"><!-- uses a simple HTML replacement --
></span>
676 <span class=
"nt"><html
></span><span class=
"cp"><![CDATA[
<div
class=
"videoContainer"><iframe
src=
"https://www.youtube.com/embed/videoseries?list={$ID}" allowfullscreen
></iframe
></div
>]]
></span><span class=
"nt"></html
></span>
677 <span class=
"nt"></provider
></span>
678 <span class=
"nt"></import
></span>
680 <span class=
"nt"><delete
></span>
681 <span class=
"nt"><provider
</span> <span class=
"na">identifier=
</span><span class=
"s">"example"</span> <span class=
"nt">/
></span>
682 <span class=
"nt"></delete
></span>
683 <span class=
"nt"></data
></span>
684 </code></pre></div></div>
700 <div class=
"footerBox">
701 <div class=
"container">
702 <div class=
"footerBoxLeft">
704 <a target=
"_blank" href=
"https://github.com/woltlab/woltlab.github.io/blob/master/pages/package/pip/package_pip_media-provider.md" class=
"btn btn-default githubEditButton no_icon" role=
"button"><i class=
"fa fa-github fa-lg"></i> Edit on GitHub
</a>
705 <p>Site last generated: Mar
5,
2021</p>
707 <div class=
"footerBoxRight">
708 <a class=
"no_icon" href=
"https://www.woltlab.com"><img src=
"https://docs.woltlab.com/5.3/images/woltlab-black.png" srcset=
"https://docs.woltlab.com/5.3/images/woltlab-black@2x.png 2x" height=
"40" width=
"204" alt=
""></a>
713 <div class=
"pageFooter">
714 <div class=
"container">
715 © 2001 ‐
2021 <a class=
"no_icon" href=
"https://www.woltlab.com">WoltLab GmbH
</a>. All rights reserved. |
<a class=
"no_icon" href=
"https://www.woltlab.com/legal-notice/">Legal Notice
</a> |
<a class=
"no_icon" href=
"https://www.woltlab.com/privacy-policy/">Privacy Policy
</a>