summaryrefslogtreecommitdiff
path: root/src/invidious/routing.cr
blob: bd72c5770430cc0bd3348df504f2ef1aa2549913 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
module Invidious::Routing
  {% for http_method in {"get", "post", "delete", "options", "patch", "put", "head"} %}

    macro {{http_method.id}}(path, controller, method = :handle)
      {{http_method.id}} \{{ path }} do |env|
        \{{ controller }}.\{{ method.id }}(env)
      end
    end

  {% end %}
end

macro define_user_routes
  # User login/out
  Invidious::Routing.get "/login", Invidious::Routes::Login, :login_page
  Invidious::Routing.post "/login", Invidious::Routes::Login, :login
  Invidious::Routing.post "/signout", Invidious::Routes::Login, :signout
  Invidious::Routing.get "/Captcha", Invidious::Routes::Login, :captcha

  # User preferences
  Invidious::Routing.get "/preferences", Invidious::Routes::PreferencesRoute, :show
  Invidious::Routing.post "/preferences", Invidious::Routes::PreferencesRoute, :update
  Invidious::Routing.get "/toggle_theme", Invidious::Routes::PreferencesRoute, :toggle_theme
  Invidious::Routing.get "/data_control", Invidious::Routes::PreferencesRoute, :data_control
  Invidious::Routing.post "/data_control", Invidious::Routes::PreferencesRoute, :update_data_control

  # User account management
  Invidious::Routing.get "/change_password", Invidious::Routes::Account, :get_change_password
  Invidious::Routing.post "/change_password", Invidious::Routes::Account, :post_change_password
  Invidious::Routing.get "/delete_account", Invidious::Routes::Account, :get_delete
  Invidious::Routing.post "/delete_account", Invidious::Routes::Account, :post_delete
  Invidious::Routing.get "/clear_watch_history", Invidious::Routes::Account, :get_clear_history
  Invidious::Routing.post "/clear_watch_history", Invidious::Routes::Account, :post_clear_history
  Invidious::Routing.get "/authorize_token", Invidious::Routes::Account, :get_authorize_token
  Invidious::Routing.post "/authorize_token", Invidious::Routes::Account, :post_authorize_token
  Invidious::Routing.get "/token_manager", Invidious::Routes::Account, :token_manager
  Invidious::Routing.post "/token_ajax", Invidious::Routes::Account, :token_ajax
end

macro define_v1_api_routes
  {{namespace = Invidious::Routes::API::V1}}
  # Videos
  Invidious::Routing.get "/api/v1/videos/:id", {{namespace}}::Videos, :videos
  Invidious::Routing.get "/api/v1/storyboards/:id", {{namespace}}::Videos, :storyboards
  Invidious::Routing.get "/api/v1/captions/:id", {{namespace}}::Videos, :captions
  Invidious::Routing.get "/api/v1/annotations/:id", {{namespace}}::Videos, :annotations
  Invidious::Routing.get "/api/v1/comments/:id", {{namespace}}::Videos, :comments

  # Feeds
  Invidious::Routing.get "/api/v1/trending", {{namespace}}::Feeds, :trending
  Invidious::Routing.get "/api/v1/popular", {{namespace}}::Feeds, :popular

  # Channels
  Invidious::Routing.get "/api/v1/channels/:ucid", {{namespace}}::Channels, :home
  {% for route in {"videos", "latest", "playlists", "community", "search"} %}
    Invidious::Routing.get "/api/v1/channels/#{{{route}}}/:ucid", {{namespace}}::Channels, :{{route}}
    Invidious::Routing.get "/api/v1/channels/:ucid/#{{{route}}}", {{namespace}}::Channels, :{{route}}
  {% end %}

  # 301 redirects to new /api/v1/channels/community/:ucid and /:ucid/community
  Invidious::Routing.get "/api/v1/channels/comments/:ucid", {{namespace}}::Channels, :channel_comments_redirect
  Invidious::Routing.get "/api/v1/channels/:ucid/comments", {{namespace}}::Channels, :channel_comments_redirect


  # Search
  Invidious::Routing.get "/api/v1/search", {{namespace}}::Search, :search
  Invidious::Routing.get "/api/v1/search/suggestions", {{namespace}}::Search, :search_suggestions

  # Authenticated

  # The notification APIs cannot be extracted yet! They require the *local* notifications constant defined in invidious.cr
  #
  # Invidious::Routing.get "/api/v1/auth/notifications", {{namespace}}::Authenticated, :notifications
  # Invidious::Routing.post "/api/v1/auth/notifications", {{namespace}}::Authenticated, :notifications

  Invidious::Routing.get "/api/v1/auth/preferences", {{namespace}}::Authenticated, :get_preferences
  Invidious::Routing.post "/api/v1/auth/preferences", {{namespace}}::Authenticated, :set_preferences

  Invidious::Routing.get "/api/v1/auth/feed", {{namespace}}::Authenticated, :feed

  Invidious::Routing.get "/api/v1/auth/subscriptions", {{namespace}}::Authenticated, :get_subscriptions
  Invidious::Routing.post "/api/v1/auth/subscriptions/:ucid", {{namespace}}::Authenticated, :subscribe_channel
  Invidious::Routing.delete "/api/v1/auth/subscriptions/:ucid", {{namespace}}::Authenticated, :unsubscribe_channel


  Invidious::Routing.get "/api/v1/auth/playlists", {{namespace}}::Authenticated, :list_playlists
  Invidious::Routing.post "/api/v1/auth/playlists", {{namespace}}::Authenticated, :create_playlist
  Invidious::Routing.patch "/api/v1/auth/playlists/:plid",{{namespace}}:: Authenticated, :update_playlist_attribute
  Invidious::Routing.delete "/api/v1/auth/playlists/:plid", {{namespace}}::Authenticated, :delete_playlist


  Invidious::Routing.post "/api/v1/auth/playlists/:plid/videos", {{namespace}}::Authenticated, :insert_video_into_playlist
  Invidious::Routing.delete "/api/v1/auth/playlists/:plid/videos/:index", {{namespace}}::Authenticated, :delete_video_in_playlist

  Invidious::Routing.get "/api/v1/auth/tokens", {{namespace}}::Authenticated, :get_tokens
  Invidious::Routing.post "/api/v1/auth/tokens/register", {{namespace}}::Authenticated, :register_token
  Invidious::Routing.post "/api/v1/auth/tokens/unregister", {{namespace}}::Authenticated, :unregister_token

  Invidious::Routing.get "/api/v1/auth/notifications", {{namespace}}::Authenticated, :notifications
  Invidious::Routing.post "/api/v1/auth/notifications", {{namespace}}::Authenticated, :notifications

  # Misc
  Invidious::Routing.get "/api/v1/stats", {{namespace}}::Misc, :stats
  Invidious::Routing.get "/api/v1/playlists/:plid", {{namespace}}::Misc, :get_playlist
  Invidious::Routing.get "/api/v1/auth/playlists/:plid", {{namespace}}::Misc, :get_playlist
  Invidious::Routing.get "/api/v1/mixes/:rdid", {{namespace}}::Misc, :mixes
end

macro define_api_manifest_routes
  Invidious::Routing.get "/api/manifest/dash/id/:id", Invidious::Routes::API::Manifest, :get_dash_video_id

  Invidious::Routing.get "/api/manifest/dash/id/videoplayback", Invidious::Routes::API::Manifest, :get_dash_video_playback
  Invidious::Routing.get "/api/manifest/dash/id/videoplayback/*", Invidious::Routes::API::Manifest, :get_dash_video_playback_greedy

  Invidious::Routing.options "/api/manifest/dash/id/videoplayback", Invidious::Routes::API::Manifest, :options_dash_video_playback
  Invidious::Routing.options "/api/manifest/dash/id/videoplayback/*", Invidious::Routes::API::Manifest, :options_dash_video_playback

  Invidious::Routing.get "/api/manifest/hls_playlist/*", Invidious::Routes::API::Manifest, :get_hls_playlist
  Invidious::Routing.get "/api/manifest/hls_variant/*", Invidious::Routes::API::Manifest, :get_hls_variant
end

macro define_video_playback_routes
  Invidious::Routing.get "/videoplayback", Invidious::Routes::VideoPlayback, :get_video_playback
  Invidious::Routing.get "/videoplayback/*", Invidious::Routes::VideoPlayback, :get_video_playback_greedy

  Invidious::Routing.options "/videoplayback", Invidious::Routes::VideoPlayback, :options_video_playback
  Invidious::Routing.options "/videoplayback/*", Invidious::Routes::VideoPlayback, :options_video_playback

  Invidious::Routing.get "/latest_version", Invidious::Routes::VideoPlayback, :latest_version
end