Tuesday, August 25, 2015

Delve blog articles dissected

image
Kanwal Khipple had a question on the Office 365 Yammer network the other day about how can you surface Delve blog articles on a SharePoint site?

To figure out if it’s doable and how you need to understand how the Delve article solution is built. I won’t go into the actual digging, but rather lay out the building blocks from a technical perspective.
And if you want the short story, surfacing metadata other than Title and Author is not trivial – from a search perspective. Which is also what you see in a Delve card.

image
When creating a new blog article from Delve you end up with a story on a URL much like this one: https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson/_layouts/15/PointPublishing.aspx?storyid=1

image
The URL include a story id, which is fed through a page named PointPublishing.aspx. The actual item itself is stored in a library called Pages in a new site under the portals/personal path, and the library has the URL of https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson/pPg.

image
You have a library with the path name pPg which hosts the actual article files. The path for the file you see in the above screenshot is named This-my-test-Title.pointpub. The extension name of the file points to the name of the aspx page it was fed through on viewing. Publishing to the point!

The contents of this file for my very short post is a JSON object inside of the .pointpub file and looks like this:

{
  "Version": "1.0",
  "PostType": 1,
  "Title": "This my test Title",
  "SubTitle": "this is my test subtitle",
  "ThumbnailSource": "#315f7e",
  "Author": "anonymous author",
  "ControlData": {
    "cid1440425091645779245": {
      "Version": "1.0",
      "IsInternalControl": true,
      "ControlName": "ImageHeaderControl",
      "ControlType": 4,
      "DataContext": {
        "ImageControlSize": 12,
        "ImageSourceType": 3,
        "ImageSource": "#315f7e",
        "CaptionText": "",
        "Title": "This my test Title",
        "Subtitle": "this is my test subtitle",
        "Author": null,
        "PublishDate": null,
        "__type": "ImageHeaderControlDataContext"
      },
      "__type": "ControlData"
    },
    "cid1440425091725242595": {
      "IsInternalControl": true,
      "ControlName": "RichTextControl",
      "ControlType": 0,
      "Version": "1.0",
      "DataContext": {
        "Subtype": 1,
        "Value": "<p>How about them yankees?<\/p>",
        "NoDefaultValue": false,
        "__type": "TextControlDataContext"
      },
      "__type": "ControlData"
    }
  },
  "ControlMap": {
    "Rows": [
      {
        "Columns": [
          {
            "ControlId": "cid1440425091645779245",
            "HasChildren": false
          }
        ]
      },
      {
        "Columns": [
          {
            "HasChildren": false,
            "ControlId": "cid1440425091725242595"
          }
        ]
      }
    ],
    "GridSize": 12,
    "__type": "ControlMap"
  },
  "__type": "PersistedPostModel"
}


The drawback from a search perspective is that the only real metadata you have on a Delve article is the Title and the Author, as all the other metadata is hidden inside the file blob itself. Using the SharePoint 2013 Query Tool (with a source fix as it broke on some weird managed property) I get the following list of managed properties which has retrievable data, nothing much fun really. Which means that if you want to show anything else, you need to get the file blob and parse out the values you want – unless Microsoft decides to do something special for the Delve articles.



Rank 5.33526802062988
DocId 122461335
Author Mikael Svenson
AuthorOWSUSER mikael.svenson@puzzlepart.com | Mikael Svenson | 693A30232E667C6D656D626572736869707C6D696B61656C2E7376656E736F6E4070757A7A6C65706172742E636F6D i:0#.f|membership|mikael.svenson@puzzlepart.com
ContentSource SharePoint Content
ContentType application/octet-stream
Story Page
ContentTypeId 0x010100DA3A7E6E3DB34DFF8FDEDE1F4EBAF95D004890E830D755C34E892BBFBB1B1C2D04
CrawlTime 2015-08-25T05:53:20.0000000Z
Created 2015-08-24T14:04:53.0000000Z
CreatedBy Mikael Svenson
CreatedOWSDATE 2015-08-24T14:04:53Z
DefaultEncodingURL https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson/pPg/This-my-test-Title.pointpub
DetectedLanguage en
DetectedLanguageRanking 9
DiscoveredTime 2015-08-24T14:07:29.5100000Z
DisplayAuthor Mikael Svenson
DocumentSignature -7627236096027894607;26358137872471357;-7495234929293607372;72597403516975385;7658639472829065416;-26002263360039820
EditorOWSUSER mikael.svenson@puzzlepart.com | Mikael Svenson | 693A30232E667C6D656D626572736869707C6D696B61656C2E7376656E736F6E4070757A7A6C65706172742E636F6D i:0#.f|membership|mikael.svenson@puzzlepart.com
ExcludeFromSummary PointPublishing.aspx
FallbackLanguage 1044
FileExtension aspx
FileType txt
Filename This-my-test-Title.pointpub
HostingPartition e03b5249-1555-4b59-ba09-cfc385668865
IndexDocId 122461335
InternalFileType 5
IsContainer FALSE
IsDocument TRUE
IsExternalContent FALSE
LastModifiedTime 2015-08-25T05:51:29.0000000Z
ListID {01c5a207-be05-49b2-84e0-a61b747b159b}
ListItemID 1
MetadataAuthor Mikael Svenson
ModifiedBy Mikael Svenson
ModifiedOWSDATE 2015-08-25T05:51:29Z
OriginalPath https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson/_layouts/15/PointPublishing.aspx?storyid=1
ParentLink https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson/pPg/Forms/AllItems.aspx
Path https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson/_layouts/15/PointPublishing.aspx?storyid=1
People mikael.svenson@puzzlepart.com | Mikael Svenson | 693A30232E667C6D656D626572736869707C6D696B61656C2E7376656E736F6E4070757A7A6C65706172742E636F6D i:0#.f|membership|mikael.svenson@puzzlepart.com;Mikael Svenson
PhoneNumber 41219241873 41219241873 1873 1873 3 3
PrivacyIndicator 2
ReplyCount 0
SPSiteURL https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson
SPVersion 15
SPWebUrl https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson
SecondaryFileExtension pointpub
SecurityId {94F39EFE-98B0-4D29-BEC0-A645FD881A2E}
SiteID {6cc3ffd8-9ce5-48bd-9c17-5348289818b3}
SitePath https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson/_layouts/15/;com.sharepoint.pzlcloud./portals/personal/mikaelsvenson/_layouts/15/
SiteTemplate POINTPUBLISHINGPERSONAL
SiteTemplateId 66
SiteTitle mikael.svenson
Size 1075
Title This my test Title
UIVersionStringOWSTEXT 2.0
UniqueID {46513057-F77F-4318-829A-977431AA0FE5}
UrlDepth 6
ViewableByAnonymousUsers FALSE
ViewableByExternalUsers FALSE
WebApplicationId {72d57e48-4036-4947-a6a7-586f689d4b2e}
WebId {0384AFA3-4DF8-42E9-A979-A2BDE05618A2}
contentclass STS_ListItem_DocumentLibrary
encoding System.Text.UTF8Encoding
language en
languages en
owsPeople mikael.svenson@puzzlepart.com | Mikael Svenson | 693A30232E667C6D656D626572736869707C6D696B61656C2E7376656E736F6E4070757A7A6C65706172742E636F6D i:0#.f|membership|mikael.svenson@puzzlepart.com
owstaxIdSPLocationInfo https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson|{01c5a207-be05-49b2-84e0-a61b747b159b}|1
owstaxIdSPLocationList {01c5a207-be05-49b2-84e0-a61b747b159b}
owstaxIdSPLocationSite https://pzlcloud.sharepoint.com/portals/personal/mikaelsvenson
PartitionId e03b5249-1555-4b59-ba09-cfc385668865
UrlZone 0
Culture en-US
ResultTypeId 1447
RenderTemplateId ~sitecollection/_catalogs/masterpage/Display Templates/Search/Item_Default.js
piSearchResultId 0_1