Skip to main content

headless_engine/google/
endpoints.rs

1use url::Url;
2
3/// Helper to build URLs for various Google and YouTube multimodal capabilities
4pub struct GoogleEndpoints;
5
6impl GoogleEndpoints {
7    pub fn search(query: &str) -> String {
8        format!("https://www.google.com/search?q={}", urlencoding::encode(query))
9    }
10
11    pub fn web_search(query: &str) -> String {
12        format!("https://www.google.com/search?q={}&udm=14", urlencoding::encode(query))
13    }
14
15    pub fn image_search(query: &str) -> String {
16        format!("https://www.google.com/search?q={}&udm=2", urlencoding::encode(query))
17    }
18
19    pub fn video_search(query: &str) -> String {
20        format!("https://www.google.com/search?q={}&tbm=vid", urlencoding::encode(query))
21    }
22
23    pub fn short_video_search(query: &str) -> String {
24        format!("https://www.google.com/search?q={}+shorts&tbm=vid", urlencoding::encode(query))
25    }
26
27    pub fn news_search(query: &str) -> String {
28        format!("https://www.google.com/search?q={}&tbm=nws", urlencoding::encode(query))
29    }
30
31    pub fn forum_search(query: &str) -> String {
32        format!("https://www.google.com/search?q={}&udm=18", urlencoding::encode(query))
33    }
34
35    pub fn shopping_search(query: &str) -> String {
36        format!("https://www.google.com/search?q={}&tbm=shop", urlencoding::encode(query))
37    }
38
39    pub fn product_search(query: &str) -> String {
40        format!("https://www.google.com/search?q={}&tbm=shop", urlencoding::encode(query))
41    }
42
43    pub fn books_search(query: &str) -> String {
44        format!("https://www.google.com/search?q={}&tbm=bks", urlencoding::encode(query))
45    }
46
47    pub fn autocomplete(query: &str) -> String {
48        format!("https://suggestqueries.google.com/complete/search?client=chrome&q={}", urlencoding::encode(query))
49    }
50
51    pub fn ai_overview(query: &str) -> String {
52        format!("https://www.google.com/search?q={}", urlencoding::encode(query))
53    }
54
55    pub fn ai_mode(query: &str) -> String {
56        format!("https://www.google.com/search?q={}&udm=50", urlencoding::encode(query))
57    }
58
59    pub fn scholar_search(query: &str) -> String {
60        format!("https://scholar.google.com/scholar?q={}", urlencoding::encode(query))
61    }
62
63    pub fn patents_search(query: &str) -> String {
64        format!("https://patents.google.com/?q={}", urlencoding::encode(query))
65    }
66
67    pub fn maps_search(query: &str) -> String {
68        format!("https://www.google.com/maps/search/{}", urlencoding::encode(query))
69    }
70
71    pub fn finance_quote(ticker: &str) -> String {
72        format!("https://www.google.com/finance/quote/{}", urlencoding::encode(ticker))
73    }
74
75    pub fn trends_search(query: &str) -> String {
76        format!("https://trends.google.com/trends/explore?q={}", urlencoding::encode(query))
77    }
78
79    pub fn flights_search(origin: &str, dest: &str) -> String {
80        format!("https://www.google.com/travel/flights?q=Flights+from+{}+to+{}", urlencoding::encode(origin), urlencoding::encode(dest))
81    }
82
83    pub fn hotels_search(location: &str) -> String {
84        format!("https://www.google.com/travel/hotels/{}", urlencoding::encode(location))
85    }
86
87    pub fn travel_explore(destination: &str) -> String {
88        format!("https://www.google.com/travel/explore?q={}", urlencoding::encode(destination))
89    }
90
91    pub fn youtube_search(query: &str) -> String {
92        format!("https://www.youtube.com/results?search_query={}", urlencoding::encode(query))
93    }
94
95    pub fn youtube_shorts_search(query: &str) -> String {
96        format!("https://www.youtube.com/results?search_query={}&sp=mREBAgAL", urlencoding::encode(query))
97    }
98
99    pub fn youtube_video(video_id: &str) -> String {
100        if video_id.starts_with("http") {
101            video_id.to_string()
102        } else {
103            format!("https://www.youtube.com/watch?v={}", urlencoding::encode(video_id))
104        }
105    }
106
107    pub fn youtube_channel(channel: &str) -> String {
108        if channel.starts_with("http") {
109            channel.to_string()
110        } else if channel.starts_with('@') {
111            format!("https://www.youtube.com/{}", channel)
112        } else {
113            format!("https://www.youtube.com/channel/{}", urlencoding::encode(channel))
114        }
115    }
116
117    pub fn youtube_playlist(playlist_id: &str) -> String {
118        if playlist_id.starts_with("http") {
119            playlist_id.to_string()
120        } else {
121            format!("https://www.youtube.com/playlist?list={}", urlencoding::encode(playlist_id))
122        }
123    }
124
125    pub fn lens_visual_matches(image_url: &str) -> String {
126        format!("https://lens.google.com/uploadbyurl?url={}", urlencoding::encode(image_url))
127    }
128
129    pub fn lens_exact_matches(image_url: &str) -> String {
130        format!("https://lens.google.com/uploadbyurl?url={}", urlencoding::encode(image_url))
131    }
132
133    pub fn lens_products(image_url: &str) -> String {
134        format!("https://lens.google.com/uploadbyurl?url={}", urlencoding::encode(image_url))
135    }
136
137    pub fn lens_about_image(image_url: &str) -> String {
138        format!("https://lens.google.com/uploadbyurl?url={}", urlencoding::encode(image_url))
139    }
140}