sgalinski/sg-vimeo

一个将Vimeo视频、播放列表或频道轻松嵌入TYPO3页面的解决方案。

安装: 69

依赖者: 0

建议者: 0

安全: 0

类型:typo3-cms-extension

4.2.1 2024-08-02 13:07 UTC

README

许可证: GNU GPL, Version 2

仓库: https://gitlab.sgalinski.de/typo3/sg_vimeo

请在此处报告错误: https://gitlab.sgalinski.de/typo3/sg_vimeo

安装/集成

首先安装扩展,并在扩展管理器中激活。

Vimeo应用

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视频渲染过程中被触发

  1. BeforeVimeoCallEvent
  2. AfterVimeoCallEvent
  3. AfterFilterVideosEvent
  4. 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!";

一旦运行,它将创建文件,然后我们可以提交新版本并使用它。