diff --git a/.all-contributorsrc b/.all-contributorsrc index 14e21d56e..d8e7bd969 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -416,6 +416,20 @@ "contributions": [ "code" ] + }, + { + "login": "meteatamel", + "name": "Mete Atamel", + "avatar_url": "https://avatars.githubusercontent.com/u/1177542?v=4", + "profile": "http://atamel.dev", + "contributions": [ + "talk", + "review", + "maintenance", + "ideas", + "blog", + "promotion" + ] } ], "commitConvention": "angular", diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml index 9253675cd..116b80652 100644 --- a/.github/workflows/automerge.yml +++ b/.github/workflows/automerge.yml @@ -45,7 +45,7 @@ jobs: env: GITHUB_TOKEN: "${{ secrets.GH_TOKEN }}" GITHUB_LOGIN: asyncapi-bot - MERGE_LABELS: "" + MERGE_LABELS: "!do-not-merge" MERGE_METHOD: "squash" MERGE_COMMIT_MESSAGE: "{pullRequest.title} (#{pullRequest.number})" MERGE_RETRIES: "20" diff --git a/.github/workflows/create-event-ad-hoc.yml b/.github/workflows/create-event-ad-hoc.yml index 26517f86c..8a5a0d1b4 100644 --- a/.github/workflows/create-event-ad-hoc.yml +++ b/.github/workflows/create-event-ad-hoc.yml @@ -35,8 +35,8 @@ jobs: create_zoom: true secrets: GH_TOKEN: ${{ secrets.GH_TOKEN }} - ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} - ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + ZOOM_ACCOUNT_ID: ${{ secrets.ZOOM_ACCOUNT_ID }} + ZOOM_TOKEN: ${{ secrets.ZOOM_TOKEN }} STREAM_URL: ${{ secrets.STREAM_URL }} STREAM_KEY: ${{ secrets.STREAM_KEY }} CALENDAR_ID: ${{ secrets.CALENDAR_ID }} diff --git a/.github/workflows/create-event-community-meeting.yml b/.github/workflows/create-event-community-meeting.yml index 035734a12..f37e3044b 100644 --- a/.github/workflows/create-event-community-meeting.yml +++ b/.github/workflows/create-event-community-meeting.yml @@ -28,8 +28,8 @@ jobs: create_zoom: true secrets: GH_TOKEN: ${{ secrets.GH_TOKEN }} - ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} - ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + ZOOM_ACCOUNT_ID: ${{ secrets.ZOOM_ACCOUNT_ID }} + ZOOM_TOKEN: ${{ secrets.ZOOM_TOKEN }} STREAM_URL: ${{ secrets.STREAM_URL }} STREAM_KEY: ${{ secrets.STREAM_KEY }} CALENDAR_ID: ${{ secrets.CALENDAR_ID }} diff --git a/.github/workflows/create-event-helpers/package-lock.json b/.github/workflows/create-event-helpers/package-lock.json index 8685660ca..c95e41a69 100644 --- a/.github/workflows/create-event-helpers/package-lock.json +++ b/.github/workflows/create-event-helpers/package-lock.json @@ -10,7 +10,6 @@ "@actions/core": "^1.6.0", "@mailchimp/mailchimp_marketing": "^3.0.74", "googleapis": "^99.0.0", - "jsonwebtoken": "^8.5.1", "node-fetch": "2.6.1" } }, @@ -452,81 +451,6 @@ "bignumber.js": "^9.0.0" } }, - "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=4", - "npm": ">=1.4.28" - } - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -662,14 +586,6 @@ } ] }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -1098,77 +1014,6 @@ "bignumber.js": "^9.0.0" } }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - } - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -1259,11 +1104,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", diff --git a/.github/workflows/create-event-helpers/package.json b/.github/workflows/create-event-helpers/package.json index c7bef2fbf..5b48b79ee 100644 --- a/.github/workflows/create-event-helpers/package.json +++ b/.github/workflows/create-event-helpers/package.json @@ -6,7 +6,6 @@ "@actions/core": "^1.6.0", "@mailchimp/mailchimp_marketing": "^3.0.74", "googleapis": "^99.0.0", - "jsonwebtoken": "^8.5.1", "node-fetch": "2.6.1" } } diff --git a/.github/workflows/create-event-helpers/zoom/index.js b/.github/workflows/create-event-helpers/zoom/index.js index 0d9c87830..b4e757e9e 100644 --- a/.github/workflows/create-event-helpers/zoom/index.js +++ b/.github/workflows/create-event-helpers/zoom/index.js @@ -1,5 +1,5 @@ const fetch = require('node-fetch'); -const jwt = require('jsonwebtoken'); +const { URLSearchParams } = require('url'); const core = require('@actions/core'); /** @@ -11,15 +11,25 @@ const core = require('@actions/core'); module.exports = async(date, time, host, cohost) => { const meetingTitle = process.env.MEETING_NAME; - let meetingDetails; + let meetingDetails, token; - const tokenConfig = { - iss: process.env.ZOOM_API_KEY, - exp: ((new Date()).getTime() + 5000) + //getting request token + try { + const params = new URLSearchParams(); + params.append('grant_type', 'account_credentials'); + params.append('account_id', process.env.ZOOM_ACCOUNT_ID); + const tokenCreationResponse = await fetch('https://zoom.us/oauth/token', { + method: 'POST', + body: params, + headers: { + Authorization: `Basic ${ process.env.ZOOM_TOKEN }` + }, + }); + token = (await tokenCreationResponse.json()).access_token; + } catch (error) { + return core.setFailed(`Failed getting token: ${ error }`) } - const token = jwt.sign(tokenConfig, process.env.ZOOM_API_SECRET); - const zoomSettings = JSON.stringify({ topic: meetingTitle, type: '2', @@ -57,8 +67,11 @@ module.exports = async(date, time, host, cohost) => { return core.setFailed(`Meeting creation failed: ${ error }`) } - //core.debug(JSON.stringify(meetingDetails)); const meetingId = meetingDetails.id; + if (!meetingId) { + core.info(JSON.stringify(meetingDetails, null, 4)); + return core.setFailed('meetingId is not available which means something went wrong in communication with Zoom'); + } const meetingUrl = meetingDetails.join_url; const streamOptions = JSON.stringify({ @@ -84,7 +97,6 @@ module.exports = async(date, time, host, cohost) => { return core.setFailed(`Meeting update with streaming info failed: ${ error }`) } - if (!meetingId) return core.setFailed('meetingId is not available which means something went wrong in communication with Zoom. Most probably the host that you defined is not yet part of related Zoom account'); core.info(`Created meeting ${ meetingId } that you can join at ${ meetingUrl }`); core.setOutput('meetingUrl', meetingUrl); -} \ No newline at end of file +} diff --git a/.github/workflows/create-event-lets-talk-about.yml b/.github/workflows/create-event-lets-talk-about.yml index c82b58375..2942ee8ba 100644 --- a/.github/workflows/create-event-lets-talk-about.yml +++ b/.github/workflows/create-event-lets-talk-about.yml @@ -32,8 +32,8 @@ jobs: create_zoom: false secrets: GH_TOKEN: ${{ secrets.GH_TOKEN }} - ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} - ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + ZOOM_ACCOUNT_ID: ${{ secrets.ZOOM_ACCOUNT_ID }} + ZOOM_TOKEN: ${{ secrets.ZOOM_TOKEN }} STREAM_URL: ${{ secrets.STREAM_URL }} STREAM_KEY: ${{ secrets.STREAM_KEY }} CALENDAR_ID: ${{ secrets.CALENDAR_ID }} diff --git a/.github/workflows/create-event-spec-3-0.yml b/.github/workflows/create-event-spec-3-0.yml index 28427d84f..92da486f6 100644 --- a/.github/workflows/create-event-spec-3-0.yml +++ b/.github/workflows/create-event-spec-3-0.yml @@ -29,8 +29,8 @@ jobs: create_zoom: true secrets: GH_TOKEN: ${{ secrets.GH_TOKEN }} - ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} - ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + ZOOM_ACCOUNT_ID: ${{ secrets.ZOOM_ACCOUNT_ID }} + ZOOM_TOKEN: ${{ secrets.ZOOM_TOKEN }} STREAM_URL: ${{ secrets.STREAM_URL }} STREAM_KEY: ${{ secrets.STREAM_KEY }} CALENDAR_ID: ${{ secrets.CALENDAR_ID }} diff --git a/.github/workflows/create-event-spec-3-docs.yml b/.github/workflows/create-event-spec-3-docs.yml index 9c831832e..4d2bda5b8 100644 --- a/.github/workflows/create-event-spec-3-docs.yml +++ b/.github/workflows/create-event-spec-3-docs.yml @@ -28,8 +28,8 @@ jobs: create_zoom: true secrets: GH_TOKEN: ${{ secrets.GH_TOKEN }} - ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} - ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + ZOOM_ACCOUNT_ID: ${{ secrets.ZOOM_ACCOUNT_ID }} + ZOOM_TOKEN: ${{ secrets.ZOOM_TOKEN }} STREAM_URL: ${{ secrets.STREAM_URL }} STREAM_KEY: ${{ secrets.STREAM_KEY }} CALENDAR_ID: ${{ secrets.CALENDAR_ID }} diff --git a/.github/workflows/create-event-thinking-out-loud.yml b/.github/workflows/create-event-thinking-out-loud.yml index 80018c1fe..656c33760 100644 --- a/.github/workflows/create-event-thinking-out-loud.yml +++ b/.github/workflows/create-event-thinking-out-loud.yml @@ -34,8 +34,8 @@ jobs: create_zoom: true secrets: GH_TOKEN: ${{ secrets.GH_TOKEN }} - ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} - ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + ZOOM_ACCOUNT_ID: ${{ secrets.ZOOM_ACCOUNT_ID }} + ZOOM_TOKEN: ${{ secrets.ZOOM_TOKEN }} STREAM_URL: ${{ secrets.STREAM_URL }} STREAM_KEY: ${{ secrets.STREAM_KEY }} CALENDAR_ID: ${{ secrets.CALENDAR_ID }} diff --git a/.github/workflows/create-event-workflow-reusable.yml b/.github/workflows/create-event-workflow-reusable.yml index 5d7fd7d54..388b7ed24 100644 --- a/.github/workflows/create-event-workflow-reusable.yml +++ b/.github/workflows/create-event-workflow-reusable.yml @@ -50,9 +50,9 @@ on: secrets: GH_TOKEN: required: true - ZOOM_API_KEY: + ZOOM_ACCOUNT_ID: required: true - ZOOM_API_SECRET: + ZOOM_TOKEN: required: true STREAM_URL: required: true @@ -74,8 +74,8 @@ on: jobs: setup-meeting: env: - ZOOM_API_KEY: ${{ secrets.ZOOM_API_KEY }} - ZOOM_API_SECRET: ${{ secrets.ZOOM_API_SECRET }} + ZOOM_ACCOUNT_ID: ${{ secrets.ZOOM_ACCOUNT_ID }} + ZOOM_TOKEN: ${{ secrets.ZOOM_TOKEN }} STREAM_URL: ${{ secrets.STREAM_URL }} STREAM_KEY: ${{ secrets.STREAM_KEY }} CALENDAR_ID: ${{ secrets.CALENDAR_ID }} diff --git a/.github/workflows/youtube-to-spotify-for-podcasters.yml b/.github/workflows/youtube-to-spotify-for-podcasters.yml new file mode 100644 index 000000000..bd91f7b56 --- /dev/null +++ b/.github/workflows/youtube-to-spotify-for-podcasters.yml @@ -0,0 +1,36 @@ +name: 'Upload Episode from YouTube To Spotify for Podcasters' + +on: + workflow_dispatch: + inputs: + video_id: + description: 'Enter YouTube video ID to upload on Spotify for Podcasters.' + required: true + +jobs: + upload_episode: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Create episode.json file + run: | + # Get the video ID from the workflow_dispatch input. + video_id="${{ github.event.inputs.video_id }}" + + # Create episode.json content with the video ID + json_content="{\"id\": \"${video_id}\"}" + + # Write the content to episode.json in the workspace directory + echo "${json_content}" > episode.json + + # Verify the content was written successfully + cat episode.json + - name: Upload Episode from YouTube To Anchor.Fm + uses: Schrodinger-Hat/youtube-to-anchorfm@c722f3edeee94f3173dad36c5a959247973c5253 #commit related to https://github.com/Schrodinger-Hat/youtube-to-anchorfm/commit/c722f3edeee94f3173dad36c5a959247973c5253 || The latest commit which is of Nov 14, 2023 + env: + ANCHOR_EMAIL: ${{ secrets.ANCHOR_EMAIL }} + ANCHOR_PASSWORD: ${{ secrets.ANCHOR_PASSWORD }} + EPISODE_PATH: /github/workspace + URL_IN_DESCRIPTION: true + LOAD_THUMBNAIL: true + POSTPROCESSOR_ARGS: 'ffmpeg:-ac 1' diff --git a/AMBASSADORS_MEMBERS.json b/AMBASSADORS_MEMBERS.json index b4ab927f8..b953354ef 100644 --- a/AMBASSADORS_MEMBERS.json +++ b/AMBASSADORS_MEMBERS.json @@ -330,5 +330,72 @@ "link": "" } ] + }, + { + "name": "Mete Atamel", + "github": "meteatamel", + "twitter": "meteatamel", + "country": "π¬π§", + "bio": "Mete is a Software Engineer and a Developer Advocate with 18+ years of experience. Currently, he works in the Developer Relations team at Google in London. He builds tools, demos, tutorials, and gives talks to educate and help developers to be successful on Google Cloud. As a regular speaker at tech conferences, he has spoken over 345+ events since 2016 on modern application development topics such as Kubernetes, Istio, Knative, serverless, event-driven architectures, and microservice orchestration. Prior to his current role, he was a Software Engineer/Architect/Tech Lead at Nokia, EMC, Adobe, Skype, and Microsoft building various client and server technologies, resulting in multiple patents.", + "linkedin": "mete-atamel", + "company": "Google", + "title": "Software Engineer and Developer Advocate at Google", + "img": "https://avatars.githubusercontent.com/u/1177542?v=4", + "contributions": [ + { + "type": "article", + "title": "AsyncAPI Basics", + "date": { + "year": 2023, + "month": "May" + }, + "link": "https://medium.com/google-cloud/asyncapi-basics-6e6394c9587" + }, + { + "type": "article", + "title": "AsyncAPI Tools", + "date": { + "year": 2023, + "month": "May" + }, + "link": "https://medium.com/google-cloud/asyncapi-tools-dd59f9236b20" + }, + { + "type": "article", + "title": "Understanding AsyncAPIβs publish & subscribe semantics with an example", + "date": { + "year": 2023, + "month": "May" + }, + "link": "https://medium.com/google-cloud/understanding-asyncapis-publish-subscribe-semantics-with-an-example-cfa1cc3faef5" + }, + { + "type": "article", + "title": "CloudEvents + AsyncAPI", + "date": { + "year": 2023, + "month": "May" + }, + "link": "https://medium.com/google-cloud/cloudevents-asyncapi-fa8ef63f28e0" + }, + { + "type": "article", + "title": "Google Cloud Pub/Sub + AsyncAPI", + "date": { + "year": 2023, + "month": "May" + }, + "link": "https://medium.com/google-cloud/google-cloud-pub-sub-asyncapi-6ea3c1ed3c49" + }, + { + "type": "presentation", + "title": "Open standards for building event-driven applications in the cloud", + "date": { + "year": 2023, + "month": "June" + }, + "link": "https://www.youtube.com/watch?v=6Igp4DhK_hE" + } + ] } ] diff --git a/MAINTAINERS.yaml b/MAINTAINERS.yaml index f2ca9622d..716497a97 100644 --- a/MAINTAINERS.yaml +++ b/MAINTAINERS.yaml @@ -268,15 +268,6 @@ isTscMember: true repos: - jasyncapi-idea-plugin -- name: Pratik Haldankar - github: pratik2315 - slack: U03ADC8FD2S - linkedin: pratik-haldankar-1b237a205 - twitter: PratikHaldankr - availableForHire: true - isTscMember: true - repos: - - generator - name: Richard Coppen github: rcoppen linkedin: richard-coppen diff --git a/MEETINGS_ORGANIZATION.md b/MEETINGS_ORGANIZATION.md index 7960b8842..6ad1e9a6f 100644 --- a/MEETINGS_ORGANIZATION.md +++ b/MEETINGS_ORGANIZATION.md @@ -1,15 +1,15 @@ -This document covers the aspect of different meetings organization at AsyncAPI. +This document covers the aspects of different meeting organizations at AsyncAPI. ## FAQ ### What do I need to schedule a meeting? To schedule a meeting, you need to be: -- one of the licensed Zoom users associated with the AsyncAPI Zoom account. It is required because only licensed users can start meeting, live transcripts, and streaming. +- one of the licensed Zoom users associated with the AsyncAPI Zoom account. It is required because only licensed users can start meetings, live transcripts, and streaming. - GitHub Action workflow for `Ad Hoc` meeting scheduling should be updated. Newly licensed users should be added as alternative hosts. -- a member of [GitHub team called meetings-organizars](https://github.com/orgs/asyncapi/teams/meetings-organizers). It is required because only maintainers of the given repository can manually trigger GitHub Actions workflows. This group has a `Maintain` role in the `community` repository where meeting automation is implemented. -- a member of a team in the AsyncAPI Restream account. It is required because hosts must log in to Restream before they start streaming the meeting from Zoom and modify the stream's title that will show up on social platforms. -- a member of the AsyncAPI YouTube account. It is required because after the meeting is over, hosts need to add live their stream recording to the proper YouTube Playlist to improve recording discoverability. +- a member of [GitHub team called meetings-organizers](https://github.com/orgs/asyncapi/teams/meetings-organizers). This is required because only repository maintainers can manually trigger GitHub Actions workflows. This group has a `Maintain` role in the `community` repository where meeting automation is implemented. +- a member of a team in the AsyncAPI Restream account. It is required because hosts must log in to Restream before streaming the meeting from Zoom and modify the stream's title that will appear on social platforms. +- a member of the AsyncAPI YouTube account. It is required because hosts need to add live stream recordings to the proper YouTube Playlist after the meeting is over to improve recording discoverability. ### What meetings do we have? @@ -25,16 +25,16 @@ To schedule a meeting, you need to be: We have an automated workflow in place: 1. Automation starts after clicking **Run workflow**. (Unless there is another GitHub Actions outage and proper events are not delivered to automation :smiley: ) -1. It creates a new meeting in Zoom. It is by default configured to support live streaming +1. It creates a new meeting in Zoom. It is, by default, configured to support live streaming 1. It creates a GitHub issue with all details about the meeting 1. It creates a new Google Calendar entry with special metadata containing the GitHub issue number 1. It sends a tweet with information about a newly scheduled event ### What are my responsibilities as meeting host? -Technically there are two types of meetings: -- Zoom-first: Meeting takes place on Zoom and through integration with Restream.io it is streamed to different channels. These meetings happen on Zoom to enable as many people as possible to join live conversation. -- Restream-first: Meeting takes place on Restream and is is streamed to different channels. These meetings are focused on showing or explaining some topic without live audio conversation with the audience. +Technically, there are two types of meetings: +- Zoom-first: The meeting takes place on Zoom and is streamed to different channels through integration with Restream.io. The goal is to enable as many people as possible to join the live conversation. +- Restream-first: The meeting takes place on Restream and is streamed to different channels. These meetings are focused on showing or explaining some topic without a live audio conversation with the audience. #### Zoom-first @@ -53,7 +53,7 @@ This is what you need to do to kick it off: 1. Provide title and description: - Title for the live stream that corresponds with the meeting you just started, - - Meeting description must be provided even if the field is empty, otherwise the old one from other streams will be used. + - Meeting description must be provided even if the field is empty; otherwise, the old one from other streams will be used. @@ -75,15 +75,15 @@ This is what you need to do to kick it off: #### Restream-first -You need to first start with YouTube, even though Restream can directly stream there. It is because by +You must start with YouTube first, even though Restream can directly stream there. It is because by This is what you need to do to kick it off: -1. In [YouTube](https://youtube.com) click on your profile picture and select `Switch account`: +1. In [YouTube](https://youtube.com), click on your profile picture and select `Switch account`: -1. Select `AsyncAPI`. If you do not see it on the list, means you did not have all access rights needed to setup a live stream: +1. Select `AsyncAPI`. If you do not see it on the list, it means you did not have all the access rights needed to set up a live stream: @@ -91,7 +91,7 @@ This is what you need to do to kick it off: -1. Once new live stream is created, in the list of `Upcomming` streams, click `View in Live Control Room` icon next to your live stream: +1. Once a new live stream is created, in the list of `Upcoming` streams, click `View in Live Control Room` icon next to your live stream: @@ -103,7 +103,7 @@ This is what you need to do to kick it off: -1. After enabling audio, video and providing name, you will see a Restream Studio. +1. After enabling the audio, video and providing the name, you will see a Restream Studio. 1. `Edit` the title and description of the stream: @@ -112,7 +112,7 @@ This is what you need to do to kick it off: 1. Provide title and description and click `Next`: - Title for the live stream that corresponds with the meeting you just started, - - Meeting description must be provided even if the field is empty, otherwise the old one from other streams will be used. + - Meeting description must be provided even if the field is empty; otherwise, the old one from other streams will be used. @@ -120,7 +120,7 @@ This is what you need to do to kick it off: -1. Make sure you do not create new event but you select the one you already created on YouTube, with closed captions on: +1. Make sure you do not create a new event, but select the one you already created on YouTube, with closed captions on: @@ -140,7 +140,7 @@ Subscribe to the [AsyncAPI Newsletter](https://asyncapi.com/newsletter) to get i We have an automated workflow in place: 1. Automation starts every Friday at midnight 1. It gets information from Google Calendar about all the meetings scheduled for the upcoming week -1. It schedules a MailChimp campaign to send emails with a list of meetings. It's sent on Friday at 11AM in the subscriber's time zone +1. It schedules a MailChimp campaign to send emails with a list of meetings. It's sent on Friday at 11 AM in the subscriber's time zone ### Where can I find the AsyncAPI calendar? @@ -156,7 +156,7 @@ We have an automated workflow in place: 1. It checks if a closed issue represents a future event 1. It removes meetings from the AsyncAPI Google Calendar -### How do I register a new regular meeting? +### How do I register for a new regular meeting? Start [discussion in community repository](https://github.com/asyncapi/community/discussions). Explain the idea and justify why it requires a separate meeting. We currently have [approval from the Technical Steering Commitee](https://github.com/asyncapi/community/discussions/295) to pay for up to 8 Zoom licenses. @@ -165,4 +165,73 @@ Once a new meeting is approved, add a [new workflow like this one](.github/workf ### How can I become a host? -Once your `Regular` meeting gets approved, contact `Fran Mendez` so that he can give you access to all required tools. +Once your `Regular` meeting gets approved, contact `Fran Mendez` so he can give you access to all required tools. + + + +## How do I publish broadcasted meetings as podcasts? + +### Why do we need this feature? + +- Some people prefer to listen to the video/livestream as an audio (podcast) instead of watching the video. + +- The goal is to upload our AsyncAPI video/live streams on `Spotify For Podcasters` platform, ultimately allowing the listener to play the episodes on Spotify. Almost every YouTube video can be converted into a podcast. + + +### Who can upload the videos? + +- The workflow can only be triggered by a person with write access to the `master` branch of the `asyncapi/community` repository. + +### What is needed? + +- The YouTube video ID is needed to trigger the workflow. + +### What is YouTube video ID? + +- A YouTube video ID is a unique combination of characters that identifies a specific video on the YouTube platform. It's used in the URL of the video to direct users to the exact video they want to watch. The video ID is typically a sequence of letters, numbers, and special characters that generally comes after the "v=" parameter in the URL. +- [More examples](#list-of-different-types-of-youtube-links) of video ID are given below: β¬οΈ + +#### How to find YouTube ID? + +Let's take this video link, for example: https://www.youtube.com/watch?v=3rg_7hIb9PQ. + +Here the video ID is the word/entity after `https://www.youtube.com/watch?v=`, i.e., `3rg_7hIb9PQ` + + +### List of different types of YouTube links + +- `https://www.youtube.com/watch?v=VIDEO_ID` + - Here, it can be https://www.youtube.com/watch?v=3rg_7hIb9PQ +- `https://youtu.be/VIDEO_ID` + - Here, it can be https://www.youtu.be/3rg_7hIb9PQ +- `https://www.youtube.com/embed/VIDEO_ID` + - Here, it can be https://www.youtube.com/embed/3rg_7hIb9PQ +- `https://www.youtube.com/playlist?list=PLAYLIST_ID` + - Here, it can be https://www.youtube.com/playlist?list=PLbi1gRlP7piiaD67o1F4EOPoZztg2r8l6 +- `https://www.youtube.com/shorts/VIDEO_ID` + - Here, it can be https://www.youtube.com/shorts/3rg_7hIb9PQ +- `https://www.youtube.com/watch?v=VIDEO_ID&list=PLAYLIST_ID` + - Here, it can be https://www.youtube.com/watch?v=deLUAobdVpw&list=PLbi1gRlP7piiaD67o1F4EOPoZztg2r8l6 +- `https://youtube.com/shorts/VIDEO_ID?feature=share` + - Here, it can be https://youtube.com/shorts/U5jUr8XAF_M?feature=share + + +### Step-by-step procedure + +Here is an example with a procedure on how to use this workflow: + +1. Go to the `Actions` section on GitHub. +2. Scroll down the menu on the left-hand side. +3. Click on the `Upload Episode from YouTube To Spotify for Podcasters` option. +4. Click on the `Run Workflow` button. +5. Provide the YouTube ID in the box. +6. Click on `Run workflow` button. +7. Wait for the workflow to finish. (Depending on video size, it may take some time to upload, so please have patience. Thank you.) . +8. A few moments later....Hurray! Your episode is now uploaded successfully! + +You can also modify description and other information for uploaded podcast directly in Spotify: + +1. Go to https://podcasters.spotify.com/. +2. Login using AsyncAPI account. +2. Go to `Episodes` section. There, you will see your latest upload. +3. Perform edits and save them. diff --git a/README.md b/README.md index b605722f5..87a728b75 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d