Skip to content

Instantly share code, notes, and snippets.

@joksas
Last active May 10, 2024 11:17
Show Gist options
  • Save joksas/1cd95bdfc774bdf97c591d9a14b48f0e to your computer and use it in GitHub Desktop.
Save joksas/1cd95bdfc774bdf97c591d9a14b48f0e to your computer and use it in GitHub Desktop.
Live VTS Test for Apps

I've created a livestream with socket.io <podcast:liveValue> for apps to test live updates (images, titles, value blocks, etc.).

Basic information

Feed: "A Very Blue Podcast" (URL = https://feeds.rssblue.com/rss-blue-podcast, GUID = 5824fced-d16c-5e64-be0f-24296f13efea)
Live item: "Live VTS Test for Apps" (GUID = a4ab9f14-4fc3-5265-8292-543e3feffcae)
socket.io URL: https://sockets.rssblue.com/livestream/dynamic-chapter?slug=rss-blue-podcast&identifier=live-vts-test-for-apps

You can observe socket.io changes in your browser here: https://rssblue.com/socket.io?url=https%3A%2F%2Fsockets.rssblue.com%2Flivestream%2Fdynamic-chapter%3Fslug%3Drss-blue-podcast%26identifier%3Dlive-vts-test-for-apps

Block update schedule

Minutes ending with "0" or "5" (00:00, 00:05, 00:10, etc.)

{
  "blockGuid": "{randomV4Uuid}",
  "image": "https://media.rssblue.com/podcasts/rss-blue-podcast/live-vts-test-for-apps/cover-art.img.png",
  "title": "#1 - Simple chapter",
  "type": "chapter",
  "value": {
    "destinations": [
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "4JKu621Pe89nNdP0G4ah",
        "fee": false,
        "name": "Dovydas",
        "split": 100
      },
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "JNhG48KDpK6UH6AjmhhJ",
        "fee": true,
        "name": "RSS Blue",
        "split": 2
      }
    ],
    "method": "keysend",
    "model": {
      "method": "keysend",
      "type": "lightning"
    },
    "type": "lightning"
  }
}

Minutes ending with "1" or "6" (00:01, 00:06, 00:11, etc.)

{
  "blockGuid": "{randomV4Uuid}",
  "image": "https://media.rssblue.com/podcasts/rss-blue-podcast/cover-art.rssblue-square.png",
  "link": {
    "url": "https://example.com"
  },
  "title": "#2 - simple chapter with link",
  "type": "chapter",
  "value": {
    "destinations": [
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "4JKu621Pe89nNdP0G4ah",
        "fee": false,
        "name": "Dovydas",
        "split": 100
      },
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "JNhG48KDpK6UH6AjmhhJ",
        "fee": true,
        "name": "RSS Blue",
        "split": 2
      }
    ],
    "method": "keysend",
    "model": {
      "method": "keysend",
      "type": "lightning"
    },
    "type": "lightning"
  }
}

Minutes ending with "2" or "7" (00:02, 00:07, 00:12, etc.)

{
  "blockGuid": "{randomV4Uuid}",
  "feedGuid": "c58e87a0-dc16-5b1f-9987-5089e0c3d146",
  "image": "https://media.rssblue.com/podcasts/rss-blue-podcast/live-vts-test-for-apps/cover-art.cf37fc78-e1a2-40e4-8151-dc1db8e8cdf0.jpg",
  "itemGuid": "ee9833ef-b1da-53cf-bfce-0842b5e17423",
  "title": "#3 - remote item - Love Letter by Ainsley Costello",
  "type": "chapter",
  "value": {
    "destinations": [
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "4JKu621Pe89nNdP0G4ah",
        "fee": false,
        "name": "Dovydas",
        "split": 100
      },
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "N8eb5S6YAcbI55uRKwOm",
        "fee": false,
        "name": "ainsleycostello@getalby.com",
        "split": 97
      },
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "JNhG48KDpK6UH6AjmhhJ",
        "fee": false,
        "name": "RSS Blue",
        "split": 2
      },
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "x3VXZtbcfIBVLIUqzWKV",
        "fee": false,
        "name": "OP3 and reflex.livewire.io",
        "split": 1
      },
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "JNhG48KDpK6UH6AjmhhJ",
        "fee": true,
        "name": "RSS Blue",
        "split": 2
      },
      {
        "address": "03ae9f91a0cb8ff43840e3c322c4c61f019d8c1c3cea15a25cfc425ac605e61a4a",
        "fee": true,
        "name": "Podcastindex.org",
        "split": 1
      }
    ],
    "method": "keysend",
    "model": {
      "method": "keysend",
      "type": "lightning"
    },
    "type": "lightning"
  }
}

Minutes ending with "3" or "8" (00:03, 00:08, 00:13, etc.)

{
  "blockGuid": "{randomV4Uuid}",
  "feedGuid": "cb28401c-716a-51df-8de5-e90527546a12",
  "image": "https://media.rssblue.com/podcasts/rss-blue-podcast/live-vts-test-for-apps/cover-art.fe4baae6-4ae4-4647-b590-3e3c7c561f19.jpg",
  "itemGuid": "5a885815-6752-5612-b96b-4964b95b86ae",
  "link": {
    "url": "https://www.herbivoreband.com"
  },
  "title": "#4 - remote item - I've Tried by Herbivore",
  "type": "chapter",
  "value": {
    "destinations": [
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "4JKu621Pe89nNdP0G4ah",
        "fee": false,
        "name": "Dovydas",
        "split": 50
      },
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "gfzMTk6xSLbFzSaY5jVh",
        "fee": false,
        "name": "Herbivore",
        "split": 50
      },
      {
        "address": "030a58b8653d32b99200a2334cfe913e51dc7d155aa0116c176657a4f1722677a3",
        "customKey": "696969",
        "customValue": "JNhG48KDpK6UH6AjmhhJ",
        "fee": true,
        "name": "RSS Blue",
        "split": 2
      },
      {
        "address": "03ae9f91a0cb8ff43840e3c322c4c61f019d8c1c3cea15a25cfc425ac605e61a4a",
        "fee": true,
        "name": "Podcastindex.org",
        "split": 1
      }
    ],
    "method": "keysend",
    "model": {
      "method": "keysend",
      "type": "lightning"
    },
    "type": "lightning"
  }
}

Minutes ending with "4" or "9" (00:04, 00:09, 00:14, etc.)

{}

How to use live updates in practise

Similar to how item metadata overrides feed metadata, podcast:liveValue metadata can override item metadata.

If podcast:liveValue is just an empty block, use the item metadata.

If podcast:liveValue has value field, use those value recipients instead of the ones at the item or feed level.

If podcast:liveValue has title field and the type is chapter, you can interpret this block as a "live chapter".

If podcast:liveValue has feedGuid and itemGuid fields, assume that a remote item is being referenced. If someone boosts during this block, include remote item information in the TLV record.

And so on.

Note: JSONs have redundant method, type, and model fields for backwards compatibility purposes. model should be sufficient, but, if I remember correctly, one of the apps uses method and type.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment