TrackReference.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #pragma once
  2. #include <string_view>
  3. #include <vector>
  4. #include "NanoPBHelper.h"
  5. #include "Utils.h"
  6. #include "protobuf/spirc.pb.h"
  7. namespace cspot {
  8. struct TrackReference {
  9. static constexpr auto base62Alphabet =
  10. "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  11. // Resolved track GID
  12. std::vector<uint8_t> gid;
  13. // Type identifier
  14. enum class Type { TRACK, EPISODE };
  15. Type type;
  16. static TrackReference fromTrackRef(TrackRef* ref) {
  17. TrackReference trackRef;
  18. if (ref->gid != nullptr) {
  19. // For tracks, the GID is already in the protobuf
  20. trackRef.gid = pbArrayToVector(ref->gid);
  21. trackRef.type = Type::TRACK;
  22. } else {
  23. // Episode GID is being fetched via base62 encoded URI
  24. auto uri = std::string(ref->uri);
  25. auto idString = uri.substr(uri.find_last_of(":") + 1, uri.size());
  26. trackRef.gid = {0};
  27. std::string_view alphabet(base62Alphabet);
  28. for (int x = 0; x < uri.size(); x++) {
  29. size_t d = alphabet.find(uri[x]);
  30. trackRef.gid = bigNumMultiply(trackRef.gid, 62);
  31. trackRef.gid = bigNumAdd(trackRef.gid, d);
  32. }
  33. }
  34. return trackRef;
  35. }
  36. static TrackReference fromGID(std::vector<uint8_t> gid, bool isEpisode) {
  37. TrackReference trackRef;
  38. trackRef.gid = gid;
  39. trackRef.type = isEpisode ? Type::EPISODE : Type::TRACK;
  40. return trackRef;
  41. }
  42. };
  43. } // namespace cspot