{"id":80,"date":"2017-02-15T19:15:32","date_gmt":"2017-02-15T19:15:32","guid":{"rendered":"http:\/\/blog.petejefferson.co.uk\/?p=80"},"modified":"2017-02-15T19:15:32","modified_gmt":"2017-02-15T19:15:32","slug":"kodi-virtual-file-system-video-add-on","status":"publish","type":"post","link":"https:\/\/blog.petejefferson.co.uk\/?p=80","title":{"rendered":"Kodi Virtual File System Video Add-on"},"content":{"rendered":"<p>I have several media sources across various web sites and computers and wanted a way to\u00a0bring them all together in an organised structure that I can navigate from Kodi. Although Kodi offers adding sources from SMB, NFS, WebDAV etc, I needed a bit more flexibility. \u00a0In my mind I needed to present a virtual file system to Kodi so set out on making this; my first plug-in.<\/p>\n<p>The concept is very simple. There will be a MySQL database which represents\u00a0the\u00a0file system and the file nodes will have a URL (or endpoint) which points to the physical video file.<\/p>\n<p>The plug-in was developed with Kodi 16 (Jarvis) on Windows 10.<\/p>\n<h2>Step 1: The Database Schema<\/h2>\n<p>Now, there are many ways a file system can be represented in a database. In this example I&#8217;ve opted for a single table for all the files and folders using a parentid relationship:<\/p>\n<pre><span style=\"color: #808080;\">CREATE SCHEMA kodivfs;\n\nCREATE TABLE `kodivfs`.`listing` (\n `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n `parentid` INT NULL,\n `type` CHAR(1) NOT NULL,\n `name` VARCHAR(255) NOT NULL,\n `url` VARCHAR(255) NULL,\n PRIMARY KEY (`id`),\n UNIQUE INDEX `id_UNIQUE` (`id` ASC),\n INDEX `ix_parentid` (`parentid` ASC));<\/span><\/pre>\n<p><em>type<\/em> is either F for a file or D for a directory.<\/p>\n<h2>Step 2: File and Folder Records<\/h2>\n<p>I&#8217;ll start off with making two &#8220;root&#8221; folders called <em>Movies<\/em> and <em>TV<\/em>. I will add files directly in to Movies and for TV I will create sub-folders for each\u00a0TV show and the\u00a0seasons.<\/p>\n<p>Visually the structure will look like this:<\/p>\n<pre>+ Movies\n  - The Shawshank Redemption\n  - The Godfather\n  - Pulp Fiction\n  - Fight Club\n+ TV\n  + 24\n    + Season 1\n      - Episode 1: 12:00 A.M. - 1:00 A.M.\n      - Episode 2: 1:00 A.M. - 2:00 A.M.\n      - Episode 3: 2:00 A.M. - 3:00 A.M.\n      - Episode 4: 3:00 A.M. - 4:00 A.M.\n    + Season 2\n      - Episode 1: 8:00 A.M. - 9:00 A.M.\n      - Episode 2: 9:00 A.M. - 10:00 A.M.\n      - Episode 3: 10:00 A.M. - 11:00 A.M.\n      - Episode 4: 11:00 A.M. - 12:00 P.M.\n  + Grimm\n    + Season 1\n      - Episode 1: Pilot\n      - Episode 2: Bears Will be Bears\n      - Episode 3: Beeware\n      - Episode 4: Lonelyhearts\n    + Season 2:\n      - Episode 1: Bad Teeth\n      - Episode 2: The Kiss\n      - Episode 3: Bad Moon Rising\n      - Episode 4: Quill\n  + Suits\n    + Season 1\n      - Episode 1: Pilot\n      - Episode 2: Errors and Omissions\n      - Episode 3: Inside Track<\/pre>\n<p>Insert the two &#8220;root&#8221; folders, Movies and TV:<\/p>\n<pre><span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`type`, `name`) VALUES ('D', 'Movies');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`type`, `name`) VALUES ('D', 'TV');<\/span><\/pre>\n<p>Verify the\u00a0ids for the folders created. In this case, Movies is id 1, TV is id\u00a02:<\/p>\n<p><a href=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/mysql1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-82\" src=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/mysql1.png\" alt=\"\" width=\"481\" height=\"246\" srcset=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/mysql1.png 481w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/mysql1-300x153.png 300w\" sizes=\"auto, (max-width: 481px) 100vw, 481px\" \/><\/a><\/p>\n<p>Insert records for the movies, ensuring the parentid is correct:<\/p>\n<pre><span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (1, 'F', 'The Shawshank Redemption', 'https:\/\/webserver1.privateserver.com\/movies\/TheShawShankRedemption.mkv');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (1, 'F', 'The Godfather', 'https:\/\/webserver1.privateserver.com\/movies\/TheGodfather.mkv');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (1, 'F', 'Pulp Fiction', 'https:\/\/webserver2.privateserver.com\/movies\/PulpFiction.avi');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (1, 'F', 'Fight Club', 'https:\/\/webserver2.privateserver.com\/movies\/FightClub.mkv');<\/span><\/pre>\n<p>Create the structure for TV ensuring the correct parentid is used for each level:<\/p>\n<pre><span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`) VALUES (2, 'D', '24');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`) VALUES (7, 'D', 'Season 1');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`) VALUES (7, 'D', 'Season 2');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`) VALUES (2, 'D', 'Grimm');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`) VALUES (10, 'D', 'Season 1');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`) VALUES (10, 'D', 'Season 2');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`) VALUES (2, 'D', 'Suits');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`) VALUES (13, 'D', 'Season 1');<\/span><\/pre>\n<p>And then the records for the TV episodes:<\/p>\n<pre><span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (8, 'F', 'Episode 1: 12:00 A.M. - 1:00 A.M.', 'https:\/\/webserver1.privateserver.com\/tv\/24\/season1\/1.mkv');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (8, 'F', 'Episode 2: 1:00 A.M. - 2:00 A.M.', 'https:\/\/webserver1.privateserver.com\/tv\/24\/season1\/2.mkv');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (8, 'F', 'Episode 3: 2:00 A.M. - 3:00 A.M.', 'https:\/\/webserver1.privateserver.com\/tv\/24\/season1\/3.mkv');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (8, 'F', 'Episode 4: 3:00 A.M. - 4:00 A.M.', 'https:\/\/webserver1.privateserver.com\/tv\/24\/season1\/4.mkv');<\/span>\n\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (9, 'F', 'Episode 1: 8:00 A.M. - 9:00 A.M.', 'https:\/\/webserver1.privateserver.com\/tv\/24\/season2\/1.mkv');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (9, 'F', 'Episode 2: 9:00 A.M. - 10:00 A.M.', 'https:\/\/webserver1.privateserver.com\/tv\/24\/season2\/2.mkv');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (9, 'F', 'Episode 3: 10:00 A.M. - 11:00 A.M.', 'https:\/\/webserver1.privateserver.com\/tv\/24\/season2\/3.mkv');<\/span>\n<span style=\"color: #808080;\">INSERT INTO `kodivfs`.`listing` (`parentid`, `type`, `name`, `url`) VALUES (9, 'F', 'Episode 4: 11:00 A.M. - 12:00 P.M.', 'https:\/\/webserver1.privateserver.com\/tv\/24\/season2\/4.mkv');<\/span><\/pre>\n<p>&#8230; etc&#8230;<\/p>\n<h2>Step 3:\u00a0The plug-in<\/h2>\n<p>Start with creating a new folder called <em>plugin.video.vfsdemo<\/em> and inside there create a new text file called <em>addon.py<\/em>.<\/p>\n<p>Open addon.py with Notepad (or your text editor of choice) and paste the following code:<\/p>\n<pre><span style=\"color: #808080;\">import sys\nimport urllib\nimport urlparse\nimport xbmcgui\nimport xbmcplugin\nimport mysql.connector\n\nbase_url = sys.argv[0]\naddon_handle = int(sys.argv[1])\nargs = urlparse.parse_qs(sys.argv[2][1:])\n\ndef build_url(query):\n    return base_url + '?' + urllib.urlencode(query)\n\nparentid = args.get('parentid', None)\n\nconn = mysql.connector.connect(user='kodi', password='kodi', host='127.0.0.1', database='kodivfs')\ntry:\n    cursor = conn.cursor(buffered=True)\n    try:\n        if parentid is None:\n          query = \"SELECT `id`, `name`, `type`, `url` FROM `kodivfs`.`listing` WHERE parentid IS NULL ORDER BY `type` DESC, name ASC\"\n        else:\n          query = 'SELECT `id`, `name`, `type`, `url` FROM `kodivfs`.`listing` WHERE parentid = {} ORDER BY `type` DESC, name ASC'.format(parentid[0])\n\n        cursor.execute(query)\n \n        for (id, name, type, url) in cursor:\n          if type == 'F':\n            li = xbmcgui.ListItem(name, iconImage='DefaultVideo.png')\n            xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)\n          elif type == 'D':\n            li = xbmcgui.ListItem(name, iconImage='DefaultFolder.png')\n            xbmcplugin.addDirectoryItem(handle=addon_handle, url=build_url({'parentid': id}), listitem=li, isFolder=True)\n \n         xbmcplugin.endOfDirectory(addon_handle)\n     finally:\n       cursor.close();\nfinally:\n conn.close();<\/span><\/pre>\n<p>The code checks to see if a parentid parameter was passed through to the plug-in, if it was then select the items from the parent folder. It then works it&#8217;s way through the results\u00a0calling xmbc.addDirectoryItem() to populate the list you&#8217;ll see in Kodi.<\/p>\n<p>Next create another file in the same folder called <em>addon.xml<\/em> and populate it with the following:<\/p>\n<pre>&lt;?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?&gt;\n&lt;addon id=\"plugin.video.vfsdemo\" name=\"Virtual File System Demo Add-on\" version=\"1.0.0\" provider-name=\"blog.petejefferson.co.uk\"&gt;\n &lt;requires&gt;\n   &lt;import addon=\"xbmc.python\" version=\"2.1.0\"\/&gt;\n   &lt;import addon=\"script.module.myconnpy\" version=\"1.1.7\" \/&gt;\n &lt;\/requires&gt;\n &lt;extension point=\"xbmc.python.pluginsource\" library=\"addon.py\"&gt;\n   &lt;provides&gt;video&lt;\/provides&gt;\n &lt;\/extension&gt;\n &lt;extension point=\"xbmc.addon.metadata\"&gt;\n   &lt;summary lang=\"en_gb\"&gt;Virtual file system provider&lt;\/summary&gt;\n   &lt;description lang=\"en_gb\"&gt;Represent a file system using a MySQL backend&lt;\/description&gt;\n   &lt;disclaimer lang=\"en_gb\"&gt;&lt;\/disclaimer&gt;\n   &lt;language&gt;&lt;\/language&gt;\n   &lt;platform&gt;all&lt;\/platform&gt;\n   &lt;license&gt;&lt;\/license&gt;\n   &lt;forum&gt;&lt;\/forum&gt;\n   &lt;website&gt;&lt;\/website&gt;\n   &lt;email&gt;&lt;\/email&gt;\n   &lt;source&gt;&lt;\/source&gt;\n   &lt;news&gt;&lt;\/news&gt;\n   &lt;assets&gt;\n   &lt;icon&gt;&lt;\/icon&gt;\n   &lt;fanart&gt;&lt;\/fanart&gt;\n   &lt;screenshot&gt;&lt;\/screenshot&gt;\n   &lt;\/assets&gt;\n &lt;\/extension&gt;\n&lt;\/addon&gt;<\/pre>\n<p>Create a zip file\u00a0of the\u00a0plugin.video.vfsdemo folder (in Windows Explorer you can right click and choose Send to &gt; Compressed (zipped) folder). Copy the file to a location accessible from Kodi.<\/p>\n<h2>Step 4:\u00a0Installing to Kodi<\/h2>\n<p>Navigate to System &gt; Settings &gt; Add-ons in Kodi.<\/p>\n<p>Choose &#8220;Install from zip file&#8221; and navigate to plugin.video.vfsdemo.zip.<\/p>\n<p><a href=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-84\" src=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi1.png\" alt=\"\" width=\"1051\" height=\"639\" srcset=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi1.png 1051w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi1-300x182.png 300w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi1-768x467.png 768w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi1-1024x623.png 1024w\" sizes=\"auto, (max-width: 1051px) 100vw, 1051px\" \/><\/a><\/p>\n<p>And click OK.<\/p>\n<p>All being well you will see a notification that the add-on was successfully installed.<\/p>\n<h2>Step 5:\u00a0Test<\/h2>\n<p>Navigate to Videos &gt; Add-ons and select the Virtual File System Demo Add-on.<\/p>\n<p><a href=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-86\" src=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi2.png\" alt=\"\" width=\"1051\" height=\"639\" srcset=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi2.png 1051w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi2-300x182.png 300w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi2-768x467.png 768w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi2-1024x623.png 1024w\" sizes=\"auto, (max-width: 1051px) 100vw, 1051px\" \/><\/a><\/p>\n<p>You&#8217;ll then be presented by the contents of the &#8220;root&#8221; folder, in this case Movies and TV.\u00a0Going in to Movies will show all files that have that parentid:<\/p>\n<p><a href=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-88\" src=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi4.png\" alt=\"\" width=\"1051\" height=\"639\" srcset=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi4.png 1051w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi4-300x182.png 300w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi4-768x467.png 768w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi4-1024x623.png 1024w\" sizes=\"auto, (max-width: 1051px) 100vw, 1051px\" \/><\/a><\/p>\n<p>Go up a folder and explore TV:<\/p>\n<p><a href=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-89\" src=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi5.png\" alt=\"\" width=\"1051\" height=\"639\" srcset=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi5.png 1051w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi5-300x182.png 300w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi5-768x467.png 768w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi5-1024x623.png 1024w\" sizes=\"auto, (max-width: 1051px) 100vw, 1051px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi6.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-90\" src=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi6.png\" alt=\"\" width=\"1051\" height=\"639\" srcset=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi6.png 1051w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi6-300x182.png 300w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi6-768x467.png 768w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi6-1024x623.png 1024w\" sizes=\"auto, (max-width: 1051px) 100vw, 1051px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi7.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-91\" src=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi7.png\" alt=\"\" width=\"1051\" height=\"639\" srcset=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi7.png 1051w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi7-300x182.png 300w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi7-768x467.png 768w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi7-1024x623.png 1024w\" sizes=\"auto, (max-width: 1051px) 100vw, 1051px\" \/><\/a><\/p>\n<p>If you have your URLs set up correctly in the database, you will be able to watch your\u00a0videos.<\/p>\n<p><a href=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi8.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-85\" src=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi8.png\" alt=\"\" width=\"1051\" height=\"639\" srcset=\"https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi8.png 1051w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi8-300x182.png 300w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi8-768x467.png 768w, https:\/\/blog.petejefferson.co.uk\/wp-content\/uploads\/2017\/02\/kodi8-1024x623.png 1024w\" sizes=\"auto, (max-width: 1051px) 100vw, 1051px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>I have several media sources across various web sites and computers and wanted a way to\u00a0bring them all together in an organised structure that I can navigate from Kodi. Although Kodi offers adding sources from SMB, NFS, WebDAV etc, I needed a bit more flexibility. \u00a0In my mind I needed to present a virtual file [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[4,5,6],"class_list":["post-80","post","type-post","status-publish","format-standard","hentry","category-uncategorised","tag-kodi","tag-mysql","tag-python"],"_links":{"self":[{"href":"https:\/\/blog.petejefferson.co.uk\/index.php?rest_route=\/wp\/v2\/posts\/80","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.petejefferson.co.uk\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.petejefferson.co.uk\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.petejefferson.co.uk\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.petejefferson.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=80"}],"version-history":[{"count":0,"href":"https:\/\/blog.petejefferson.co.uk\/index.php?rest_route=\/wp\/v2\/posts\/80\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.petejefferson.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=80"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.petejefferson.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=80"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.petejefferson.co.uk\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=80"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}