tts_urls/
google_translate.rs

1use crate::ENCODE_SET;
2
3fn compute_checksum(term: &str) -> (u32, u32) {
4    let mut checksum: u32 = 429955;
5    for &byte in term.as_bytes() {
6        checksum = checksum.wrapping_add(byte as _);
7        checksum = checksum.wrapping_add(checksum << 10);
8        checksum ^= checksum >> 6;
9    }
10    checksum = checksum.wrapping_add(checksum << 3);
11    checksum ^= checksum >> 11;
12    checksum = checksum.wrapping_add(checksum << 15);
13    checksum ^= 3864579582;
14    checksum %= 1_000_000;
15    (checksum, checksum ^ 429955)
16}
17
18/// Returns the URL to the TTS audio for the given term and language.
19///
20/// # Examples
21///
22/// ```
23/// let url = tts_urls::google_translate::url("Hello, World!", "en");
24/// assert_eq!(url, "https://translate.google.com/translate_tts?ie=UTF-8&q=Hello%2C%20World%21&tl=en&tk=418730.60457&client=webapp");
25/// ```
26pub fn url(term: &str, language: &str) -> String {
27    let checksum = compute_checksum(term);
28    format!(
29        "https://translate.google.com/translate_tts?ie=UTF-8&q={}&tl={}&tk={}.{}&client=webapp",
30        percent_encoding::utf8_percent_encode(term, ENCODE_SET),
31        language,
32        checksum.0,
33        checksum.1
34    )
35}
36
37/// Returns the URL to the TTS audio for the given term, language and speed.
38///
39/// # Examples
40///
41/// ```
42/// let url = tts_urls::google_translate::url_with_speed("Hello, World!", "en", 0.24);
43/// assert_eq!(url, "https://translate.google.com/translate_tts?ie=UTF-8&q=Hello%2C%20World%21&tl=en&tk=418730.60457&client=webapp&ttsspeed=0.24");
44/// ```
45pub fn url_with_speed(term: &str, language: &str, speed: f32) -> String {
46    let checksum = compute_checksum(term);
47    format!(
48        "https://translate.google.com/translate_tts?ie=UTF-8&q={}&tl={}&tk={}.{}&client=webapp&ttsspeed={}",
49        percent_encoding::utf8_percent_encode(term, ENCODE_SET),
50        language,
51        checksum.0,
52        checksum.1,
53        speed
54    )
55}
56
57#[test]
58fn test1() {
59    assert_eq!(
60        url("Добрый день!", "ru"),
61        "https://translate.google.com/translate_tts?ie=UTF-8&q=%D0%94%D0%BE%D0%B1%D1%80%D1%8B%D0%B9%20%D0%B4%D0%B5%D0%BD%D1%8C%21&tl=ru&tk=33233.396882&client=webapp"
62    );
63}
64
65#[test]
66fn test2() {
67    assert_eq!(
68        url_with_speed("Добрый день!", "ru", 0.24),
69        "https://translate.google.com/translate_tts?ie=UTF-8&q=%D0%94%D0%BE%D0%B1%D1%80%D1%8B%D0%B9%20%D0%B4%D0%B5%D0%BD%D1%8C%21&tl=ru&tk=33233.396882&client=webapp&ttsspeed=0.24"
70    );
71}
72
73#[test]
74fn test3() {
75    assert_eq!(
76        url("\n&", "ru"),
77        "https://translate.google.com/translate_tts?ie=UTF-8&q=%0A%26&tl=ru&tk=589697.946178&client=webapp"
78    );
79}