axamon/hermes

View on GitHub
parsers/common.go

Summary

Maintainability
A
0 mins
Test Coverage
// Copyright 2019 Alberto Bregliano. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package parsers

import (
    "encoding/base64"
    "log"
    "net/url"
    "os"
    "regexp"
    "strconv"
    "strings"
    "time"
)

// file del timestamp di roma embeddado in base64
const rome = "VFppZjIAAAAAAAAAAAAAAAAAAAAAAAAHAAAABwAAAAAAAACsAAAABwAAAA2AAAAAmzj4cJvVzOCcxcvwnbcAYJ6J/nCfoBzgoGCl8KF+rWCiXDdwo0waYMhsNfDM50sQzakXkM6CdODOokMQz5I0EM/jxuDQbl6Q0XIWENJM0vDTPjGQ1EnSENUd93DWKZfw1uuAkNgJlhD5M7Xw+dnE4Psc0nD7ubTw/Py0cP2ZlvD+5dDw/4KzcADFsvABYpVwApxacANCd3AEhXbwBSuT8AZuk3AHC3XwCEU68AjrV/AKLldwCss58AwOOXAMqxvwDeTg8A6K/fAPzf1wEHQacBGt33ASU/xwEs6X8BNNRBAUM/qQFSPrkBYT3JAXA82QF/O+kBjjr5AZ06CQGsORkBu8vRAcrK4QHZyfEB6MkBAffIEQIGxyECFcYxAiTFQQIzxFECQsNhAlHCcQJgwYECcFQ5An9TSQKOUlkCnVFpAqxQeQK7T4kCyk6ZAtlNqQLoTLkC90vJAwZK2QMV3ZEDJytBAzPbsQNFKWEDUdnRA2MngQNv1/EDgblJA43WEQOft2kDq9QxA721iQPKZfkD27OpA+hkGQP5sckEBmI5BBhDkQQkYFkENkGxBEJeeQRUP9EEYFyZBHI98QR+7mEEkDwRBJzsgQSuOjEEuuqhBMzL+QTY6MEE6soZBPbm4QUIyDkFFXipBSbGWQUzdskFRMR5BVF06QViwpkFb3MJBYFUYQWNcSkFn1KBBatvSQW9UKEFygERBdtOwQXn/zEF+UzhBgX9UQYX3qkGI/txBjXcyQZB+ZEGU9rpBmCLWQZx2QkGfol5Bo/XKQach5kGrdVJBrqFuQbMZxEG2IPZBuplMQb2gfkHCGNRBxUTwQcmYXEHMxHhB0RfkQdREAEHYvFZB28OIQeA73kHjQxBB57tmQerCmEHvOu5B8mcKQfa6dkH55pJB/jn+QAgECAQIBAgECAQIBAwQBAwQBAwECBAMEAwQDBAIEAwQDBAMEAwQDBAMEAwQDBAMEAwQDBAMEAwIFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgUGBQYFBgAAC7QAAAAAHCABBAAADhAACQAADhAACQAAHCABBAAAHCABBAAADhAACUxNVABDRVNUAENFVAAAAAABAQEBAAAAAAABAQpDRVQtMUNFU1QsTTMuNS4wLE0xMC41LjAvMwo="
var romebytes, _ = base64.StdEncoding.DecodeString(rome)
var loc, _ = time.LoadLocationFromTZData("Europe/Rome", romebytes)

// ! Necessita del file timelocation nel sistema operativo. 
// ! Su windows può essere un problema perchè non sempre è presente.
// var loc, _ = time.LoadLocation("Europe/Rome")

var salt = os.Getenv("salt")

// Utenti clienti TimVision.
type Utenti []Fruizioni

// Fruizioni archivia tuttue le fruizioni effettuate.
type Fruizioni struct {
    Hashfruizione map[string]bool
    Clientip      map[string]string
    Idvideoteca   map[string]string
    Idaps         map[string]string
    Edgeip        map[string]string
    Giorno        map[string]string
    Orario        map[string]string
    Details       map[string][]float64 `json:"-"`
}

// Per idvideoteca
var idV = regexp.MustCompile(`(?m)(/)\d{7,8}(/)`)

// Per manifest
var isDash = regexp.MustCompile(`(?m)\.mpd$`)
var isSS = regexp.MustCompile(`(?m)^.*\.ism`)

// Videoteca è una inerfaccia per i metodi di estrazione dati utili.
type Videoteca interface {
    GetIDVideoteca() string
    GetManifestURL() string
}

func extractIDVideoteca(rawurl string) string {
    var idvideoteca string

    if strings.Contains(rawurl, "%") {
        rawurlDecoded, err := url.QueryUnescape(rawurl)
        if err != nil {
            log.Println(err.Error())
            return ""
        }
        rawurl = rawurlDecoded
    }

    // Cerca la prima corrispondenza
    idvideoteca = idV.FindString(rawurl)

    // idvideoteca = onlyNum.ReplaceAllString(element, "")

    idvideoteca = strings.Replace(idvideoteca, "/", "", 2)

    return idvideoteca
}

func extractManifest(rawurl string) (urlmanifest string, err error) {

    // serve a rendere gestibili le url encodate
    if strings.Contains(rawurl, "%") {
        rawurl, err = url.QueryUnescape(rawurl)
        if err != nil {
            log.Println(err.Error())
            return "", err
        }
    }

    // gestione dei dash
    if isDash.MatchString(rawurl) {
        urlmanifest = rawurl
    }

    // gestione degli SmoothStreaming
    if isSS.MatchString(rawurl) {
        urlmanifest = isSS.FindString(rawurl) + "/Manifest"
    }

    return urlmanifest, nil
}

func giornoq(t time.Time) string {
    ora := t.UTC().Hour()
    minuto := t.UTC().Minute()

    // calcola a quale quartodora appartiene il dato.
    quartoora := ((ora * 60) + minuto) / 15
    quartooraStr := strconv.Itoa(quartoora)

    // Crea il campo giornoq per integrare i log al quarto d'ora.
    giornoq := t.UTC().Format("20060102") + "q" + quartooraStr

    return giornoq
}