1 |
|
2 | "use strict";
|
3 |
|
4 | const debug = require('debug')('upnpserver:contentHandlers:AbstractMetas');
|
5 | const logger = require('../logger');
|
6 |
|
7 | const ContentHandler = require('./contentHandler');
|
8 |
|
9 | const REQUEST_REGEXP = /^([^_]+)_(.+)$/i;
|
10 |
|
11 | class Abstract_Metas extends ContentHandler {
|
12 |
|
13 | |
14 |
|
15 |
|
16 | getTrailerURL(contentURL, key, callback) {
|
17 | callback(new Error("Must be implemented !"));
|
18 | }
|
19 |
|
20 | |
21 |
|
22 |
|
23 | getPosterURL(contentURL, key, callback) {
|
24 | callback(new Error("Must be implemented !"));
|
25 | }
|
26 |
|
27 | |
28 |
|
29 |
|
30 | getStillURL(contentURL, key, callback) {
|
31 | callback(new Error("Must be implemented !"));
|
32 | }
|
33 |
|
34 | |
35 |
|
36 |
|
37 | getBackdropURL(contentURL, key, callback) {
|
38 | callback(new Error("Must be implemented !"));
|
39 | }
|
40 |
|
41 | |
42 |
|
43 |
|
44 | _getResourceContentURL(node, type, key, parameters, res, callback) {
|
45 |
|
46 | switch (type) {
|
47 | case "poster":
|
48 | this.getPosterURL(node, key, callback);
|
49 | return;
|
50 |
|
51 | case "trailer":
|
52 | this.getTrailerURL(node, key, callback);
|
53 | return;
|
54 |
|
55 | case "still":
|
56 | this.getStillURL(node, key, callback);
|
57 | return;
|
58 |
|
59 | case "backdrop":
|
60 | this.getBackdropURL(node, key, callback);
|
61 | return;
|
62 | }
|
63 |
|
64 | callback();
|
65 | }
|
66 |
|
67 | |
68 |
|
69 |
|
70 | refTrailer(metas, contentURL, movieKey, callback) {
|
71 |
|
72 | this.getTrailerURL(contentURL, movieKey, (error, trailerURL) => {
|
73 | if (error) {
|
74 | debug("refTrailer", "ContentURL=", contentURL, "error=", error, error.stack);
|
75 | return callback(error);
|
76 | }
|
77 |
|
78 | trailerURL.stat((error, stats) => {
|
79 | debug("refTrailer", "Stat trailer path=", trailerURL, "=>", stats, "error=", error);
|
80 | if (error) {
|
81 | if (error.code === 'ENOENT') {
|
82 | return callback();
|
83 | }
|
84 | error.trailerURL = trailerURL;
|
85 | return callback(error);
|
86 | }
|
87 |
|
88 | metas.res = metas.res || [{}];
|
89 | metas.res.push({
|
90 | contentHandlerKey: this.name,
|
91 | key: "trailer_" + movieKey,
|
92 | mimeType: stats.mimeType,
|
93 | size: stats.size,
|
94 | additionalInfo: "type=trailer",
|
95 | mtime: stats.mtime.getTime()
|
96 | });
|
97 |
|
98 | callback();
|
99 | });
|
100 | });
|
101 | }
|
102 |
|
103 | |
104 |
|
105 |
|
106 | refPoster(metas, contentURL, movieKey, callback) {
|
107 |
|
108 | this.getPosterURL(contentURL, movieKey, (error, posterURL) => {
|
109 | if (error) {
|
110 | var ex = new Error("Can not get posterURL");
|
111 | ex.movieKey = movieKey;
|
112 | ex.contentURL = contentURL;
|
113 | ex.error = error;
|
114 | return callback(ex);
|
115 | }
|
116 |
|
117 | posterURL.stat((error, stats) => {
|
118 | debug("refPoster", "Stat poster url=", posterURL, "=>", stats, "error=", error);
|
119 | if (error) {
|
120 | if (error.code === 'ENOENT') {
|
121 | return callback();
|
122 | }
|
123 |
|
124 |
|
125 | error.posterURL = posterURL;
|
126 | error.movieKey = movieKey;
|
127 | return callback(error);
|
128 | }
|
129 |
|
130 | metas.res = metas.res || [{}];
|
131 | metas.res.push({
|
132 | contentHandlerKey: this.name,
|
133 | key: "poster_" + movieKey,
|
134 | mimeType: stats.mimeType,
|
135 | size: stats.size,
|
136 | additionalInfo: "type=poster",
|
137 | mtime: stats.mtime.getTime()
|
138 | });
|
139 |
|
140 | callback();
|
141 | });
|
142 | });
|
143 | }
|
144 |
|
145 | |
146 |
|
147 |
|
148 | processRequest(node, request, response, path, parameters, callback) {
|
149 |
|
150 | var type = parameters[0];
|
151 | var resKey;
|
152 | var ret = REQUEST_REGEXP.exec(type);
|
153 | if (ret) {
|
154 | resKey = ret[2];
|
155 | type = ret[1];
|
156 | }
|
157 |
|
158 | debug("processRequest", "Parse Key", parameters, "=> type=", type, "resKey=", resKey);
|
159 |
|
160 | var res;
|
161 | if (node.attributes && node.attributes.res) {
|
162 | if (resKey) {
|
163 | res = node.attributes.res.find((r) => r.contentHandlerKey === this.name && r.key === resKey);
|
164 | } else {
|
165 | res = node.attributes.res.find((r) => r.contentHandlerKey === this.name && r.key === type);
|
166 | }
|
167 | }
|
168 |
|
169 | this._getResourceContentURL(node, type, resKey, parameters, res, (error, resourceContentURL) => {
|
170 | if (error) {
|
171 | return callback(error);
|
172 | }
|
173 |
|
174 | if (!resourceContentURL) {
|
175 | return callback("Invalid key '" + resKey + "'", true);
|
176 | }
|
177 |
|
178 | var ats = {
|
179 | contentURL: resourceContentURL
|
180 | };
|
181 |
|
182 | if (res) {
|
183 | ats.mtime = res.mtime;
|
184 | ats.mimeType = res.mimeType;
|
185 | ats.size = res.size;
|
186 | }
|
187 |
|
188 | this.service.sendContentURL(ats, request, response, callback);
|
189 | });
|
190 | }
|
191 | }
|
192 |
|
193 | module.exports = Abstract_Metas;
|