tts_urls/
google_translate.rs1use 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
18pub 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
37pub 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}