1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
From 5f4aa26956ebc15e774186955e49cc7c77896f0e Mon Sep 17 00:00:00 2001
From: Alasdair Campbell <alcoheca@gmail.com>
Date: Mon, 30 Jul 2012 13:02:34 +0100
Subject: [PATCH 09/24] platinum: add support for upnp:lastPlaybackPosition,
upnp:lastPlaybackTime and upnp:playbackCount
---
.../Source/Devices/MediaServer/PltMediaItem.cpp | 43 ++++++++++++++++++++++
.../Source/Devices/MediaServer/PltMediaItem.h | 3 ++
2 files changed, 46 insertions(+)
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
index 62e0ba9..3ec7696 100644
--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
@@ -183,6 +183,9 @@ PLT_MediaObject::Reset()
m_ExtraInfo.artist_discography_uri = "";
m_MiscInfo.original_track_number = 0;
+ m_MiscInfo.last_position = 0;
+ m_MiscInfo.last_time = "";
+ m_MiscInfo.play_count = -1;
m_MiscInfo.dvdregioncode = 0;
m_MiscInfo.toc = "";
m_MiscInfo.user_annotation = "";
@@ -316,6 +319,27 @@ PLT_MediaObject::ToDidl(NPT_UInt32 mask, NPT_String& didl)
didl += "</upnp:originalTrackNumber>";
}
+ // last playback position
+ if (m_MiscInfo.last_position > 0) {
+ didl += "<upnp:lastPlaybackPosition>";
+ didl += NPT_String::FromInteger(m_MiscInfo.last_position);
+ didl += "</upnp:lastPlaybackPosition>";
+ }
+
+ // last playback datetime
+ if (!m_MiscInfo.last_time.IsEmpty()) {
+ didl += "<upnp:lastPlaybackTime>";
+ PLT_Didl::AppendXmlEscape(didl, m_MiscInfo.last_time);
+ didl += "</upnp:lastPlaybackTime>";
+ }
+
+ // playcount
+ if (m_MiscInfo.play_count > -1) {
+ didl += "<upnp:playbackCount>";
+ didl += NPT_String::FromInteger(m_MiscInfo.play_count);
+ didl += "</upnp:playbackCount>";
+ }
+
// program title
if (mask & PLT_FILTER_MASK_PROGRAMTITLE && !m_Recorded.program_title.IsEmpty()) {
didl += "<upnp:programTitle>";
@@ -510,6 +534,25 @@ PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
if (NPT_FAILED(str.ToInteger(value))) value = 0;
m_MiscInfo.original_track_number = value;
+ PLT_XmlHelper::GetChildText(entry, "lastPlaybackPosition", str, didl_namespace_upnp);
+ if (NPT_FAILED(str.ToInteger(value))) value = 0;
+ m_MiscInfo.last_position = value;
+
+ PLT_XmlHelper::GetChildText(entry, "lastPlaybackTime", m_MiscInfo.last_time, didl_namespace_dc, 256);
+ NPT_String parsed_last_time;
+ for (int format=0; format<=NPT_DateTime::FORMAT_RFC_1036; format++) {
+ NPT_DateTime date;
+ if (NPT_SUCCEEDED(date.FromString(m_MiscInfo.last_time, (NPT_DateTime::Format)format))) {
+ parsed_last_time = date.ToString((NPT_DateTime::Format)format);
+ break;
+ }
+ }
+ m_MiscInfo.last_time = parsed_last_time;
+
+ PLT_XmlHelper::GetChildText(entry, "playbackCount", str, didl_namespace_upnp);
+ if (NPT_FAILED(str.ToInteger(value))) value = -1;
+ m_MiscInfo.play_count = value;
+
children.Clear();
PLT_XmlHelper::GetChildren(entry, children, "res");
for (NPT_Cardinal i=0; i<children.GetItemCount(); i++) {
diff --git a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
index 81f3dc8..cc3bdf9 100644
--- a/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
+++ b/lib/libUPnP/Platinum/Source/Devices/MediaServer/PltMediaItem.h
@@ -130,6 +130,9 @@ typedef struct {
NPT_UInt32 original_track_number;
NPT_String toc;
NPT_String user_annotation; //TODO: can be multiple
+ NPT_UInt32 last_position;
+ NPT_String last_time;
+ NPT_Int32 play_count;
} PLT_MiscInfo;
typedef struct {
--
1.7.11.msysgit.0
|