@@ -81,6 +81,7 @@ enum MeetingServices: String, Codable, CaseIterable {
8181 case livekit = " LiveKit Meet "
8282 case meetecho = " Meetecho "
8383 case streamyard = " StreamYard "
84+ case riverside = " Riverside "
8485 case other = " Other "
8586
8687 var localizedValue : String {
@@ -256,6 +257,28 @@ func openMeetingURL(_ service: MeetingServices?, _ url: URL, _ browser: Browser?
256257 NSWorkspace . shared. open ( URL ( string: " facetime-audio:// " + url. absoluteString) !)
257258 case . phone:
258259 NSWorkspace . shared. open ( URL ( string: " tel:// " + url. absoluteString) !)
260+ case . riverside:
261+ let browser = browser ?? Defaults [ . riversideBrowser]
262+ if browser == riversideAppBrowser {
263+ // Try riversidefm:// scheme first
264+ var riversideAppURL = URLComponents ( url: url, resolvingAgainstBaseURL: false ) !
265+ riversideAppURL. scheme = " riversidefm "
266+ var result = riversideAppURL. url!. openInDefaultBrowser ( )
267+
268+ // If that fails, try riverside.fm:// scheme
269+ if !result {
270+ riversideAppURL. scheme = " riverside.fm "
271+ result = riversideAppURL. url!. openInDefaultBrowser ( )
272+ }
273+
274+ // If both app schemes fail, fall back to browser
275+ if !result {
276+ sendNotification ( " status_bar_error_app_link_title " . loco ( " Riverside " ) , " status_bar_error_app_link_message " . loco ( " Riverside " ) )
277+ url. openInDefaultBrowser ( )
278+ }
279+ } else {
280+ url. openIn ( browser: browser)
281+ }
259282 default :
260283 url. openIn ( browser: browser ?? Defaults [ . defaultBrowser] )
261284 }
@@ -297,7 +320,7 @@ private let meetingLinkRegexes: [MeetingServices: NSRegularExpression] = [
297320 . coscreen: try ! NSRegularExpression ( pattern: #"https?://join\.coscreen\.co/[^\s]*"# ) ,
298321 . vowel: try ! NSRegularExpression ( pattern: #"https?://([a-z0-9.]+)?vowel\.com/#/g/[^\s]*"# ) ,
299322 . zhumu: try ! NSRegularExpression ( pattern: #"https://welink\.zhumu\.com/j/[0-9]+?pwd=[a-zA-Z0-9]+"# ) ,
300- . lark: try ! NSRegularExpression ( pattern: #" https://vc\.larksuite\.com/j/[0-9]+"# ) ,
323+ . lark: try ! NSRegularExpression ( pattern: #"https://vc\.larksuite\.com/j/[0-9]+"# ) ,
301324 . feishu: try ! NSRegularExpression ( pattern: #"https://vc\.feishu\.cn/j/[0-9]+"# ) ,
302325 . vimeo: try ! NSRegularExpression ( pattern: #"https://vimeo\.com/(showcase|event)/[0-9]+|https://venues\.vimeo\.com/[^\s]+"# ) ,
303326 . ovice: try ! NSRegularExpression ( pattern: #"https://([a-z0-9-.]+)?ovice\.(in|com)/[^\s]*"# ) ,
@@ -328,7 +351,8 @@ private let meetingLinkRegexes: [MeetingServices: NSRegularExpression] = [
328351 . zmPage: try ! NSRegularExpression ( pattern: #"https?://([a-zA-Z0-9.]+)\.zm\.page"# ) ,
329352 . livekit: try ! NSRegularExpression ( pattern: #"https?://meet[a-zA-Z0-9.]*\.livekit\.io/rooms/[a-zA-Z0-9-#]+"# ) ,
330353 . meetecho: try ! NSRegularExpression ( pattern: #"https?://meetings\.conf\.meetecho\.com/.+"# ) ,
331- . streamyard: try ! NSRegularExpression ( pattern: #"https://(?:www\.)?streamyard\.com/(?:guest/)?([a-z0-9]{8,13})(?:/|\?[^ \n]*)?"# )
354+ . streamyard: try ! NSRegularExpression ( pattern: #"https://(?:www\.)?streamyard\.com/(?:guest/)?([a-z0-9]{8,13})(?:/|\?[^ \n]*)?"# ) ,
355+ . riverside: try ! NSRegularExpression ( pattern: #"https?://riverside\.(com|fm)/studio/[^\s]*"# )
332356]
333357
334358func regex( for service: MeetingServices ) -> NSRegularExpression ? {
@@ -628,6 +652,10 @@ func getIconForMeetingService(_ meetingService: MeetingServices?) -> NSImage {
628652 image = NSImage ( named: " streamyard_icon " ) !
629653 image. size = NSSize ( width: 16 , height: 16 )
630654
655+ case . some( . riverside) :
656+ image = NSImage ( named: " riverside_icon " ) !
657+ image. size = NSSize ( width: 16 , height: 16 )
658+
631659 // tested and verified
632660 case . none:
633661 image = NSImage ( named: " no_online_session " ) !
0 commit comments