sgalinski / sg-vimeo
一个将Vimeo视频、播放列表或频道轻松嵌入TYPO3页面的解决方案。
Requires
- typo3/cms-core: ^12.4.0
- vimeo/vimeo-api: ^3.0
Replaces
- sgalinski/sg_vimeo: 4.2.1
This package is not auto-updated.
Last update: 2024-09-16 18:55:29 UTC
README
许可证: GNU GPL, Version 2
仓库: https://gitlab.sgalinski.de/typo3/sg_vimeo
请在此处报告错误: https://gitlab.sgalinski.de/typo3/sg_vimeo
安装/集成
首先安装扩展,并在扩展管理器中激活。
Vimeo应用
- 创建一个新的vimeo应用:https://developer.vimeo.com/apps/new
- 回答问题“除了你之外,其他人能否访问你的应用?”回答:不。将能够访问该应用的只有我的Vimeo账号。
- 转到你的vimeo应用页面https://developer.vimeo.com/apps,并复制客户端标识符和客户端密钥。
TypoScript集成
- 将TypoScript包含在主题中的Configuration/TypoScript/setup.typoscript和constants.typoscript。
- 添加你的Vimeo客户端标识符和客户端密钥(可选:个人访问令牌)
plugin.tx_sgvimeo {
settings {
# cat=plugin.tx_sgvimeo/file; type=string; label=Vimeo client identifier
clientId = <your-client-id>
# cat=plugin.tx_sgvimeo/file; type=string; label=Vimeo client secret
clientSecret = <your-client-secret>
# cat=plugin.tx_sgvimeo/file; type=string; label=Vimeo Personal access token
personalAccessToken =
}
}
私有视频
如果你有一个不公开的视频,但想在网站上展示,你需要一个认证的个人访问令牌。你可以在这里找到生成此类令牌的指南: https://vimeo.zendesk.com/hc/en-us/articles/360042445032-How-do-I-generate-a-personal-access-token-
为了使私有视频显示,必须满足以下要求
- 视频必须在配置客户端Secret & ClientId(vimeo应用)时使用的同一vimeo账号上托管
- 必须在typoscript设置中配置具有访问范围"private"的个人访问令牌(personalAccessToken)
处理速率限制
与几乎每个API一样,都有一个使用限制,这取决于发起API请求的用户(Vimeo应用的拥有者)的Vimeo用户会员资格。
sg_vimeo使用以下端点
- 视频 - api.vimeo.com/videos/{video_id}
- 频道视频 - api.vimeo.com/channels/{channel_id}/videos
sg_vimeo使用字段筛选来请求所需的字段。
缓存行为
由于配额成本,我们实现了每天调用缓存。API的响应将被保存并使用24小时。通常,网站缓存会这样做,但可能连续多次清除缓存,或者插件位于未缓存的页面上。我们使用TYPO3注册表作为缓存。清理是即时处理的。
如果URL中添加了?disableVimeoCache=1
参数,则此缓存也将被忽略。
.htaccess - 内容安全策略
需要img-src https://i.vimeocdn.com;
、script-src https://player.vimeo.com;
。
修改JavaScript/CSS
我们随扩展提供源文件和已最小化的资产。默认情况下,我们将在布局中加载最小化资产,以便扩展可以即插即用。如果您想更改此行为,可以执行以下操作
- 覆盖TypoScript中的布局路径local/project_theme/Configuration/TypoScript/Extensions/SgVimeo/Constants.typoscript
plugin.tx_sgvimeo {
settings {
clientId = MY_CLIENT_ID
clientSecret = MY_CLIENT_SECRET
}
view {
layoutRootPath = EXT:project_theme/Resources/Private/Layouts/SgVimeo/
}
}
- 创建一个新的布局文件,省略您想要更改的资产(例如,不加载CSS)
<div class="tx-sg-vimeo">
<f:asset.script identifier="sgVideoJs" src="EXT:sg_vimeo/Resources/Public/JavaScript/Dist/main.bundled.min.js" />
<f:render section="main"/>
</div>
- 将CSS或JavaScript源文件导入您的相应资产管道,并外部添加。
使用SGC编译CSS/JS资产
- 通过composer安装sgalinski/sgc-core库
- 在.sgc-config.json中添加sg-vimeo扩展路径
- 从Resources/Private/Templates/Vimeo/Index.html中删除编译后的CSS/JS资产的加载
- 在相应的主.scss和main.js中添加导入scss和js模块文件
- 在main.js中初始化javascript模块:
new SgVideoLightbox(); SgVideo.initDefault();
仅使用SGC编译SASS
示例
npm install -g sass
npx sass ./Resources/Public/Sass/Bootstrap5/main.scss ./Resources/Public/StyleSheets/Bootstrap5/main.min.css --style compressed --no-source-map
使用Bootstrap 5模板
如果您想使用Bootstrap 5模板,您必须首先在主题中安装Bootstrap 5以使用其样式和JavaScript。之后,只需将plugin.tx_project_theme.config.bootstrapVersion
TypoScript设置变量设置为5。
在TYPO3中使用事件自定义Vimeo API结果
本文档解释了如何利用TYPO3扩展中的自定义事件来操作Vimeo API调用的结果。通过使用这些事件,您可以修改API参数、过滤结果,并进一步自定义从Vimeo返回的JSON数据。
可用事件
以下事件在Vimeo视频渲染过程中被触发
BeforeVimeoCallEvent
AfterVimeoCallEvent
AfterFilterVideosEvent
AfterMapCustomThumbnailsEvent
事件监听器
1. BeforeVimeoCallEvent
描述:此事件在执行Vimeo API调用之前触发,允许您修改API参数。
示例用法:更改API密钥或操作其他参数
<?php
namespace Vendor\Extension\EventListener;
use SGalinski\SgVimeo\Event\BeforeVimeoCallEvent;
class BeforeVimeoCallEventListener
{
public function __invoke(BeforeVimeoCallEvent $event): void
{
// Change the API key
$event->setApiKey('your-new-api-key');
// Extend the max results limit by 10 videos
$event->setMaxResultsWithFilters($event->getMaxResultsWithFilters() + 10);
}
}
2. AfterVimeoCallEvent
描述:向JSON数组添加自定义数据
示例用法:更改API密钥或操作其他参数
<?php
namespace SGalinski\SgVimeo\EventListeners;
use SGalinski\SgVimeo\Event\AfterVimeoCallEvent;
class AfterVimeoCallEventListener
{
public function __invoke(AfterVimeoCallEvent $event): void
{
$response = $event->getResponse();
// Add custom data
$response['customData'] = 'This is some custom data';
$event->setResponse($response);
}
}
3. AfterFilterVideosEvent
描述:此事件在视频过滤后触发,允许您进一步操作过滤后的结果。
示例用法:删除我们在第一个事件中添加的10个视频
<?php
namespace SGalinski\SgVimeo\EventListeners;
use SGalinski\SgVimeo\Event\AfterFilterVideosEvent;
class AfterFilterVideosEventListener
{
public function __invoke(AfterFilterVideosEvent $event): void
{
// Modify the response if needed
$response = $event->getResponse();
// Add some custom processing here
// For example let's remove the extra 10 videos that we added in the other event
if (count($response['items']) > 10) {
array_splice($response['items'], 0, 10);
}
$event->setResponse($response);
}
}
4. AfterMapCustomThumbnailsEvent
描述:此事件在自定义缩略图映射后触发,允许您在渲染前最后一次修改JSON数组。
示例用法:为列表中的所有视频使用自定义缩略图
<?php
namespace SGalinski\SgVimeo\EventListeners;
use SGalinski\SgVimeo\Event\AfterMapCustomThumbnailsEvent;
class AfterMapCustomThumbnailsEventListener
{
public function __invoke(AfterMapCustomThumbnailsEvent $event): void
{
$response = $event->geRresponse();
// Add a custom thumbnail URL
foreach ($response['items'] as &$item) {
$item['customThumbnail'] = 'https://example.com/custom-thumbnail.jpg';
}
$event->setResponse($response);
}
}
要启用事件,只需在Services.php中注册它们,如下所示(如果您愿意,可以使用yaml)
$services->set(BeforeVimeoCallEventListener::class)
->tag('event.listener', ['event' => BeforeVimeoCallEvent::class]);
$services->set(AfterVimeoCallEventListener::class)
->tag('event.listener', ['event' => AfterVimeoCallEvent::class]);
$services->set(AfterFilterVideosEventListener::class)
->tag('event.listener', ['event' => AfterFilterVideosEvent::class]);
$services->set(AfterMapCustomThumbnailsEventListener::class)
->tag('event.listener', ['event' => AfterMapCustomThumbnailsEvent::class]);
非composer模式(经典、旧版)的使用
此扩展依赖于第三方来源,我们通过composer导入。如果您在旧版模式(非composer)中进行安装,我们需要导入这些库。为此,我们有一个Libraries/目录,我们将依赖项作为PHAR文件放置在这里。您可以在Services/VimeoService.php中查看它们是如何使用的。
但是,如果依赖项通过composer更新,我们需要重新生成PHAR文件并再次提交。为此,我们首先使用composer获取新版本,然后我们需要使用以下PHP代码创建PHAR存档
<?php
$pharFile = __DIR__ . '/../sg_vimeo.phar';
// Remove previous PHAR file if it exists
if (file_exists($pharFile)) {
unlink($pharFile);
}
$phar = new Phar($pharFile);
$phar->startBuffering();
// Add your extension's files
$phar->buildFromDirectory(__DIR__ . '/../sg_vimeo');
// Optionally, add files from the vendor directory
$phar->buildFromDirectory(__DIR__ . '/../sg_vimeo');
// Optionally, set the default stub to load an entry script
$stub = <<<EOD
<?php
Phar::mapPhar();
require 'phar://' . __FILE__ . '/Classes/Main.php';
__HALT_COMPILER();
EOD;
$phar->setStub($stub);
// Stop buffering and save the PHAR file
$phar->stopBuffering();
echo "PHAR file created successfully!";
一旦运行,它将创建文件,然后我们可以提交新版本并使用它。