From e4475bbe8876eee0d6301c8368c479c335d58f52 Mon Sep 17 00:00:00 2001 From: Naufal Fachrian Date: Sun, 18 Jun 2023 01:50:05 +0700 Subject: [PATCH 1/2] Implement YouTube namespace for atom feed that could benefit user to work with YouTube API --- FeedKit.xcodeproj/project.pbxproj | 34 + .../Atom/AtomFeed + mapAttributes.swift | 10 + .../Atom/AtomFeed + mapCharacters.swift | 2 + .../FeedKit/Models/Atom/AtomFeedEntry.swift | 5 +- Sources/FeedKit/Models/Atom/AtomPath.swift | 5 + .../Namespaces/YouTube/YouTubeNamespace.swift | 53 ++ Tests/YouTubeTests.swift | 82 +++ Tests/xml/YouTubeXMLFeed.xml | 611 ++++++++++++++++++ 8 files changed, 801 insertions(+), 1 deletion(-) create mode 100644 Sources/FeedKit/Models/Namespaces/YouTube/YouTubeNamespace.swift create mode 100644 Tests/YouTubeTests.swift create mode 100644 Tests/xml/YouTubeXMLFeed.xml diff --git a/FeedKit.xcodeproj/project.pbxproj b/FeedKit.xcodeproj/project.pbxproj index 8f5f6bc8..e2629e20 100644 --- a/FeedKit.xcodeproj/project.pbxproj +++ b/FeedKit.xcodeproj/project.pbxproj @@ -487,6 +487,16 @@ BB394B7D223B368C00366193 /* AmpersandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB394B7C223B368C00366193 /* AmpersandTests.swift */; }; BB394B7E223B368C00366193 /* AmpersandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB394B7C223B368C00366193 /* AmpersandTests.swift */; }; BB394B7F223B368C00366193 /* AmpersandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB394B7C223B368C00366193 /* AmpersandTests.swift */; }; + EA4431E12A3E2B6C00C2C7F4 /* YouTubeNamespace.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA4431E02A3E2B6C00C2C7F4 /* YouTubeNamespace.swift */; }; + EA4431E22A3E2EE000C2C7F4 /* YouTubeNamespace.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA4431E02A3E2B6C00C2C7F4 /* YouTubeNamespace.swift */; }; + EA4431E32A3E2EE100C2C7F4 /* YouTubeNamespace.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA4431E02A3E2B6C00C2C7F4 /* YouTubeNamespace.swift */; }; + EA4431E42A3E2EE200C2C7F4 /* YouTubeNamespace.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA4431E02A3E2B6C00C2C7F4 /* YouTubeNamespace.swift */; }; + EA4431E62A3E32C000C2C7F4 /* YouTubeXMLFeed.xml in Resources */ = {isa = PBXBuildFile; fileRef = EA4431E52A3E32C000C2C7F4 /* YouTubeXMLFeed.xml */; }; + EA4431E72A3E32C000C2C7F4 /* YouTubeXMLFeed.xml in Resources */ = {isa = PBXBuildFile; fileRef = EA4431E52A3E32C000C2C7F4 /* YouTubeXMLFeed.xml */; }; + EA4431E82A3E32C000C2C7F4 /* YouTubeXMLFeed.xml in Resources */ = {isa = PBXBuildFile; fileRef = EA4431E52A3E32C000C2C7F4 /* YouTubeXMLFeed.xml */; }; + EA4431EA2A3E333E00C2C7F4 /* YouTubeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA4431E92A3E333E00C2C7F4 /* YouTubeTests.swift */; }; + EA4431EB2A3E333E00C2C7F4 /* YouTubeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA4431E92A3E333E00C2C7F4 /* YouTubeTests.swift */; }; + EA4431EC2A3E333E00C2C7F4 /* YouTubeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA4431E92A3E333E00C2C7F4 /* YouTubeTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -723,6 +733,9 @@ A0F79FBC1F642AE2007CFC08 /* RDFTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RDFTests.swift; sourceTree = ""; }; BB394B77223B35D700366193 /* Ampersand.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Ampersand.xml; sourceTree = ""; }; BB394B7C223B368C00366193 /* AmpersandTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AmpersandTests.swift; sourceTree = ""; }; + EA4431E02A3E2B6C00C2C7F4 /* YouTubeNamespace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YouTubeNamespace.swift; sourceTree = ""; }; + EA4431E52A3E32C000C2C7F4 /* YouTubeXMLFeed.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = YouTubeXMLFeed.xml; sourceTree = ""; }; + EA4431E92A3E333E00C2C7F4 /* YouTubeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YouTubeTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -817,6 +830,7 @@ A09AFB321EEFDFF40076ACC7 /* DublinCoreTests.swift */, A09AFB331EEFDFF40076ACC7 /* DurationTests.swift */, A09AFB341EEFDFF40076ACC7 /* iTunesTests.swift */, + EA4431E92A3E333E00C2C7F4 /* YouTubeTests.swift */, A09AFB351EEFDFF40076ACC7 /* JSONTests.swift */, A09AFB361EEFDFF40076ACC7 /* MediaTests.swift */, A09AFB371EEFDFF40076ACC7 /* ParserErrorTests.swift */, @@ -991,6 +1005,7 @@ A0F6B7E51F6E6E9600220625 /* Namespaces */ = { isa = PBXGroup; children = ( + EA4431DF2A3E2B5E00C2C7F4 /* YouTube */, A0F6B7E61F6E6E9600220625 /* Content */, A0F6B7E81F6E6E9600220625 /* Dublin Core */, A0F6B7EA1F6E6E9600220625 /* iTunes */, @@ -1133,6 +1148,7 @@ A0F6B9B61F6E6FA700220625 /* RSSDC.xml */, A0F6B9B71F6E6FA700220625 /* RSSMedia.xml */, A0F6B9B81F6E6FA700220625 /* Syndication.xml */, + EA4431E52A3E32C000C2C7F4 /* YouTubeXMLFeed.xml */, ); path = xml; sourceTree = ""; @@ -1155,6 +1171,14 @@ path = "View Controllers"; sourceTree = ""; }; + EA4431DF2A3E2B5E00C2C7F4 /* YouTube */ = { + isa = PBXGroup; + children = ( + EA4431E02A3E2B6C00C2C7F4 /* YouTubeNamespace.swift */, + ); + path = YouTube; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -1479,6 +1503,7 @@ A0F6B9E01F6E714400220625 /* feed.json in Resources */, A0F6B9D61F6E713F00220625 /* AtomMedia.xml in Resources */, A0F6B9DD1F6E713F00220625 /* RSSDC.xml in Resources */, + EA4431E62A3E32C000C2C7F4 /* YouTubeXMLFeed.xml in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1499,6 +1524,7 @@ A0F6B9E11F6E714400220625 /* feed.json in Resources */, A0F6B9CB1F6E713F00220625 /* AtomMedia.xml in Resources */, A0F6B9D21F6E713F00220625 /* RSSDC.xml in Resources */, + EA4431E72A3E32C000C2C7F4 /* YouTubeXMLFeed.xml in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1519,6 +1545,7 @@ A0F6B9E21F6E714400220625 /* feed.json in Resources */, A0F6B9C01F6E713E00220625 /* AtomMedia.xml in Resources */, A0F6B9C71F6E713F00220625 /* RSSDC.xml in Resources */, + EA4431E82A3E32C000C2C7F4 /* YouTubeXMLFeed.xml in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1640,6 +1667,7 @@ A0F6B8671F6E6EB800220625 /* MediaStatistics.swift in Sources */, A0C788CB20CC6332005C2F6F /* URL + replacingScheme.swift in Sources */, A0F6B87E1F6E6EB800220625 /* RSSFeedTextInput.swift in Sources */, + EA4431E42A3E2EE200C2C7F4 /* YouTubeNamespace.swift in Sources */, A0F6B82E1F6E6EB800220625 /* RFC3339DateFormatter.swift in Sources */, A0F6B8311F6E6EB800220625 /* String + toBool.swift in Sources */, A0F6B8431F6E6EB800220625 /* AtomFeedLink.swift in Sources */, @@ -1686,6 +1714,7 @@ A0F79FBD1F642AE2007CFC08 /* RDFTests.swift in Sources */, A09AFB3A1EEFDFF40076ACC7 /* AtomTests.swift in Sources */, A09AFB401EEFDFF40076ACC7 /* ContentTests.swift in Sources */, + EA4431EA2A3E333E00C2C7F4 /* YouTubeTests.swift in Sources */, A09AFB491EEFDFF40076ACC7 /* DurationTests.swift in Sources */, A09AFB431EEFDFF40076ACC7 /* DateTests.swift in Sources */, A09AFB461EEFDFF40076ACC7 /* DublinCoreTests.swift in Sources */, @@ -1708,6 +1737,7 @@ A0F79FBE1F642AE2007CFC08 /* RDFTests.swift in Sources */, A09AFB3B1EEFDFF40076ACC7 /* AtomTests.swift in Sources */, A09AFB411EEFDFF40076ACC7 /* ContentTests.swift in Sources */, + EA4431EB2A3E333E00C2C7F4 /* YouTubeTests.swift in Sources */, A09AFB4A1EEFDFF40076ACC7 /* DurationTests.swift in Sources */, A09AFB441EEFDFF40076ACC7 /* DateTests.swift in Sources */, A09AFB471EEFDFF40076ACC7 /* DublinCoreTests.swift in Sources */, @@ -1730,6 +1760,7 @@ A0F79FBF1F642AE2007CFC08 /* RDFTests.swift in Sources */, A09AFB3C1EEFDFF40076ACC7 /* AtomTests.swift in Sources */, A09AFB421EEFDFF40076ACC7 /* ContentTests.swift in Sources */, + EA4431EC2A3E333E00C2C7F4 /* YouTubeTests.swift in Sources */, A09AFB4B1EEFDFF40076ACC7 /* DurationTests.swift in Sources */, A09AFB451EEFDFF40076ACC7 /* DateTests.swift in Sources */, A09AFB481EEFDFF40076ACC7 /* DublinCoreTests.swift in Sources */, @@ -1836,6 +1867,7 @@ A0F6B91F1F6E6EBB00220625 /* MediaStatistics.swift in Sources */, A0C788C920CC6332005C2F6F /* URL + replacingScheme.swift in Sources */, A0F6B9361F6E6EBB00220625 /* RSSFeedTextInput.swift in Sources */, + EA4431E22A3E2EE000C2C7F4 /* YouTubeNamespace.swift in Sources */, A0F6B8E61F6E6EBA00220625 /* RFC3339DateFormatter.swift in Sources */, A0F6B8E91F6E6EBA00220625 /* String + toBool.swift in Sources */, A0F6B8FB1F6E6EBB00220625 /* AtomFeedLink.swift in Sources */, @@ -1936,6 +1968,7 @@ A0F6B8C31F6E6EBA00220625 /* MediaStatistics.swift in Sources */, A0C788CA20CC6332005C2F6F /* URL + replacingScheme.swift in Sources */, A0F6B8DA1F6E6EBA00220625 /* RSSFeedTextInput.swift in Sources */, + EA4431E32A3E2EE100C2C7F4 /* YouTubeNamespace.swift in Sources */, A0F6B88A1F6E6EBA00220625 /* RFC3339DateFormatter.swift in Sources */, A0F6B88D1F6E6EBA00220625 /* String + toBool.swift in Sources */, A0F6B89F1F6E6EBA00220625 /* AtomFeedLink.swift in Sources */, @@ -2036,6 +2069,7 @@ A0F6B97B1F6E6EBB00220625 /* MediaStatistics.swift in Sources */, A0C788C820CC6332005C2F6F /* URL + replacingScheme.swift in Sources */, A0F6B9921F6E6EBB00220625 /* RSSFeedTextInput.swift in Sources */, + EA4431E12A3E2B6C00C2C7F4 /* YouTubeNamespace.swift in Sources */, A0F6B9421F6E6EBB00220625 /* RFC3339DateFormatter.swift in Sources */, A0F6B9451F6E6EBB00220625 /* String + toBool.swift in Sources */, A0F6B9571F6E6EBB00220625 /* AtomFeedLink.swift in Sources */, diff --git a/Sources/FeedKit/Models/Atom/AtomFeed + mapAttributes.swift b/Sources/FeedKit/Models/Atom/AtomFeed + mapAttributes.swift index 915e0291..ac2455df 100644 --- a/Sources/FeedKit/Models/Atom/AtomFeed + mapAttributes.swift +++ b/Sources/FeedKit/Models/Atom/AtomFeed + mapAttributes.swift @@ -345,6 +345,16 @@ extension AtomFeed { } + // MARK: YouTube + + case + .feedEntryYouTubeChannelID, + .feedEntryYouTubeVideoID: + + if self.entries?.last?.yt == nil { + self.entries?.last?.yt = YouTubeNamespace() + } + default: break } diff --git a/Sources/FeedKit/Models/Atom/AtomFeed + mapCharacters.swift b/Sources/FeedKit/Models/Atom/AtomFeed + mapCharacters.swift index 73f1c4ae..a6e71274 100644 --- a/Sources/FeedKit/Models/Atom/AtomFeed + mapCharacters.swift +++ b/Sources/FeedKit/Models/Atom/AtomFeed + mapCharacters.swift @@ -79,6 +79,8 @@ extension AtomFeed { case .feedEntryMediaScenesMediaSceneSceneDescription: self.entries?.last?.media?.mediaScenes?.last?.sceneDescription = self.entries?.last?.media?.mediaScenes?.last?.sceneDescription?.appending(string) ?? string case .feedEntryMediaScenesMediaSceneSceneStartTime: self.entries?.last?.media?.mediaScenes?.last?.sceneStartTime = string.toDuration() case .feedEntryMediaScenesMediaSceneSceneEndTime: self.entries?.last?.media?.mediaScenes?.last?.sceneEndTime = string.toDuration() + case .feedEntryYouTubeChannelID: self.entries?.last?.yt?.channelID = self.entries?.last?.yt?.channelID?.appending(string) ?? string + case .feedEntryYouTubeVideoID: self.entries?.last?.yt?.videoID = self.entries?.last?.yt?.videoID?.appending(string) ?? string default: break } } diff --git a/Sources/FeedKit/Models/Atom/AtomFeedEntry.swift b/Sources/FeedKit/Models/Atom/AtomFeedEntry.swift index 35fd9351..c2606dae 100644 --- a/Sources/FeedKit/Models/Atom/AtomFeedEntry.swift +++ b/Sources/FeedKit/Models/Atom/AtomFeedEntry.swift @@ -164,6 +164,8 @@ public class AtomFeedEntry { /// capabilities of RSS 2.0. public var media: MediaNamespace? + public var yt: YouTubeNamespace? + public init() { } } @@ -185,7 +187,8 @@ extension AtomFeedEntry: Equatable { lhs.content == rhs.content && lhs.published == rhs.published && lhs.source == rhs.source && - lhs.rights == rhs.rights + lhs.rights == rhs.rights && + lhs.yt == rhs.yt } } diff --git a/Sources/FeedKit/Models/Atom/AtomPath.swift b/Sources/FeedKit/Models/Atom/AtomPath.swift index 393bcf8b..ff638405 100644 --- a/Sources/FeedKit/Models/Atom/AtomPath.swift +++ b/Sources/FeedKit/Models/Atom/AtomPath.swift @@ -107,4 +107,9 @@ enum AtomPath: String { case feedEntryMediaGroupMediaRating = "/feed/entry/media:group/media:rating" case feedEntryMediaGroupMediaContent = "/feed/entry/media:group/media:content" + // MARK: YouTube + + case feedEntryYouTubeChannelID = "/feed/entry/yt:channelId" + case feedEntryYouTubeVideoID = "/feed/entry/yt:videoId" + } diff --git a/Sources/FeedKit/Models/Namespaces/YouTube/YouTubeNamespace.swift b/Sources/FeedKit/Models/Namespaces/YouTube/YouTubeNamespace.swift new file mode 100644 index 00000000..492b3fac --- /dev/null +++ b/Sources/FeedKit/Models/Namespaces/YouTube/YouTubeNamespace.swift @@ -0,0 +1,53 @@ +// +// YouTubeNamespace.swift +// +// Copyright (c) 2023 Naufal Fachrian +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// + +import Foundation + +/// YouTube metadata contains channel ID and video ID for YouTube content. +/// +/// See https://developers.google.com/youtube/v3/guides/push_notifications +public class YouTubeNamespace { + + /// The element's value to identify the channel that owns that video. + public var channelID: String? + + /// The element's value to identify the newly added or updated video. + public var videoID: String? + + public init() { } + +} + + +// MARK: - Equatable + +extension YouTubeNamespace: Equatable { + + public static func ==(lhs: YouTubeNamespace, rhs: YouTubeNamespace) -> Bool { + return + lhs.channelID == rhs.channelID && + lhs.videoID == rhs.videoID + } + +} diff --git a/Tests/YouTubeTests.swift b/Tests/YouTubeTests.swift new file mode 100644 index 00000000..6702d95c --- /dev/null +++ b/Tests/YouTubeTests.swift @@ -0,0 +1,82 @@ +// +// YouTubeTests.swift +// +// Copyright (c) 2023 Naufal Fachrian +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// + +import XCTest +import FeedKit + +class YouTubeTests: BaseTestCase { + + func testYouTubeChannelID() { + + let URL = fileURL("YouTubeXMLFeed", type: "xml") + let parser = FeedParser(URL: URL) + + do { + + let feed = try parser.parse().get().atomFeed + + XCTAssertEqual(feed?.entries?.last?.yt?.channelID, "UCE_M8A5yxnLfW0KghEeajjw") + + } catch { + XCTFail(error.localizedDescription) + } + + } + + func testYouTubeVideoID() { + + let URL = fileURL("YouTubeXMLFeed", type: "xml") + let parser = FeedParser(URL: URL) + + do { + + let feed = try parser.parse().get().atomFeed + + [ + "51QO4pavK3A", + "j1HGOY32s2Y", + "rc46cO3spSE", + "0okuAwqTHs0", + "GYkq9Rgoj8E", + "TX9qSaGXFyg", + "4-7jSoINyq4", + "0mqWw5UH1qg", + "L5wx0Takylc", + "fVW8-px4Ufw", + "1S8L7t2tu0U", + "svpvEfQ1cp8", + "f1VEks-QQ4Y", + "1HWUjMjaBJI", + "oMf_i1YBuMk" + ].forEach { videoID in + XCTAssertTrue(feed?.entries?.contains(where: { entry in entry.yt?.videoID == videoID }) == true) + } + + } catch { + XCTFail(error.localizedDescription) + } + + } + +} diff --git a/Tests/xml/YouTubeXMLFeed.xml b/Tests/xml/YouTubeXMLFeed.xml new file mode 100644 index 00000000..881fe031 --- /dev/null +++ b/Tests/xml/YouTubeXMLFeed.xml @@ -0,0 +1,611 @@ + + + + yt:channel: + + Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2005-06-22T05:12:23+00:00 + + yt:video:51QO4pavK3A + 51QO4pavK3A + UCE_M8A5yxnLfW0KghEeajjw + The first-ever MacBook Air 15” | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-06-12T16:16:57+00:00 + 2023-06-12T16:23:33+00:00 + + The first-ever MacBook Air 15” | Apple + + + Introducing the all-new MacBook Air with a 15-inch Liquid Retina display. Bigger than before, yet still impossibly light and thin. + +Supercharged by the M2 chip, the MacBook Air 15” has blazing fast performance, up to 18 hours of battery life (battery life varies by use), and 6 speakers that deliver immersive Spatial Audio. It also comes in 4 gorgeous colors - which one will you pick? + +Meet MacBook Air: https://apple.co/3P4JQpq + +Audio Descriptions: https://apple.co/3MW3tgr + +"Dream Big" by Rüü + Oliwa https://apple.co/RuuOliwa + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Apple’s more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:j1HGOY32s2Y + j1HGOY32s2Y + UCE_M8A5yxnLfW0KghEeajjw + What Apple developers need to know | WWDC23 | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-06-05T22:10:31+00:00 + 2023-06-08T20:56:03+00:00 + + What Apple developers need to know | WWDC23 | Apple + + + There’s never been a better time to create for Apple platforms –– including iOS, iPadOS, macOS, tvOS, and all-new visionOS. + +At https://developer.apple.com, get insights from Apple engineers and designers with over 175 brand-new instructional video sessions covering the latest in hardware and software. + +All to help bring your ideas to over two billion Apple devices worldwide. + +WWDC23 + +Watch the full WWDC23 keynote: https://apple.co/3OSsBaJ +Watch the Platforms State of the Union: https://apple.co/3CdbGbb +Audio Descriptions: https://apple.co/43InttY + +All-new Apple Developer Sessions + +Premiering June 6: + +What’s new in Swift with Ben: https://apple.co/3MQwrOW +Meet watchOS 10 with Taylor: https://apple.co/3CdygjW +Design and build apps for watchOS 10 with Jennifer and Matthew: https://apple.co/3oKlcj5 +Wind your way through advanced animations in SwiftUI with Tim: https://apple.co/43tqChp +Bring your game to Mac: Make a game plan with Aiswariya: https://apple.co/3WPWjPq +What’s new in Xcode 15 with Shilpa and Ryan: https://apple.co/3Nb0Fxt +Create rich documentation with Swift-DocC with Ethan: https://apple.co/3N9BaMV +Develop your first immersive app with Peter: https://apple.co/3WN5pfX +Meet Reality Composer Pro with Eric: https://apple.co/3CcYAux +Build spatial experiences with RealityKit with John: https://apple.co/3WN5yA1 + + +Premiering June 7: + +Build widgets for the Smart Stack on Apple Watch with Calvin: https://apple.co/43pdqdh +Bring widgets to life with Luca: https://apple.co/3oStt4j +Build programmatic UI with Xcode Previews with Kevin: https://apple.co/3CcK5qF + + +Premiering June 9: + +Animate with springs with Jacob: https://apple.co/42paGvd + + +New to coding? +Get started with Swift Playgrounds: https://apple.co/43KArrc + + +#AppleEvent #WWDC23 #AppleKeynote #iOS17 #AppleVisionPro + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Apple’s more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found + + + + + + + + yt:video:rc46cO3spSE + rc46cO3spSE + UCE_M8A5yxnLfW0KghEeajjw + WWDC23: 17 big & little things | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-06-05T19:40:53+00:00 + 2023-06-14T16:35:34+00:00 + + WWDC23: 17 big & little things | Apple + + + Here’s your guide to some of the big (and little) things announced on the first day of WWDC. Wait, what’s that? Apple’s annual Worldwide Developers Conference. + +Watch the full keynote here: https://apple.co/3OSsBaJ + +Audio Descriptions: https://apple.co/45OQndO + +“Adalam Va!” by Priya Ragu https://apple.co/PriyaRagu + +#AppleEvent #WWDC23 #AppleKeynote #iOS17 #AppleVisionPro + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Apple’s more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:0okuAwqTHs0 + 0okuAwqTHs0 + UCE_M8A5yxnLfW0KghEeajjw + Introducing MacBook Air 15” | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-06-05T19:20:40+00:00 + 2023-06-12T07:27:39+00:00 + + Introducing MacBook Air 15” | Apple + + + MacBook Air just got bigger. Now with a spacious 15-inch Liquid Retina display in a design that’s impossibly thin and light. And because it’s supercharged by M2, you get blazing-fast performance and up to 18 hours of battery life. Add to that six speakers with immersive Spatial Audio technology, a 1080p camera, and the seamless way it works with iPhone, and you get the 15-inch laptop we’ve all been waiting for. + +Learn More: https://apple.co/43FvGPt + +Audio Descriptions: https://apple.co/3OWpizl + +“One Touch” by BAMBII https://apple.co/BAMBII + +#WWDC23 #AppleEvent #MacBookAir15inch + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Apple’s more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:GYkq9Rgoj8E + GYkq9Rgoj8E + UCE_M8A5yxnLfW0KghEeajjw + WWDC 2023 — June 5 | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-06-05T19:15:08+00:00 + 2023-06-17T07:19:32+00:00 + + WWDC 2023 — June 5 | Apple + + + Watch the WWDC23 Apple Keynote announcing the latest Apple Vision Pro, MacBook Air 15", software, services, and operating systems. + +00:00:00 Introduction +00:03:09 Mac +00:16:49 iOS +00:34:34 iPadOS +00:43:14 macOS +00:57:02 Audio & Home +01:04:50 watchOS +01:20:48 Apple Vision Pro + +For more on the Apple Worldwide Developers Conference, click here: https://apple.co/3MU4PIM + +To watch the event interpreted in American Sign Language (ASL), please click here: https://apple.co/3WS5uir + +Audio Descriptions: https://apple.co/3qp5B90 + +“Spirals” by Nick Leng https://apple.co/NickLeng-WWDC23 +“Rocky” by Still Woozy https://apple.co/StillWoozy-WWDC23 +“Dream Big” by Rüü + Oliwa https://apple.co/RuuOliwa-WWDC23 +“Miami” by Mau y Ricky https://apple.co/MauYRicky-WWDC23 +“Times Square (feat. Aidan)” by Jam City https://apple.co/JamCity-WWDC23 +“The Only One” by Phoenix https://apple.co/Phoenix-WWDC23 +“Starlifter: Fearless Pt. II” by Crown Lands https://apple.co/CrownLands-WWDC23 +“BB’s Theme (Instrumental)” by Ludvig Forssell https://apple.co/LudvigForssell-WWDC23 +“Frisco” by Little Dragon https://apple.co/LittleDragon-WWDC23 +“Weightless” by Arlo Parks https://apple.co/ArloParks-WWDC23 +“Echolalia” by Yves Tumor https://apple.co/YvesTumor-WWDC23 +“Rhythm Is Our Business” by Snapped Ankles https://apple.co/SnappedAnkles-WWDC23 +“Can't Let You Go (feat. Little Jet)" by LP Giobbi https://apple.co/LPGiobbi-WWDC23 +“DAYS GO BY (feat. Toro y Moi)” by SBTRKT https://apple.co/SBTRKT-WWDC23 +“Let's Live” by FKJ https://apple.co/FKJ-WWDC23 +“Away X5” by Yaeji https://apple.co/Yaeji-WWDC23 +“Lambent Rag” by Clark https://apple.co/Clark-WWDC23 +“Walk Thru Water (feat. St. Panther)” by Overmono https://apple.co/Overmono-WWDC23 + +Want to keep enjoying the sounds of WWDC23? Check out the entire playlist on Apple Music. https://apple.co/WWDC23-Playlist + +#WWDC23 #AppleEvent #AppleVisionPro #MacBookAir15inch + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Apple’s more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:TX9qSaGXFyg + TX9qSaGXFyg + UCE_M8A5yxnLfW0KghEeajjw + Introducing Apple Vision Pro + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-06-05T19:08:16+00:00 + 2023-06-14T19:07:32+00:00 + + Introducing Apple Vision Pro + + + The era of spatial computing is here, where digital content blends seamlessly with your physical space. So you can do the things you love in ways never before possible. This is Apple Vision Pro. + +Learn More: https://apple.co/43DmFHf + +Audio Descriptions: https://apple.co/441jo4j + +00:00 Introduction +01:35 Photos and videos +02:41 Entertainment +03:38 Work +04:21 FaceTime +05:39 Design +07:09 Technology +08:45 Ending + +“Let's Live” by FKJ https://apple.co/FKJ +"Want Me Anyway" by Aye June https://apple.co/AyeJune +"Transmit" by Fyfe, Iskra Strings https://apple.co/FyfeIskraStrings +"New Horizon" by Little Dragon +"A.I." by Hark Madley https://apple.co/HarkMadley +"Waves" by StayLoose, Lucy Daydream https://apple.co/StaylooseLucyDaydream +"Free" by Bakar https://apple.co/Bakar + +#AppleVisionPro #WWDC23 #AppleEvent + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Our more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:4-7jSoINyq4 + 4-7jSoINyq4 + UCE_M8A5yxnLfW0KghEeajjw + Privacy on iPhone | The Waiting Room | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-05-24T14:00:24+00:00 + 2023-06-14T10:38:43+00:00 + + Privacy on iPhone | The Waiting Room | Apple + + + Worried your most personal data might get into the wrong hands? The Health app on iPhone helps you control who sees your health data—and who doesn’t. Because when it comes to your health, privacy matters. + +See how to keep your health data private: https://apple.co/3BBqv7h +Learn more about Privacy: https://apple.co/3Mh18fU + +Audio Descriptions: https://apple.co/41KMFhS + +“Knives Out!, Pt II (The Will)” by Nathan Johnson https://apple.co/3pWxS6M + +#Privacy #PrivacyOniPhone + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Our more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:0mqWw5UH1qg + 0mqWw5UH1qg + UCE_M8A5yxnLfW0KghEeajjw + Final Cut Pro & Logic Pro now on iPad | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-05-09T13:23:42+00:00 + 2023-06-11T12:51:07+00:00 + + Final Cut Pro & Logic Pro now on iPad | Apple + + + The power of a complete music studio and movie studio in your hands, wherever you are. Introducing Final Cut Pro and Logic Pro, built for iPad. Two new pro apps designed with the best features of iPad in mind: a Multi-Touch interface, the power of Apple silicon, and Apple Pencil. See these new apps in action in the hands of Take A Daytrip, Syd, BRTHR, and Ashley Xu. + +Learn more: +Final Cut Pro: https://apple.co/3HVvYct +Logic Pro: https://apple.co/3NQHhX8 + +Audio Descriptions: https://apple.co/42FWMp2 + +Music composed by Take A Daytrip and Syd. + +#Apple #FinalCutPro #LogicPro #iPad #iPadPro + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Apple’s more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:L5wx0Takylc + L5wx0Takylc + UCE_M8A5yxnLfW0KghEeajjw + Wherever you are, Apple Arcade is open | Parking Lot | Apple Arcade + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-05-04T13:05:50+00:00 + 2023-06-15T02:06:47+00:00 + + Wherever you are, Apple Arcade is open | Parking Lot | Apple Arcade + + + No matter the time, place, or situation, you’re just a tap away from the most fun place on your phone. Because wherever you are, Apple Arcade is open. + +Learn more about Apple Arcade: http://apple.co/AppleArcade + +Follow Apple Arcade on Twitter: https://twitter.com/AppleArcade + +Audio Descriptions: https://youtu.be/-XYQ2YN8zjA + +Let’s Play by Kullah https://apple.co/3AMwDJj + +#Apple #AppleArcade + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Our more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:fVW8-px4Ufw + fVW8-px4Ufw + UCE_M8A5yxnLfW0KghEeajjw + The new AirPods Pro | Quiet the noise | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-03-15T13:00:36+00:00 + 2023-06-09T21:27:41+00:00 + + The new AirPods Pro | Quiet the noise | Apple + + + The new AirPods Pro. Up to 2x more Active Noise Cancellation than the previous generation. + +Learn more: https://apple.co/3Lxom2E + +Audio Descriptions: https://apple.co/3MVm9P9 + +Where Is My Mind? by Tkay Maidza https://apple.co/42q7YXR + +#AirPodsPro #AirPods #Apple + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Our more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:1S8L7t2tu0U + 1S8L7t2tu0U + UCE_M8A5yxnLfW0KghEeajjw + iPhone 14 & iPhone 14 Plus | Hello Yellow | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-03-14T14:55:42+00:00 + 2023-06-13T10:00:33+00:00 + + iPhone 14 & iPhone 14 Plus | Hello Yellow | Apple + + + Say hello yellow to iPhone 14 and iPhone 14 Plus. + +Two great sizes. Larger than life battery life. A new front camera with autofocus. A more advanced dual-camera system for better photos. Action mode for extra smooth videos. The lightning-fast A15 Bionic chip. And two groundbreaking new safety features, Crash Detection and Emergency SOS via satellite. Everything you love about iPhone. Now in yellow. + +Learn more about iPhone 14 and iPhone 14 Plus: https://apple.co/3mrFyMj + +Audio Descriptions: https://apple.co/3Jkpuno + +“Le Banana Split" by Lio https://apple.co/Le-Banana-Split + +#iPhone14 #iPhone #iPhone14Plus + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Apple’s more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:svpvEfQ1cp8 + svpvEfQ1cp8 + UCE_M8A5yxnLfW0KghEeajjw + Shot on iPhone 14 Pro | Making of Vishal Bhardwaj’s Fursat | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-02-04T10:40:49+00:00 + 2023-06-12T07:06:17+00:00 + + Shot on iPhone 14 Pro | Making of Vishal Bhardwaj’s Fursat | Apple + + + Go behind the scenes with acclaimed filmmaker Vishal Bhardwaj and Director of Photography Swapnil Sonawane. See how iPhone 14 Pro helped craft the stunning visuals of "Fursat", a fast-paced, multi-genre musical. + +Listen to the album in Spatial Audio: https://apple.co/3JpUMLe + +Learn more about iPhone 14 Pro: https://apple.co/3jz5Jji + +Audio Descriptions: https://youtu.be/u4DHm2KyKYg + +#ShotoniPhone + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Our more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:f1VEks-QQ4Y + f1VEks-QQ4Y + UCE_M8A5yxnLfW0KghEeajjw + Shot on iPhone 14 Pro | Fursat – A Vishal Bhardwaj film | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-02-02T18:30:29+00:00 + 2023-06-08T08:32:59+00:00 + + Shot on iPhone 14 Pro | Fursat – A Vishal Bhardwaj film | Apple + + + Shot on iPhone 14 Pro by director Vishal Bhardwaj, "Fursat" is a magical story about a man so obsessed with controlling the future that he risks losing what he holds most precious in the present. + +Cast: Ishaan, Wamiqa Gabbi + +Listen to the album in Spatial Audio: https://apple.co/3JpUMLe + +Learn more about iPhone 14 Pro: https://apple.co/3YmhLvc + +Audio Descriptions: https://youtu.be/57ZD6ds4wXg + +#ShotoniPhone + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Our more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:1HWUjMjaBJI + 1HWUjMjaBJI + UCE_M8A5yxnLfW0KghEeajjw + Privacy on iPhone | A Day in the Life of an Average Person’s Data | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-01-24T16:00:01+00:00 + 2023-06-07T22:55:10+00:00 + + Privacy on iPhone | A Day in the Life of an Average Person’s Data | Apple + + + iPhone is designed with privacy built in. Follow Nick Mohammed through his “average” day to learn how data companies are trying to collect your personal information and how your iPhone can help protect you. + +Audio Descriptions: https://apple.co/3XXtD6M + +00:00 - Introduction +00:53 - Mail Privacy Protection +01:36 - Intelligent Tracking Prevention +2:30 - App Tracking Transparency +3:53 - Wallet & Apple Pay +4:54 - Ending + +Learn more at https://apple.co/3X62E8F + +Join a free session at your Apple Store to learn how to take control of your privacy on iPhone. Sign up now. https://apple.co/3jGKegl + +#Privacy #PrivacyOniPhone + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Apple’s more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + + yt:video:oMf_i1YBuMk + oMf_i1YBuMk + UCE_M8A5yxnLfW0KghEeajjw + Introducing the all-new HomePod | Apple + + + Apple + https://www.youtube.com/channel/UCE_M8A5yxnLfW0KghEeajjw + + 2023-01-18T14:44:48+00:00 + 2023-06-12T13:54:26+00:00 + + Introducing the all-new HomePod | Apple + + + A powerful, high-excursion woofer and beamforming tweeters create room-filling sound. HomePod senses its surroundings and automatically adapts audio for where it’s placed. Advanced computational audio, powered by Apple silicon, optimizes acoustic performance. Spatial Audio directs music with great precision, surrounding you in sound. It all comes together for the ultimate home audio experience. + +HomePod also works seamlessly with all your Apple devices. It comes with Siri built in and works as a smart home hub to connect and control your home, privately and securely. Available in Midnight and White. + +Audio Descriptions: https://apple.co/3RdWx02 + +“GMT (Jamie xx Remix)” by Oliver Sim and Jamie xx https://apple.co/GMT-Remix + +Learn more about HomePod: https://apple.co/3iPMmC7 + +#Apple #HomePod + +Spatial Audio works with compatible content in supported apps. +Music streaming services may require a subscription. +Smart home functionality requires a HomeKit- or Matter-enabled accessory. Smart home accessories sold separately. + +Welcome to the official Apple YouTube channel. Here you’ll find news about product launches, tutorials, and other great content. Apple’s more than 160,000 employees are dedicated to making the best products on earth, and to leaving the world better than we found it. + + + + + + + From 9349b7e4a594e20d4e4a0fd72f2d1e2c832fc5bd Mon Sep 17 00:00:00 2001 From: Naufal Fachrian Date: Sun, 18 Jun 2023 01:58:49 +0700 Subject: [PATCH 2/2] Update readme to add YouTube as supported namespace --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a952caca..905cddff 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ - [x] [Content](http://web.resource.org/rss/1.0/modules/content/) - [x] [Media RSS](http://www.rssboard.org/media-rss) - [x] [iTunes Podcasting Tags](https://help.apple.com/itc/podcasts_connect/#/itcb54353390) + - [x] [YouTube](https://developers.google.com/youtube/v3/guides/push_notifications) - [x] [Documentation](http://cocoadocs.org/docsets/FeedKit) - [x] Unit Test Coverage