invidious-copy-2022-08-14/src/invidious/helpers/utils.cr

2009 lines
37 KiB
Crystal
Raw Normal View History

2019-10-25 16:58:16 +00:00
require "pool/connection"
2019-10-25 22:02:33 +00:00
CHROME_VERSIONS = [
"68.0.3440.103",
"68.0.3440.104",
"68.0.3440.105",
"68.0.3440.106",
"68.0.3440.107",
"68.0.3440.108",
"68.0.3440.109",
"68.0.3440.110",
"68.0.3440.111",
"68.0.3440.112",
"68.0.3440.113",
"68.0.3440.114",
"68.0.3440.115",
"68.0.3440.116",
"68.0.3440.117",
"68.0.3440.118",
"68.0.3440.119",
"68.0.3440.120",
"68.0.3440.121",
"68.0.3440.122",
"68.0.3440.123",
"68.0.3440.124",
"68.0.3440.125",
"68.0.3440.126",
"68.0.3440.127",
"68.0.3440.128",
"68.0.3440.129",
"68.0.3440.130",
"68.0.3440.131",
"68.0.3440.132",
"68.0.3440.133",
"68.0.3440.134",
"69.0.3497.100",
"69.0.3497.101",
"69.0.3497.102",
"69.0.3497.103",
"69.0.3497.104",
"69.0.3497.105",
"69.0.3497.106",
"69.0.3497.107",
"69.0.3497.108",
"69.0.3497.109",
"69.0.3497.110",
"69.0.3497.111",
"69.0.3497.112",
"69.0.3497.113",
"69.0.3497.114",
"69.0.3497.115",
"69.0.3497.116",
"69.0.3497.117",
"69.0.3497.118",
"69.0.3497.119",
"69.0.3497.120",
"69.0.3497.121",
"69.0.3497.122",
"69.0.3497.123",
"69.0.3497.124",
"69.0.3497.125",
"69.0.3497.126",
"69.0.3497.127",
"69.0.3497.128",
"69.0.3497.28",
"69.0.3497.29",
"69.0.3497.30",
"69.0.3497.31",
"69.0.3497.32",
"69.0.3497.33",
"69.0.3497.34",
"69.0.3497.35",
"69.0.3497.36",
"69.0.3497.37",
"69.0.3497.38",
"69.0.3497.39",
"69.0.3497.40",
"69.0.3497.41",
"69.0.3497.42",
"69.0.3497.43",
"69.0.3497.44",
"69.0.3497.45",
"69.0.3497.46",
"69.0.3497.47",
"69.0.3497.48",
"69.0.3497.49",
"69.0.3497.50",
"69.0.3497.51",
"69.0.3497.52",
"69.0.3497.53",
"69.0.3497.54",
"69.0.3497.55",
"69.0.3497.56",
"69.0.3497.57",
"69.0.3497.58",
"69.0.3497.60",
"69.0.3497.64",
"69.0.3497.65",
"69.0.3497.66",
"69.0.3497.67",
"69.0.3497.68",
"69.0.3497.69",
"69.0.3497.70",
"69.0.3497.71",
"69.0.3497.72",
"69.0.3497.73",
"69.0.3497.74",
"69.0.3497.75",
"69.0.3497.76",
"69.0.3497.77",
"69.0.3497.78",
"69.0.3497.79",
"69.0.3497.80",
"69.0.3497.81",
"69.0.3497.82",
"69.0.3497.83",
"69.0.3497.84",
"69.0.3497.85",
"69.0.3497.86",
"69.0.3497.87",
"69.0.3497.88",
"69.0.3497.89",
"69.0.3497.90",
"69.0.3497.91",
"69.0.3497.92",
"69.0.3497.93",
"69.0.3497.94",
"69.0.3497.95",
"69.0.3497.96",
"69.0.3497.97",
"69.0.3497.98",
"69.0.3497.99",
"70.0.3505.6",
"70.0.3505.7",
"70.0.3505.8",
"70.0.3505.9",
"70.0.3513.0",
"70.0.3513.1",
"70.0.3514.0",
"70.0.3514.1",
"70.0.3514.2",
"70.0.3515.0",
"70.0.3515.1",
"70.0.3515.2",
"70.0.3515.3",
"70.0.3515.4",
"70.0.3516.0",
"70.0.3516.1",
"70.0.3516.2",
"70.0.3516.3",
"70.0.3517.0",
"70.0.3517.1",
"70.0.3518.0",
"70.0.3518.1",
"70.0.3519.0",
"70.0.3519.1",
"70.0.3519.2",
"70.0.3519.3",
"70.0.3520.0",
"70.0.3520.1",
"70.0.3521.0",
"70.0.3521.1",
"70.0.3521.2",
"70.0.3522.0",
"70.0.3522.1",
"70.0.3523.0",
"70.0.3523.1",
"70.0.3523.2",
"70.0.3524.0",
"70.0.3524.1",
"70.0.3524.2",
"70.0.3524.3",
"70.0.3524.4",
"70.0.3525.0",
"70.0.3525.1",
"70.0.3525.2",
"70.0.3525.3",
"70.0.3525.4",
"70.0.3525.5",
"70.0.3526.0",
"70.0.3526.1",
"70.0.3527.0",
"70.0.3527.1",
"70.0.3528.0",
"70.0.3528.1",
"70.0.3528.2",
"70.0.3528.3",
"70.0.3528.4",
"70.0.3529.0",
"70.0.3529.1",
"70.0.3529.2",
"70.0.3529.3",
"70.0.3530.0",
"70.0.3530.1",
"70.0.3530.2",
"70.0.3530.3",
"70.0.3530.4",
"70.0.3531.0",
"70.0.3532.0",
"70.0.3532.1",
"70.0.3532.2",
"70.0.3532.3",
"70.0.3532.4",
"70.0.3532.5",
"70.0.3532.6",
"70.0.3532.7",
"70.0.3532.8",
"70.0.3533.0",
"70.0.3533.1",
"70.0.3533.2",
"70.0.3534.0",
"70.0.3534.1",
"70.0.3534.2",
"70.0.3534.3",
"70.0.3534.4",
"70.0.3535.0",
"70.0.3535.1",
"70.0.3535.2",
"70.0.3535.3",
"70.0.3535.4",
"70.0.3535.5",
"70.0.3536.0",
"70.0.3537.0",
"70.0.3537.1",
"70.0.3537.2",
"70.0.3538.0",
"70.0.3538.1",
"70.0.3538.10",
"70.0.3538.100",
"70.0.3538.101",
"70.0.3538.102",
"70.0.3538.103",
"70.0.3538.104",
"70.0.3538.105",
"70.0.3538.106",
"70.0.3538.107",
"70.0.3538.108",
"70.0.3538.109",
"70.0.3538.11",
"70.0.3538.110",
"70.0.3538.111",
"70.0.3538.112",
"70.0.3538.113",
"70.0.3538.114",
"70.0.3538.115",
"70.0.3538.116",
"70.0.3538.117",
"70.0.3538.118",
"70.0.3538.119",
"70.0.3538.12",
"70.0.3538.120",
"70.0.3538.121",
"70.0.3538.122",
"70.0.3538.123",
"70.0.3538.124",
"70.0.3538.13",
"70.0.3538.14",
"70.0.3538.15",
"70.0.3538.16",
"70.0.3538.17",
"70.0.3538.18",
"70.0.3538.19",
"70.0.3538.2",
"70.0.3538.20",
"70.0.3538.21",
"70.0.3538.22",
"70.0.3538.23",
"70.0.3538.24",
"70.0.3538.25",
"70.0.3538.26",
"70.0.3538.27",
"70.0.3538.28",
"70.0.3538.29",
"70.0.3538.3",
"70.0.3538.30",
"70.0.3538.31",
"70.0.3538.32",
"70.0.3538.33",
"70.0.3538.34",
"70.0.3538.35",
"70.0.3538.36",
"70.0.3538.37",
"70.0.3538.38",
"70.0.3538.39",
"70.0.3538.4",
"70.0.3538.40",
"70.0.3538.41",
"70.0.3538.42",
"70.0.3538.43",
"70.0.3538.44",
"70.0.3538.45",
"70.0.3538.46",
"70.0.3538.47",
"70.0.3538.48",
"70.0.3538.49",
"70.0.3538.5",
"70.0.3538.50",
"70.0.3538.51",
"70.0.3538.52",
"70.0.3538.53",
"70.0.3538.54",
"70.0.3538.55",
"70.0.3538.56",
"70.0.3538.57",
"70.0.3538.58",
"70.0.3538.59",
"70.0.3538.6",
"70.0.3538.60",
"70.0.3538.61",
"70.0.3538.62",
"70.0.3538.63",
"70.0.3538.64",
"70.0.3538.65",
"70.0.3538.66",
"70.0.3538.67",
"70.0.3538.69",
"70.0.3538.7",
"70.0.3538.70",
"70.0.3538.71",
"70.0.3538.72",
"70.0.3538.73",
"70.0.3538.74",
"70.0.3538.75",
"70.0.3538.76",
"70.0.3538.77",
"70.0.3538.78",
"70.0.3538.79",
"70.0.3538.8",
"70.0.3538.80",
"70.0.3538.81",
"70.0.3538.82",
"70.0.3538.83",
"70.0.3538.84",
"70.0.3538.85",
"70.0.3538.86",
"70.0.3538.87",
"70.0.3538.9",
"70.0.3538.93",
"70.0.3538.94",
"70.0.3538.95",
"70.0.3538.96",
"70.0.3538.97",
"70.0.3538.98",
"70.0.3538.99",
"71.0.3539.0",
"71.0.3539.1",
"71.0.3540.0",
"71.0.3540.1",
"71.0.3541.0",
"71.0.3541.1",
"71.0.3542.0",
"71.0.3542.1",
"71.0.3542.2",
"71.0.3543.0",
"71.0.3543.1",
"71.0.3543.2",
"71.0.3543.3",
"71.0.3543.4",
"71.0.3544.0",
"71.0.3544.1",
"71.0.3544.2",
"71.0.3544.3",
"71.0.3544.4",
"71.0.3544.5",
"71.0.3545.0",
"71.0.3545.1",
"71.0.3545.2",
"71.0.3545.3",
"71.0.3545.4",
"71.0.3546.0",
"71.0.3546.1",
"71.0.3546.2",
"71.0.3547.0",
"71.0.3547.1",
"71.0.3548.0",
"71.0.3548.1",
"71.0.3549.0",
"71.0.3549.1",
"71.0.3550.0",
"71.0.3550.1",
"71.0.3550.2",
"71.0.3550.3",
"71.0.3551.0",
"71.0.3551.1",
"71.0.3551.2",
"71.0.3551.3",
"71.0.3552.0",
"71.0.3552.1",
"71.0.3552.2",
"71.0.3552.3",
"71.0.3552.4",
"71.0.3552.5",
"71.0.3552.6",
"71.0.3553.0",
"71.0.3553.1",
"71.0.3553.2",
"71.0.3553.3",
"71.0.3554.0",
"71.0.3554.1",
"71.0.3554.2",
"71.0.3554.3",
"71.0.3554.4",
"71.0.3555.0",
"71.0.3555.1",
"71.0.3555.2",
"71.0.3556.0",
"71.0.3556.1",
"71.0.3557.0",
"71.0.3557.1",
"71.0.3557.2",
"71.0.3558.0",
"71.0.3558.1",
"71.0.3558.2",
"71.0.3559.0",
"71.0.3559.1",
"71.0.3559.2",
"71.0.3559.3",
"71.0.3559.4",
"71.0.3559.5",
"71.0.3559.6",
"71.0.3560.0",
"71.0.3560.1",
"71.0.3561.0",
"71.0.3561.1",
"71.0.3562.0",
"71.0.3562.1",
"71.0.3562.2",
"71.0.3563.0",
"71.0.3564.0",
"71.0.3564.1",
"71.0.3565.0",
"71.0.3565.1",
"71.0.3566.0",
"71.0.3566.1",
"71.0.3567.0",
"71.0.3567.1",
"71.0.3568.0",
"71.0.3568.1",
"71.0.3568.2",
"71.0.3569.0",
"71.0.3569.1",
"71.0.3570.0",
"71.0.3570.1",
"71.0.3571.0",
"71.0.3571.1",
"71.0.3571.2",
"71.0.3572.0",
"71.0.3572.1",
"71.0.3573.0",
"71.0.3573.1",
"71.0.3574.0",
"71.0.3574.1",
"71.0.3575.0",
"71.0.3575.1",
"71.0.3575.2",
"71.0.3576.0",
"71.0.3576.1",
"71.0.3576.2",
"71.0.3577.0",
"71.0.3577.1",
"71.0.3578.0",
"71.0.3578.1",
"71.0.3578.10",
"71.0.3578.100",
"71.0.3578.101",
"71.0.3578.102",
"71.0.3578.103",
"71.0.3578.104",
"71.0.3578.105",
"71.0.3578.106",
"71.0.3578.107",
"71.0.3578.108",
"71.0.3578.109",
"71.0.3578.11",
"71.0.3578.110",
"71.0.3578.111",
"71.0.3578.112",
"71.0.3578.113",
"71.0.3578.114",
"71.0.3578.115",
"71.0.3578.116",
"71.0.3578.117",
"71.0.3578.118",
"71.0.3578.119",
"71.0.3578.12",
"71.0.3578.120",
"71.0.3578.121",
"71.0.3578.122",
"71.0.3578.123",
"71.0.3578.124",
"71.0.3578.125",
"71.0.3578.126",
"71.0.3578.127",
"71.0.3578.128",
"71.0.3578.129",
"71.0.3578.13",
"71.0.3578.130",
"71.0.3578.131",
"71.0.3578.132",
"71.0.3578.133",
"71.0.3578.134",
"71.0.3578.135",
"71.0.3578.136",
"71.0.3578.137",
"71.0.3578.138",
"71.0.3578.139",
"71.0.3578.14",
"71.0.3578.140",
"71.0.3578.141",
"71.0.3578.15",
"71.0.3578.16",
"71.0.3578.17",
"71.0.3578.18",
"71.0.3578.19",
"71.0.3578.2",
"71.0.3578.20",
"71.0.3578.21",
"71.0.3578.22",
"71.0.3578.23",
"71.0.3578.24",
"71.0.3578.25",
"71.0.3578.26",
"71.0.3578.27",
"71.0.3578.28",
"71.0.3578.29",
"71.0.3578.3",
"71.0.3578.30",
"71.0.3578.31",
"71.0.3578.32",
"71.0.3578.33",
"71.0.3578.34",
"71.0.3578.35",
"71.0.3578.36",
"71.0.3578.37",
"71.0.3578.38",
"71.0.3578.39",
"71.0.3578.4",
"71.0.3578.40",
"71.0.3578.41",
"71.0.3578.42",
"71.0.3578.43",
"71.0.3578.44",
"71.0.3578.45",
"71.0.3578.46",
"71.0.3578.47",
"71.0.3578.48",
"71.0.3578.49",
"71.0.3578.5",
"71.0.3578.50",
"71.0.3578.51",
"71.0.3578.52",
"71.0.3578.53",
"71.0.3578.54",
"71.0.3578.55",
"71.0.3578.56",
"71.0.3578.57",
"71.0.3578.58",
"71.0.3578.59",
"71.0.3578.6",
"71.0.3578.60",
"71.0.3578.61",
"71.0.3578.62",
"71.0.3578.63",
"71.0.3578.64",
"71.0.3578.65",
"71.0.3578.66",
"71.0.3578.67",
"71.0.3578.68",
"71.0.3578.69",
"71.0.3578.7",
"71.0.3578.70",
"71.0.3578.71",
"71.0.3578.72",
"71.0.3578.73",
"71.0.3578.74",
"71.0.3578.75",
"71.0.3578.76",
"71.0.3578.77",
"71.0.3578.78",
"71.0.3578.79",
"71.0.3578.8",
"71.0.3578.80",
"71.0.3578.81",
"71.0.3578.82",
"71.0.3578.83",
"71.0.3578.84",
"71.0.3578.85",
"71.0.3578.86",
"71.0.3578.87",
"71.0.3578.88",
"71.0.3578.89",
"71.0.3578.9",
"71.0.3578.90",
"71.0.3578.91",
"71.0.3578.92",
"71.0.3578.93",
"71.0.3578.94",
"71.0.3578.95",
"71.0.3578.96",
"71.0.3578.97",
"71.0.3578.98",
"71.0.3578.99",
"72.0.3579.0",
"72.0.3579.1",
"72.0.3580.0",
"72.0.3580.1",
"72.0.3581.0",
"72.0.3581.1",
"72.0.3581.2",
"72.0.3581.3",
"72.0.3581.4",
"72.0.3582.0",
"72.0.3583.0",
"72.0.3583.1",
"72.0.3583.2",
"72.0.3584.0",
"72.0.3584.1",
"72.0.3585.0",
"72.0.3585.1",
"72.0.3586.0",
"72.0.3586.1",
"72.0.3586.2",
"72.0.3587.0",
"72.0.3588.0",
"72.0.3588.1",
"72.0.3589.0",
"72.0.3589.1",
"72.0.3589.2",
"72.0.3589.3",
"72.0.3590.0",
"72.0.3590.1",
"72.0.3591.0",
"72.0.3591.1",
"72.0.3591.2",
"72.0.3591.3",
"72.0.3592.0",
"72.0.3592.1",
"72.0.3592.2",
"72.0.3593.0",
"72.0.3593.1",
"72.0.3593.2",
"72.0.3594.0",
"72.0.3594.1",
"72.0.3595.0",
"72.0.3595.1",
"72.0.3595.2",
"72.0.3596.0",
"72.0.3596.1",
"72.0.3596.2",
"72.0.3597.0",
"72.0.3597.1",
"72.0.3598.0",
"72.0.3598.1",
"72.0.3599.0",
"72.0.3599.1",
"72.0.3599.2",
"72.0.3599.3",
"72.0.3600.0",
"72.0.3600.1",
"72.0.3601.0",
"72.0.3601.1",
"72.0.3602.0",
"72.0.3602.1",
"72.0.3602.2",
"72.0.3602.3",
"72.0.3603.0",
"72.0.3603.1",
"72.0.3603.2",
"72.0.3604.0",
"72.0.3604.1",
"72.0.3605.0",
"72.0.3605.1",
"72.0.3605.2",
"72.0.3605.3",
"72.0.3606.0",
"72.0.3606.1",
"72.0.3606.2",
"72.0.3607.0",
"72.0.3607.1",
"72.0.3608.0",
"72.0.3608.1",
"72.0.3608.2",
"72.0.3608.3",
"72.0.3608.4",
"72.0.3608.5",
"72.0.3609.0",
"72.0.3609.1",
"72.0.3609.2",
"72.0.3609.3",
"72.0.3610.0",
"72.0.3610.1",
"72.0.3610.2",
"72.0.3610.3",
"72.0.3610.4",
"72.0.3611.0",
"72.0.3611.1",
"72.0.3611.2",
"72.0.3612.0",
"72.0.3612.1",
"72.0.3612.2",
"72.0.3613.0",
"72.0.3613.1",
"72.0.3614.0",
"72.0.3614.1",
"72.0.3615.0",
"72.0.3615.1",
"72.0.3616.0",
"72.0.3616.1",
"72.0.3617.0",
"72.0.3617.1",
"72.0.3618.0",
"72.0.3618.1",
"72.0.3619.0",
"72.0.3619.1",
"72.0.3620.0",
"72.0.3620.1",
"72.0.3621.0",
"72.0.3621.1",
"72.0.3622.0",
"72.0.3622.1",
"72.0.3622.2",
"72.0.3622.3",
"72.0.3623.0",
"72.0.3623.1",
"72.0.3623.2",
"72.0.3623.3",
"72.0.3623.4",
"72.0.3624.0",
"72.0.3624.1",
"72.0.3624.2",
"72.0.3624.3",
"72.0.3624.4",
"72.0.3625.0",
"72.0.3625.1",
"72.0.3625.2",
"72.0.3626.0",
"72.0.3626.1",
"72.0.3626.10",
"72.0.3626.100",
"72.0.3626.101",
"72.0.3626.102",
"72.0.3626.103",
"72.0.3626.105",
"72.0.3626.107",
"72.0.3626.108",
"72.0.3626.109",
"72.0.3626.11",
"72.0.3626.110",
"72.0.3626.111",
"72.0.3626.112",
"72.0.3626.113",
"72.0.3626.114",
"72.0.3626.115",
"72.0.3626.116",
"72.0.3626.117",
"72.0.3626.118",
"72.0.3626.119",
"72.0.3626.12",
"72.0.3626.120",
"72.0.3626.121",
"72.0.3626.122",
"72.0.3626.13",
"72.0.3626.14",
"72.0.3626.15",
"72.0.3626.16",
"72.0.3626.17",
"72.0.3626.18",
"72.0.3626.19",
"72.0.3626.2",
"72.0.3626.20",
"72.0.3626.21",
"72.0.3626.22",
"72.0.3626.23",
"72.0.3626.24",
"72.0.3626.25",
"72.0.3626.26",
"72.0.3626.27",
"72.0.3626.28",
"72.0.3626.29",
"72.0.3626.3",
"72.0.3626.30",
"72.0.3626.31",
"72.0.3626.32",
"72.0.3626.33",
"72.0.3626.34",
"72.0.3626.35",
"72.0.3626.36",
"72.0.3626.37",
"72.0.3626.38",
"72.0.3626.39",
"72.0.3626.4",
"72.0.3626.40",
"72.0.3626.41",
"72.0.3626.42",
"72.0.3626.43",
"72.0.3626.44",
"72.0.3626.45",
"72.0.3626.46",
"72.0.3626.47",
"72.0.3626.48",
"72.0.3626.49",
"72.0.3626.5",
"72.0.3626.50",
"72.0.3626.51",
"72.0.3626.52",
"72.0.3626.53",
"72.0.3626.54",
"72.0.3626.55",
"72.0.3626.56",
"72.0.3626.57",
"72.0.3626.58",
"72.0.3626.59",
"72.0.3626.6",
"72.0.3626.60",
"72.0.3626.61",
"72.0.3626.62",
"72.0.3626.63",
"72.0.3626.64",
"72.0.3626.65",
"72.0.3626.66",
"72.0.3626.67",
"72.0.3626.68",
"72.0.3626.69",
"72.0.3626.7",
"72.0.3626.70",
"72.0.3626.71",
"72.0.3626.72",
"72.0.3626.73",
"72.0.3626.74",
"72.0.3626.75",
"72.0.3626.76",
"72.0.3626.77",
"72.0.3626.78",
"72.0.3626.79",
"72.0.3626.8",
"72.0.3626.80",
"72.0.3626.81",
"72.0.3626.82",
"72.0.3626.83",
"72.0.3626.84",
"72.0.3626.85",
"72.0.3626.86",
"72.0.3626.87",
"72.0.3626.88",
"72.0.3626.89",
"72.0.3626.9",
"72.0.3626.90",
"72.0.3626.91",
"72.0.3626.92",
"72.0.3626.93",
"72.0.3626.94",
"72.0.3626.95",
"72.0.3626.96",
"72.0.3626.97",
"72.0.3626.98",
"72.0.3626.99",
"73.0.3627.0",
"73.0.3627.1",
"73.0.3628.0",
"73.0.3628.1",
"73.0.3628.2",
"73.0.3628.3",
"73.0.3629.0",
"73.0.3629.1",
"73.0.3630.0",
"73.0.3630.1",
"73.0.3631.0",
"73.0.3631.1",
"73.0.3631.2",
"73.0.3632.0",
"73.0.3632.1",
"73.0.3632.2",
"73.0.3632.3",
"73.0.3632.4",
"73.0.3632.5",
"73.0.3633.0",
"73.0.3633.1",
"73.0.3633.2",
"73.0.3634.0",
"73.0.3634.1",
"73.0.3634.2",
"73.0.3635.0",
"73.0.3635.1",
"73.0.3635.2",
"73.0.3635.3",
"73.0.3636.0",
"73.0.3636.1",
"73.0.3636.2",
"73.0.3637.0",
"73.0.3637.1",
"73.0.3638.0",
"73.0.3638.1",
"73.0.3638.2",
"73.0.3639.0",
"73.0.3639.1",
"73.0.3640.0",
"73.0.3640.1",
"73.0.3641.0",
"73.0.3641.1",
"73.0.3642.0",
"73.0.3642.1",
"73.0.3643.0",
"73.0.3643.1",
"73.0.3643.2",
"73.0.3644.0",
"73.0.3645.0",
"73.0.3645.1",
"73.0.3645.2",
"73.0.3646.0",
"73.0.3646.1",
"73.0.3646.2",
"73.0.3647.0",
"73.0.3647.1",
"73.0.3647.2",
"73.0.3648.0",
"73.0.3648.1",
"73.0.3648.2",
"73.0.3649.0",
"73.0.3649.1",
"73.0.3650.0",
"73.0.3650.1",
"73.0.3651.0",
"73.0.3651.1",
"73.0.3652.0",
"73.0.3652.1",
"73.0.3653.0",
"73.0.3653.1",
"73.0.3654.0",
"73.0.3654.1",
"73.0.3655.0",
"73.0.3655.1",
"73.0.3656.0",
"73.0.3656.1",
"73.0.3657.0",
"73.0.3657.1",
"73.0.3658.0",
"73.0.3658.1",
"73.0.3659.0",
"73.0.3659.1",
"73.0.3660.0",
"73.0.3660.1",
"73.0.3660.2",
"73.0.3661.0",
"73.0.3661.1",
"73.0.3662.0",
"73.0.3662.1",
"73.0.3663.0",
"73.0.3663.1",
"73.0.3663.2",
"73.0.3664.0",
"73.0.3664.1",
"73.0.3664.2",
"73.0.3664.3",
"73.0.3664.4",
"73.0.3665.0",
"73.0.3665.1",
"73.0.3665.2",
"73.0.3665.3",
"73.0.3665.4",
"73.0.3666.0",
"73.0.3666.1",
"73.0.3667.0",
"73.0.3667.1",
"73.0.3667.2",
"73.0.3668.0",
"73.0.3668.1",
"73.0.3668.2",
"73.0.3669.0",
"73.0.3669.1",
"73.0.3670.0",
"73.0.3670.1",
"73.0.3671.0",
"73.0.3671.1",
"73.0.3671.2",
"73.0.3671.3",
"73.0.3672.0",
"73.0.3672.1",
"73.0.3673.0",
"73.0.3673.1",
"73.0.3673.2",
"73.0.3674.0",
"73.0.3674.1",
"73.0.3674.2",
"73.0.3676.0",
"73.0.3676.1",
"73.0.3677.0",
"73.0.3677.1",
"73.0.3678.0",
"73.0.3678.1",
"73.0.3678.2",
"73.0.3679.0",
"73.0.3679.1",
"73.0.3680.0",
"73.0.3680.1",
"73.0.3681.0",
"73.0.3681.1",
"73.0.3681.2",
"73.0.3681.3",
"73.0.3681.4",
"73.0.3682.0",
"73.0.3682.1",
"73.0.3683.0",
"73.0.3683.1",
"73.0.3683.10",
"73.0.3683.100",
"73.0.3683.101",
"73.0.3683.102",
"73.0.3683.103",
"73.0.3683.104",
"73.0.3683.105",
"73.0.3683.106",
"73.0.3683.107",
"73.0.3683.108",
"73.0.3683.109",
"73.0.3683.11",
"73.0.3683.110",
"73.0.3683.111",
"73.0.3683.112",
"73.0.3683.113",
"73.0.3683.114",
"73.0.3683.115",
"73.0.3683.116",
"73.0.3683.117",
"73.0.3683.118",
"73.0.3683.119",
"73.0.3683.12",
"73.0.3683.120",
"73.0.3683.121",
"73.0.3683.13",
"73.0.3683.14",
"73.0.3683.15",
"73.0.3683.16",
"73.0.3683.17",
"73.0.3683.18",
"73.0.3683.19",
"73.0.3683.2",
"73.0.3683.20",
"73.0.3683.21",
"73.0.3683.22",
"73.0.3683.23",
"73.0.3683.24",
"73.0.3683.25",
"73.0.3683.26",
"73.0.3683.27",
"73.0.3683.28",
"73.0.3683.29",
"73.0.3683.3",
"73.0.3683.31",
"73.0.3683.32",
"73.0.3683.33",
"73.0.3683.34",
"73.0.3683.35",
"73.0.3683.36",
"73.0.3683.37",
"73.0.3683.38",
"73.0.3683.39",
"73.0.3683.4",
"73.0.3683.40",
"73.0.3683.41",
"73.0.3683.42",
"73.0.3683.43",
"73.0.3683.44",
"73.0.3683.45",
"73.0.3683.46",
"73.0.3683.47",
"73.0.3683.48",
"73.0.3683.49",
"73.0.3683.5",
"73.0.3683.50",
"73.0.3683.51",
"73.0.3683.52",
"73.0.3683.53",
"73.0.3683.54",
"73.0.3683.55",
"73.0.3683.56",
"73.0.3683.57",
"73.0.3683.58",
"73.0.3683.59",
"73.0.3683.6",
"73.0.3683.60",
"73.0.3683.61",
"73.0.3683.62",
"73.0.3683.63",
"73.0.3683.64",
"73.0.3683.65",
"73.0.3683.66",
"73.0.3683.67",
"73.0.3683.68",
"73.0.3683.69",
"73.0.3683.7",
"73.0.3683.70",
"73.0.3683.71",
"73.0.3683.72",
"73.0.3683.73",
"73.0.3683.74",
"73.0.3683.75",
"73.0.3683.76",
"73.0.3683.77",
"73.0.3683.78",
"73.0.3683.79",
"73.0.3683.8",
"73.0.3683.80",
"73.0.3683.81",
"73.0.3683.82",
"73.0.3683.83",
"73.0.3683.84",
"73.0.3683.85",
"73.0.3683.86",
"73.0.3683.87",
"73.0.3683.88",
"73.0.3683.89",
"73.0.3683.9",
"73.0.3683.90",
"73.0.3683.91",
"73.0.3683.92",
"73.0.3683.93",
"73.0.3683.94",
"73.0.3683.95",
"73.0.3683.96",
"73.0.3683.97",
"73.0.3683.98",
"73.0.3683.99",
"74.0.3684.0",
"74.0.3684.1",
"74.0.3685.0",
"74.0.3685.1",
"74.0.3686.0",
"74.0.3686.1",
"74.0.3686.2",
"74.0.3686.3",
"74.0.3686.4",
"74.0.3687.0",
"74.0.3687.1",
"74.0.3687.2",
"74.0.3687.3",
"74.0.3688.0",
"74.0.3688.1",
"74.0.3689.0",
"74.0.3689.1",
"74.0.3690.0",
"74.0.3690.1",
"74.0.3691.0",
"74.0.3691.1",
"74.0.3692.0",
"74.0.3692.1",
"74.0.3693.0",
"74.0.3693.1",
"74.0.3693.2",
"74.0.3693.3",
"74.0.3693.4",
"74.0.3693.5",
"74.0.3693.6",
"74.0.3694.0",
"74.0.3694.1",
"74.0.3694.2",
"74.0.3694.3",
"74.0.3694.4",
"74.0.3694.5",
"74.0.3694.6",
"74.0.3694.7",
"74.0.3694.8",
"74.0.3696.0",
"74.0.3696.1",
"74.0.3696.2",
"74.0.3698.0",
"74.0.3699.0",
"74.0.3699.1",
"74.0.3699.2",
"74.0.3699.3",
"74.0.3700.0",
"74.0.3700.1",
"74.0.3701.0",
"74.0.3701.1",
"74.0.3702.0",
"74.0.3702.1",
"74.0.3702.2",
"74.0.3702.3",
"74.0.3703.0",
"74.0.3703.1",
"74.0.3703.2",
"74.0.3703.3",
"74.0.3704.0",
"74.0.3704.1",
"74.0.3704.2",
"74.0.3704.3",
"74.0.3704.4",
"74.0.3704.5",
"74.0.3704.6",
"74.0.3704.7",
"74.0.3704.8",
"74.0.3704.9",
"74.0.3705.0",
"74.0.3705.1",
"74.0.3706.0",
"74.0.3706.1",
"74.0.3706.2",
"74.0.3706.3",
"74.0.3706.4",
"74.0.3706.5",
"74.0.3706.6",
"74.0.3706.7",
"74.0.3708.0",
"74.0.3709.0",
"74.0.3709.1",
"74.0.3710.0",
"74.0.3710.1",
"74.0.3710.2",
"74.0.3711.0",
"74.0.3711.1",
"74.0.3711.2",
"74.0.3712.0",
"74.0.3712.1",
"74.0.3712.2",
"74.0.3713.0",
"74.0.3713.1",
"74.0.3713.3",
"74.0.3714.0",
"74.0.3714.1",
"74.0.3714.2",
"74.0.3715.0",
"74.0.3715.1",
"74.0.3716.0",
"74.0.3716.1",
"74.0.3717.0",
"74.0.3717.1",
"74.0.3717.2",
"74.0.3718.0",
"74.0.3718.1",
"74.0.3718.2",
"74.0.3718.3",
"74.0.3718.4",
"74.0.3718.5",
"74.0.3718.6",
"74.0.3718.7",
"74.0.3718.8",
"74.0.3718.9",
"74.0.3719.0",
"74.0.3719.1",
"74.0.3719.2",
"74.0.3719.3",
"74.0.3719.4",
"74.0.3719.5",
"74.0.3720.0",
"74.0.3720.1",
"74.0.3720.2",
"74.0.3720.3",
"74.0.3720.4",
"74.0.3720.5",
"74.0.3720.6",
"74.0.3721.0",
"74.0.3721.1",
"74.0.3721.2",
"74.0.3721.3",
"74.0.3722.0",
"74.0.3722.1",
"74.0.3723.0",
"74.0.3723.1",
"74.0.3724.0",
"74.0.3724.1",
"74.0.3724.2",
"74.0.3724.3",
"74.0.3724.4",
"74.0.3724.5",
"74.0.3724.6",
"74.0.3724.7",
"74.0.3724.8",
"74.0.3725.0",
"74.0.3725.1",
"74.0.3725.2",
"74.0.3725.3",
"74.0.3725.4",
"74.0.3726.0",
"74.0.3726.1",
"74.0.3726.2",
"74.0.3726.3",
"74.0.3726.4",
"74.0.3728.0",
"74.0.3729.0",
"74.0.3729.1",
"74.0.3729.10",
"74.0.3729.100",
"74.0.3729.101",
"74.0.3729.102",
"74.0.3729.103",
"74.0.3729.104",
"74.0.3729.105",
"74.0.3729.106",
"74.0.3729.107",
"74.0.3729.108",
"74.0.3729.109",
"74.0.3729.11",
"74.0.3729.110",
"74.0.3729.111",
"74.0.3729.112",
"74.0.3729.113",
"74.0.3729.114",
"74.0.3729.115",
"74.0.3729.116",
"74.0.3729.117",
"74.0.3729.118",
"74.0.3729.119",
"74.0.3729.12",
"74.0.3729.120",
"74.0.3729.121",
"74.0.3729.122",
"74.0.3729.123",
"74.0.3729.124",
"74.0.3729.125",
"74.0.3729.126",
"74.0.3729.127",
"74.0.3729.128",
"74.0.3729.129",
"74.0.3729.13",
"74.0.3729.14",
"74.0.3729.15",
"74.0.3729.16",
"74.0.3729.17",
"74.0.3729.18",
"74.0.3729.19",
"74.0.3729.2",
"74.0.3729.20",
"74.0.3729.21",
"74.0.3729.22",
"74.0.3729.23",
"74.0.3729.24",
"74.0.3729.25",
"74.0.3729.26",
"74.0.3729.27",
"74.0.3729.28",
"74.0.3729.29",
"74.0.3729.3",
"74.0.3729.30",
"74.0.3729.31",
"74.0.3729.32",
"74.0.3729.33",
"74.0.3729.34",
"74.0.3729.35",
"74.0.3729.36",
"74.0.3729.37",
"74.0.3729.38",
"74.0.3729.39",
"74.0.3729.4",
"74.0.3729.40",
"74.0.3729.41",
"74.0.3729.42",
"74.0.3729.43",
"74.0.3729.44",
"74.0.3729.45",
"74.0.3729.46",
"74.0.3729.47",
"74.0.3729.48",
"74.0.3729.49",
"74.0.3729.5",
"74.0.3729.50",
"74.0.3729.51",
"74.0.3729.52",
"74.0.3729.53",
"74.0.3729.54",
"74.0.3729.55",
"74.0.3729.56",
"74.0.3729.57",
"74.0.3729.58",
"74.0.3729.59",
"74.0.3729.6",
"74.0.3729.60",
"74.0.3729.61",
"74.0.3729.62",
"74.0.3729.63",
"74.0.3729.64",
"74.0.3729.65",
"74.0.3729.66",
"74.0.3729.67",
"74.0.3729.68",
"74.0.3729.69",
"74.0.3729.7",
"74.0.3729.70",
"74.0.3729.71",
"74.0.3729.72",
"74.0.3729.73",
"74.0.3729.74",
"74.0.3729.75",
"74.0.3729.76",
"74.0.3729.77",
"74.0.3729.78",
"74.0.3729.79",
"74.0.3729.8",
"74.0.3729.80",
"74.0.3729.81",
"74.0.3729.82",
"74.0.3729.83",
"74.0.3729.84",
"74.0.3729.85",
"74.0.3729.86",
"74.0.3729.87",
"74.0.3729.88",
"74.0.3729.89",
"74.0.3729.9",
"74.0.3729.90",
"74.0.3729.91",
"74.0.3729.92",
"74.0.3729.93",
"74.0.3729.94",
"74.0.3729.95",
"74.0.3729.96",
"74.0.3729.97",
"74.0.3729.98",
"74.0.3729.99",
"75.0.3730.0",
"75.0.3730.1",
"75.0.3730.2",
"75.0.3730.3",
"75.0.3730.4",
"75.0.3730.5",
"75.0.3731.0",
"75.0.3731.2",
"75.0.3731.3",
"75.0.3732.0",
"75.0.3732.1",
"75.0.3733.0",
"75.0.3733.1",
"75.0.3734.0",
"75.0.3734.1",
"75.0.3735.0",
"75.0.3735.1",
"75.0.3736.0",
"75.0.3736.1",
"75.0.3737.0",
"75.0.3737.1",
"75.0.3738.0",
"75.0.3738.1",
"75.0.3738.2",
"75.0.3738.3",
"75.0.3738.4",
"75.0.3739.0",
"75.0.3739.1",
"75.0.3740.0",
"75.0.3740.1",
"75.0.3740.2",
"75.0.3740.3",
"75.0.3740.4",
"75.0.3740.5",
"75.0.3741.0",
"75.0.3741.1",
"75.0.3741.2",
"75.0.3744.0",
"75.0.3744.1",
"75.0.3744.2",
"75.0.3745.0",
"75.0.3745.1",
"75.0.3745.2",
"75.0.3745.3",
"75.0.3745.4",
"75.0.3745.5",
"75.0.3746.0",
"75.0.3746.1",
"75.0.3746.2",
"75.0.3746.3",
"75.0.3746.4",
"75.0.3747.0",
"75.0.3747.1",
"75.0.3748.0",
"75.0.3748.1",
"75.0.3749.0",
"75.0.3749.1",
"75.0.3749.2",
"75.0.3749.3",
"75.0.3750.0",
"75.0.3751.0",
"75.0.3751.1",
"75.0.3752.0",
"75.0.3752.1",
"75.0.3752.2",
"75.0.3753.0",
"75.0.3753.1",
"75.0.3753.2",
"75.0.3753.3",
"75.0.3753.4",
"75.0.3754.0",
"75.0.3754.1",
"75.0.3754.2",
"75.0.3755.0",
"75.0.3755.1",
"75.0.3755.2",
"75.0.3755.3",
"75.0.3756.0",
"75.0.3756.1",
"75.0.3757.0",
"75.0.3757.1",
"75.0.3758.0",
"75.0.3758.1",
"75.0.3759.0",
"75.0.3759.1",
"75.0.3759.2",
"75.0.3759.3",
"75.0.3759.4",
"75.0.3759.5",
"75.0.3759.6",
"75.0.3759.7",
"75.0.3759.8",
"75.0.3760.0",
"75.0.3761.0",
"75.0.3761.1",
"75.0.3761.2",
"75.0.3761.3",
"75.0.3761.4",
"75.0.3762.0",
"75.0.3762.1",
"75.0.3763.0",
"75.0.3763.1",
"75.0.3763.2",
"75.0.3764.0",
"75.0.3764.1",
"75.0.3765.0",
"75.0.3765.1",
"75.0.3766.0",
"75.0.3766.1",
"75.0.3766.2",
"75.0.3766.3",
"75.0.3767.0",
"75.0.3767.1",
"75.0.3767.2",
"75.0.3768.0",
"75.0.3768.1",
"75.0.3768.2",
"75.0.3768.3",
"75.0.3768.4",
"75.0.3768.5",
"75.0.3768.6",
"75.0.3769.0",
"75.0.3769.1",
"75.0.3769.2",
"75.0.3769.3",
"75.0.3769.4",
"75.0.3769.5",
"75.0.3770.0",
"75.0.3770.1",
"75.0.3770.10",
"75.0.3770.11",
"75.0.3770.12",
"75.0.3770.13",
"75.0.3770.14",
"75.0.3770.15",
"75.0.3770.2",
"75.0.3770.3",
"75.0.3770.4",
"75.0.3770.5",
"75.0.3770.6",
"75.0.3770.7",
"75.0.3770.8",
"75.0.3770.9",
"76.0.3771.0",
"76.0.3771.1",
"76.0.3772.0",
"76.0.3772.1",
"76.0.3773.0",
"76.0.3773.1",
"76.0.3774.0",
"76.0.3774.1",
"76.0.3775.0",
"76.0.3775.1",
"76.0.3775.2",
"76.0.3775.3",
"76.0.3775.4",
"76.0.3775.5",
"76.0.3776.0",
"76.0.3776.1",
"76.0.3776.2",
"76.0.3776.3",
"76.0.3776.4",
"76.0.3777.0",
"76.0.3777.1",
"76.0.3778.0",
"76.0.3778.1",
"76.0.3779.0",
"76.0.3779.1",
"76.0.3780.0",
"76.0.3780.1",
"76.0.3780.2",
"76.0.3780.3",
]
def random_user_agent
return "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/#{CHROME_VERSIONS[rand(CHROME_VERSIONS.size)]} Safari/537.36"
end
2019-10-25 16:58:16 +00:00
struct HTTPPool
property! url : URI
property! capacity : Int32
property! timeout : Float64
property pool : ConnectionPool(HTTPClient)
def initialize(url : URI, @capacity = 5, @timeout = 5.0)
@url = url
@pool = build_pool
end
def client(region = nil, &block)
2019-10-26 03:06:08 +00:00
conn = pool.checkout
begin
2019-10-25 16:58:16 +00:00
if region
PROXY_LIST[region]?.try &.sample(40).each do |proxy|
begin
proxy = HTTPProxy.new(proxy_host: proxy[:ip], proxy_port: proxy[:port])
conn.set_proxy(proxy)
break
rescue ex
end
end
end
2019-10-26 03:06:08 +00:00
response = yield conn
conn.unset_proxy
response
rescue ex
conn = HTTPClient.new(url)
conn.family = (url.host == "www.youtube.com") ? CONFIG.force_resolve : Socket::Family::UNSPEC
conn.read_timeout = 5.seconds
conn.connect_timeout = 5.seconds
yield conn
ensure
pool.checkin(conn)
2019-10-25 16:58:16 +00:00
end
end
private def build_pool
ConnectionPool(HTTPClient).new(capacity: capacity, timeout: timeout) do
client = HTTPClient.new(url)
client.family = (url.host == "www.youtube.com") ? CONFIG.force_resolve : Socket::Family::UNSPEC
client.read_timeout = 5.seconds
client.connect_timeout = 5.seconds
client
end
end
end
2018-08-04 20:30:44 +00:00
# See http://www.evanmiller.org/how-not-to-sort-by-average-rating.html
def ci_lower_bound(pos, n)
if n == 0
return 0.0
end
# z value here represents a confidence level of 0.95
z = 1.96
phat = 1.0*pos/n
return (phat + z*z/(2*n) - z * Math.sqrt((phat*(1 - phat) + z*z/(4*n))/n))/(1 + z*z/n)
end
def elapsed_text(elapsed)
millis = elapsed.total_milliseconds
return "#{millis.round(2)}ms" if millis >= 1
"#{(millis * 1000).round(2)}µs"
end
2019-06-29 02:17:56 +00:00
def make_client(url : URI, region = nil)
client = HTTPClient.new(url)
2019-10-18 16:41:03 +00:00
client.family = (url.host == "www.youtube.com") ? CONFIG.force_resolve : Socket::Family::UNSPEC
2019-10-25 16:58:16 +00:00
client.read_timeout = 5.seconds
client.connect_timeout = 5.seconds
if region
2019-06-29 02:17:56 +00:00
PROXY_LIST[region]?.try &.sample(40).each do |proxy|
begin
proxy = HTTPProxy.new(proxy_host: proxy[:ip], proxy_port: proxy[:port])
client.set_proxy(proxy)
break
rescue ex
end
end
end
2018-08-04 20:30:44 +00:00
return client
end
def decode_length_seconds(string)
length_seconds = string.split(":").map { |a| a.to_i }
length_seconds = [0] * (3 - length_seconds.size) + length_seconds
length_seconds = Time::Span.new(length_seconds[0], length_seconds[1], length_seconds[2])
length_seconds = length_seconds.total_seconds.to_i
return length_seconds
end
def recode_length_seconds(time)
if time <= 0
return ""
else
time = time.seconds
text = "#{time.minutes.to_s.rjust(2, '0')}:#{time.seconds.to_s.rjust(2, '0')}"
if time.total_hours.to_i > 0
text = "#{time.total_hours.to_i.to_s.rjust(2, '0')}:#{text}"
end
text = text.lchop('0')
return text
end
end
2018-08-04 20:30:44 +00:00
def decode_time(string)
time = string.try &.to_f?
if !time
hours = /(?<hours>\d+)h/.match(string).try &.["hours"].try &.to_f
hours ||= 0
minutes = /(?<minutes>\d+)m(?!s)/.match(string).try &.["minutes"].try &.to_f
minutes ||= 0
seconds = /(?<seconds>\d+)s/.match(string).try &.["seconds"].try &.to_f
seconds ||= 0
millis = /(?<millis>\d+)ms/.match(string).try &.["millis"].try &.to_f
millis ||= 0
2019-06-08 01:23:37 +00:00
time = hours * 3600 + minutes * 60 + seconds + millis // 1000
2018-08-04 20:30:44 +00:00
end
return time
end
def decode_date(string : String)
2018-08-05 23:35:52 +00:00
# String matches 'YYYY'
2018-08-15 15:22:36 +00:00
if string.match(/^\d{4}/)
2019-06-08 01:23:37 +00:00
return Time.utc(string.to_i, 1, 1)
2018-08-05 23:35:52 +00:00
end
2018-08-15 15:22:36 +00:00
# Try to parse as format Jul 10, 2000
begin
return Time.parse(string, "%b %-d, %Y", Time::Location.local)
rescue ex
end
case string
when "today"
2019-06-08 00:56:41 +00:00
return Time.utc
2018-08-15 15:22:36 +00:00
when "yesterday"
2019-06-08 00:56:41 +00:00
return Time.utc - 1.day
2018-08-15 15:22:36 +00:00
end
2018-08-08 15:20:07 +00:00
# String matches format "20 hours ago", "4 months ago"...
2018-08-04 20:30:44 +00:00
date = string.split(" ")[-3, 3]
delta = date[0].to_i
case date[1]
when .includes? "second"
delta = delta.seconds
2018-08-04 20:30:44 +00:00
when .includes? "minute"
delta = delta.minutes
when .includes? "hour"
delta = delta.hours
when .includes? "day"
delta = delta.days
when .includes? "week"
delta = delta.weeks
when .includes? "month"
delta = delta.months
when .includes? "year"
delta = delta.years
else
raise "Could not parse #{string}"
end
2019-06-08 00:56:41 +00:00
return Time.utc - delta
2018-08-04 20:30:44 +00:00
end
def recode_date(time : Time, locale)
2019-06-08 00:56:41 +00:00
span = Time.utc - time
2018-08-04 20:30:44 +00:00
if span.total_days > 365.0
2019-06-08 01:23:37 +00:00
span = translate(locale, "`x` years", (span.total_days.to_i // 365).to_s)
2018-08-04 20:30:44 +00:00
elsif span.total_days > 30.0
2019-06-08 01:23:37 +00:00
span = translate(locale, "`x` months", (span.total_days.to_i // 30).to_s)
2018-08-04 20:30:44 +00:00
elsif span.total_days > 7.0
2019-06-08 01:23:37 +00:00
span = translate(locale, "`x` weeks", (span.total_days.to_i // 7).to_s)
2018-08-04 20:30:44 +00:00
elsif span.total_hours > 24.0
2019-02-20 15:37:33 +00:00
span = translate(locale, "`x` days", (span.total_days.to_i).to_s)
2018-08-04 20:30:44 +00:00
elsif span.total_minutes > 60.0
2019-02-20 15:37:33 +00:00
span = translate(locale, "`x` hours", (span.total_hours.to_i).to_s)
elsif span.total_seconds > 60.0
2019-02-20 15:37:33 +00:00
span = translate(locale, "`x` minutes", (span.total_minutes.to_i).to_s)
2018-08-04 20:30:44 +00:00
else
2019-02-20 15:37:33 +00:00
span = translate(locale, "`x` seconds", (span.total_seconds.to_i).to_s)
2018-08-04 20:30:44 +00:00
end
return span
2018-08-04 20:30:44 +00:00
end
def number_with_separator(number)
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, "\\1,").reverse
end
2019-09-13 01:09:23 +00:00
def short_text_to_number(short_text : String) : Int32
2019-03-17 14:00:00 +00:00
case short_text
when .ends_with? "M"
number = short_text.rstrip(" mM").to_f
number *= 1000000
when .ends_with? "K"
number = short_text.rstrip(" kK").to_f
number *= 1000
else
number = short_text.rstrip(" ")
end
number = number.to_i
return number
end
2018-10-19 16:14:26 +00:00
def number_to_short_text(number)
seperated = number_with_separator(number).gsub(",", ".").split("")
text = seperated.first(2).join
if seperated[2]? && seperated[2] != "."
text += seperated[2]
end
text = text.rchop(".0")
2019-06-08 01:23:37 +00:00
if number // 1_000_000_000 != 0
2019-04-14 22:43:44 +00:00
text += "B"
2019-06-08 01:23:37 +00:00
elsif number // 1_000_000 != 0
2018-10-19 16:14:26 +00:00
text += "M"
2019-06-08 01:23:37 +00:00
elsif number // 1000 != 0
2018-10-19 16:14:26 +00:00
text += "K"
end
text
end
2018-08-04 20:30:44 +00:00
def arg_array(array, start = 1)
if array.size == 0
args = "NULL"
else
args = [] of String
(start..array.size + start - 1).each { |i| args << "($#{i})" }
args = args.join(",")
end
return args
end
2018-08-05 04:07:38 +00:00
2019-03-05 18:56:59 +00:00
def make_host_url(config, kemal_config)
ssl = config.https_only || kemal_config.ssl
2019-03-08 17:37:52 +00:00
port = config.external_port || kemal_config.port
2019-03-05 18:56:59 +00:00
2018-08-05 04:07:38 +00:00
if ssl
scheme = "https://"
else
scheme = "http://"
end
2019-03-08 17:37:52 +00:00
# Add if non-standard port
if port != 80 && port != 443
2019-03-05 18:56:59 +00:00
port = ":#{kemal_config.port}"
2019-03-03 17:55:14 +00:00
else
2019-03-05 18:56:59 +00:00
port = ""
end
if !config.domain
2019-03-03 17:55:14 +00:00
return ""
end
2019-03-05 18:56:59 +00:00
host = config.domain.not_nil!.lchop(".")
return "#{scheme}#{host}#{port}"
2018-08-05 04:07:38 +00:00
end
2018-08-09 01:26:02 +00:00
def get_referer(env, fallback = "/", unroll = true)
2018-08-17 15:19:20 +00:00
referer = env.params.query["referer"]?
referer ||= env.request.headers["referer"]?
2018-08-09 01:26:02 +00:00
referer ||= fallback
2018-08-17 15:19:20 +00:00
referer = URI.parse(referer)
2018-09-06 02:10:32 +00:00
# "Unroll" nested referrers
if unroll
loop do
if referer.query
params = HTTP::Params.parse(referer.query.not_nil!)
if params["referer"]?
referer = URI.parse(URI.decode_www_form(params["referer"]))
else
break
end
2018-08-17 15:19:20 +00:00
else
break
end
end
end
referer = referer.full_path
2018-09-06 02:07:19 +00:00
referer = "/" + referer.lstrip("\/\\")
2018-08-09 01:26:02 +00:00
if referer == env.request.path
referer = fallback
end
return referer
end
2018-09-04 13:52:30 +00:00
2019-07-21 01:18:08 +00:00
struct VarInt
def self.from_io(io : IO, format = IO::ByteFormat::NetworkEndian) : Int32
result = 0_u32
2019-07-21 01:18:08 +00:00
num_read = 0
2018-09-04 13:52:30 +00:00
2019-07-21 01:18:08 +00:00
loop do
byte = io.read_byte
raise "Invalid VarInt" if !byte
value = byte & 0x7f
2018-09-04 13:52:30 +00:00
result |= value.to_u32 << (7 * num_read)
2019-02-09 16:15:14 +00:00
num_read += 1
2019-07-21 01:18:08 +00:00
break if byte & 0x80 == 0
raise "Invalid VarInt" if num_read > 5
2018-09-04 13:52:30 +00:00
end
result.to_i32
2019-07-21 01:18:08 +00:00
end
2018-09-04 13:52:30 +00:00
2019-07-21 01:18:08 +00:00
def self.to_io(io : IO, value : Int32)
io.write_byte 0x00 if value == 0x00
value = value.to_u32
2018-09-04 13:52:30 +00:00
while value != 0
2019-07-21 01:18:08 +00:00
byte = (value & 0x7f).to_u8
value >>= 7
2018-09-04 13:52:30 +00:00
if value != 0
2019-07-21 01:18:08 +00:00
byte |= 0x80
2018-09-04 13:52:30 +00:00
end
2019-07-21 01:18:08 +00:00
io.write_byte byte
2018-09-04 13:52:30 +00:00
end
end
end
def sha256(text)
digest = OpenSSL::Digest.new("SHA256")
digest << text
return digest.hexdigest
end
2019-06-08 00:56:41 +00:00
def subscribe_pubsub(topic, key, config)
case topic
when .match(/^UC[A-Za-z0-9_-]{22}$/)
topic = "channel_id=#{topic}"
2019-06-08 02:39:32 +00:00
when .match(/^(PL|LL|EC|UU|FL|UL|OLAK5uy_)[0-9A-Za-z-_]{10,}$/)
2019-06-08 00:56:41 +00:00
# There's a couple missing from the above regex, namely TL and RD, which
# don't have feeds
topic = "playlist_id=#{topic}"
else
# TODO
end
client = make_client(PUBSUB_URL)
time = Time.utc.to_unix.to_s
nonce = Random::Secure.hex(4)
signature = "#{time}:#{nonce}"
host_url = make_host_url(config, Kemal.config)
body = {
"hub.callback" => "#{host_url}/feed/webhook/v1:#{time}:#{nonce}:#{OpenSSL::HMAC.hexdigest(:sha1, key, signature)}",
"hub.topic" => "https://www.youtube.com/xml/feeds/videos.xml?#{topic}",
"hub.verify" => "async",
"hub.mode" => "subscribe",
"hub.lease_seconds" => "432000",
"hub.secret" => key.to_s,
}
return client.post("/subscribe", form: body)
end
2019-07-04 20:30:00 +00:00
def parse_range(range)
if !range
return 0_i64, nil
end
ranges = range.lchop("bytes=").split(',')
ranges.each do |range|
start_range, end_range = range.split('-')
start_range = start_range.to_i64? || 0_i64
end_range = end_range.to_i64?
return start_range, end_range
end
return 0_i64, nil
end
def convert_theme(theme)
case theme
when "true"
"dark"
when "false"
"light"
when "", nil
nil
else
theme
end
end