UNPKG

4.31 kBJavaScriptView Raw
1/*jslint node: true, esversion: 6 */
2"use strict";
3
4const debug = require('debug')('upnpserver:contentHandlers:AbstractMetas');
5const logger = require('../logger');
6
7const ContentHandler = require('./contentHandler');
8
9const REQUEST_REGEXP = /^([^_]+)_(.+)$/i;
10
11class 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 //logger.error("Can not stat url=",posterURL, error);
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
193module.exports = Abstract_Metas;