This is an automated email from the ASF dual-hosted git repository.
jark pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fluss.git
The following commit(s) were added to refs/heads/main by this push:
new 0e8b5ea8 [webiste] Allow YouTube, Google Calendar and Algolia
Resources on Fluss Website (#1453)
0e8b5ea8 is described below
commit 0e8b5ea8ec92b7adbc9a52fcde5f435b266b9742
Author: Jark Wu <[email protected]>
AuthorDate: Sun Aug 3 20:33:30 2025 +0800
[webiste] Allow YouTube, Google Calendar and Algolia Resources on Fluss
Website (#1453)
The external resources are allowed by ASF privacy for Fluss website, but
they should only activate if the user actively wants to use them. We arrange
this by showing a placeholder image first and loading the map when the user
clicks on the image. Make it clear that users will load a YouTube video or
Google Calendar with their click.
---
website/.htaccess | 3 ++
website/community/{welcome.md => welcome.mdx} | 10 +++-
website/learn/{videos.md => videos.mdx} | 10 +++-
.../src/components/GoogleCalendarConsent/index.tsx | 55 +++++++++++++++++++
website/src/components/YouTubeConsent/index.tsx | 58 +++++++++++++++++++++
website/static/img/placeholder_calendar.png | Bin 0 -> 1120990 bytes
.../static/img/videos/placeholder_GKsE_EUR9yU.jpg | Bin 0 -> 111278 bytes
.../static/img/videos/placeholder__qSihYk-pOQ.jpg | Bin 0 -> 119615 bytes
8 files changed, 133 insertions(+), 3 deletions(-)
diff --git a/website/.htaccess b/website/.htaccess
index 23dc43d9..ec6ea7aa 100644
--- a/website/.htaccess
+++ b/website/.htaccess
@@ -1 +1,4 @@
# CSP permissions for fluss.apache.org - Additional allowances to be
coordinated with privacy team
+# See the CSP request mail for allowing Fluss project to use Algolia, YouTube
and Google Calendar:
+# https://lists.apache.org/thread/xt0ggzc7f4dj8g91b92w4tk5g8cdslwd
+SetEnv CSP_PROJECT_DOMAINS "https://www.youtube-nocookie.com
https://www.youtube.com https://*.algolia.net/ https://*.algolianet.com/
https://*.algolia.io/ https://calendar.google.com"
\ No newline at end of file
diff --git a/website/community/welcome.md b/website/community/welcome.mdx
similarity index 89%
rename from website/community/welcome.md
rename to website/community/welcome.mdx
index f0b28feb..5aa33bce 100644
--- a/website/community/welcome.md
+++ b/website/community/welcome.mdx
@@ -45,4 +45,12 @@ Access Resources: [Community Sync
Docs](https://docs.google.com/document/d/18b7G
Google Calendar invite: [Community
Events](https://calendar.google.com/calendar/u/0?cid=MjUzMjY2OTFkY2FmNmRiYjk5MzllZmUxNDliYjg1ZjI4ODhhNjU0YzY5Mzc2M2IyZDQ1NzIwNTAyZGU1MjZmOEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t)
-Community calls are a great opportunity to discuss the project roadmap,
implementation details, and connect with other contributors.
\ No newline at end of file
+Community calls are a great opportunity to discuss the project roadmap,
implementation details, and connect with other contributors.
+
+:::info
+The **Google Calendar** below uses **Greenwich Mean Time (GMT+0)**!
+:::
+
+import GoogleCalendarConsent from '@site/src/components/GoogleCalendarConsent';
+
+<GoogleCalendarConsent
calendarId="25326691dcaf6dbb9939efe149bb85f2888a654c693763b2d45720502de526f8" />
diff --git a/website/learn/videos.md b/website/learn/videos.mdx
similarity index 57%
rename from website/learn/videos.md
rename to website/learn/videos.mdx
index 5d81cd78..c2cc2e3e 100644
--- a/website/learn/videos.md
+++ b/website/learn/videos.mdx
@@ -1,24 +1,30 @@
---
title: Videos
+description: Video tutorials and demos about Apache Fluss streaming storage.
---
+import YouTubeConsent from '@site/src/components/YouTubeConsent';
+
# Videos
Video tutorials and demos about Apache Fluss streaming storage.
---
-### [Getting Started with Apache Flink and
Fluss](https://www.youtube.com/watch?v=_qSihYk-pOQ)
+### Getting Started with Apache Flink and Fluss
**Giannis Polyzos** • Apr 2025
Watch as he shares an example of building an end-to-end real-time application
using gameplay events, including generating game data and computing a live
top-3 leaderboard on a real-time dashboard using Fluss
+<YouTubeConsent videoId="_qSihYk-pOQ" title="Getting Started with Fluss and
Flink" />
+
---
-### [Optimizing Streaming Analytics with Apache Flink and
Fluss](https://www.youtube.com/watch?v=GKsE_EUR9yU)
+### Optimizing Streaming Analytics with Apache Flink and Fluss
**Giannis Polyzos** • Mar 2025
Discover how Apache Flink®, the industry-leading stream processing engine,
paired with Fluss, a high-performance transport and storage layer, creates a
powerful, cost-effective, and scalable solution for modern data streaming.
+<YouTubeConsent videoId="GKsE_EUR9yU" title="Optimizing Streaming Analytics
with Apache Flink and Fluss" />
diff --git a/website/src/components/GoogleCalendarConsent/index.tsx
b/website/src/components/GoogleCalendarConsent/index.tsx
new file mode 100644
index 00000000..ba01f3ca
--- /dev/null
+++ b/website/src/components/GoogleCalendarConsent/index.tsx
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, {useState} from 'react';
+
+export default function GoogleCalendarConsent({calendarId}) {
+ const [loaded, setLoaded] = useState(false);
+
+ const loadCalendar = () => {
+ setLoaded(true);
+ };
+
+ return (
+ <div className="calendar-consent-container">
+ {!loaded ? (
+ <div
+ onClick={loadCalendar}
+ style={{
+ textAlign: "center",
+ width: '800px',
+ height: '600px',
+ cursor: 'pointer',
+ backgroundImage:
`url("/img/placeholder_calendar.png")`,
+ backgroundSize: 'cover',
+ }}
+ >
+ </div>
+ ) : (
+ <div className="calendar-iframe-wrapper">
+ <iframe
+ width="800"
+ height="600"
+
src={`https://calendar.google.com/calendar/embed?src=${calendarId}%40group.calendar.google.com&ctz=Greenwich`}
+ frameBorder="0"
+ scrolling="no"
+ />
+ </div>
+ )}
+ </div>
+ );
+}
diff --git a/website/src/components/YouTubeConsent/index.tsx
b/website/src/components/YouTubeConsent/index.tsx
new file mode 100644
index 00000000..cd953ebe
--- /dev/null
+++ b/website/src/components/YouTubeConsent/index.tsx
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useState } from 'react';
+
+export default function YouTubeConsent({ videoId, title }) {
+ const [loaded, setLoaded] = useState(false);
+
+ const loadYouTube = () => {
+ setLoaded(true);
+ };
+
+ return (
+ <div className="youtube-consent-container">
+ {!loaded ? (
+ <div
+ onClick={loadYouTube}
+ title="Click to Load YouTube Video"
+ style={{
+ textAlign: "center",
+ width: '560px',
+ height: '315px',
+ cursor: 'pointer',
+ backgroundImage:
`url("/img/videos/placeholder_${videoId}.jpg")`,
+ backgroundSize: 'cover',
+ }}
+ >
+ </div>
+ ) : (
+ <div className="youtube-iframe-wrapper">
+ <iframe
+ width="560"
+ height="315"
+
src={`https://www.youtube-nocookie.com/embed/${videoId}`}
+ title={title}
+ frameBorder="0"
+ allow="accelerometer; autoplay; clipboard-write;
encrypted-media; gyroscope; picture-in-picture"
+ allowFullScreen
+ />
+ </div>
+ )}
+ </div>
+ );
+}
\ No newline at end of file
diff --git a/website/static/img/placeholder_calendar.png
b/website/static/img/placeholder_calendar.png
new file mode 100644
index 00000000..ea18fffb
Binary files /dev/null and b/website/static/img/placeholder_calendar.png differ
diff --git a/website/static/img/videos/placeholder_GKsE_EUR9yU.jpg
b/website/static/img/videos/placeholder_GKsE_EUR9yU.jpg
new file mode 100644
index 00000000..0ab2ebd9
Binary files /dev/null and
b/website/static/img/videos/placeholder_GKsE_EUR9yU.jpg differ
diff --git a/website/static/img/videos/placeholder__qSihYk-pOQ.jpg
b/website/static/img/videos/placeholder__qSihYk-pOQ.jpg
new file mode 100644
index 00000000..7565bf24
Binary files /dev/null and
b/website/static/img/videos/placeholder__qSihYk-pOQ.jpg differ