Error out if a filename can't be parsed in the TVRenamer.
[armadillo.git] / web_frontend / tv_renamer.js
1 //
2 // Armadillo File Manager
3 // Copyright (c) 2010, Robert Sesek <http://www.bluestatic.org>
4 //
5 // This program is free software: you can redistribute it and/or modify it under
6 // the terms of the GNU General Public License as published by the Free Software
7 // Foundation, either version 3 of the License, or any later version.
8 //
9
10 goog.provide('armadillo.TVRenamer');
11
12 goog.require('goog.Disposable');
13 goog.require('goog.net.XhrIo');
14
15 /**
16 * Creates a helper to rename a file in a pretty format for TV episodes.
17 * @extends {goog.Disposable}
18 * @constructor
19 */
20 armadillo.TVRenamer = function(file) {
21 goog.base(this);
22
23 /**
24 * The file object
25 * @type {armadillo.File}
26 */
27 this.file_ = file;
28 }
29 goog.inherits(armadillo.TVRenamer, goog.Disposable);
30
31 /**
32 * @inheritDoc
33 */
34 armadillo.TVRenamer.prototype.disposeInternal = function() {
35 goog.base(this, 'disposeInternal');
36 this.file_ = null;
37 };
38
39 /**
40 * Performs the information lookup and renames the file if the lookup is
41 * successful.
42 */
43 armadillo.TVRenamer.prototype.run = function() {
44 console.log('running for ' + this.file_.getName());
45 var data = this.parseName_(this.file_.getName());
46 if (!data) {
47 app.showError('Could not parse episode information for ' + this.file_.getName());
48 return;
49 }
50 var url = this.buildURL_(data[0], data[1], data[2]);
51 console.log('url = ' + url);
52 goog.net.XhrIo.send('/proxy?url=' + encodeURIComponent(url),
53 goog.bind(this.lookupHandler_, this));
54 };
55
56 /**
57 * Callback for when the network data is received.
58 * @param {Event} e
59 * @private
60 */
61 armadillo.TVRenamer.prototype.lookupHandler_ = function(e) {
62 var response = e.target.getResponseText();
63 var tags = {};
64 goog.array.forEach(response.split('\n'), function (line) {
65 if (line.length > 0) {
66 var parts = line.split('@', 2);
67 tags[parts[0]] = parts[1];
68 }
69 });
70
71 if (tags['Show Name'] && tags['Episode Info']) {
72 var episode = tags['Episode Info'].split('^');
73 var name = tags['Show Name'] + ' - ' + episode[0] + ' - ' + episode[1];
74 this.rename_(name);
75 }
76 };
77
78 /**
79 * Parses the TV episode data out of the name.
80 * @param {string!} name The current file name.
81 * @returns {Tuple|null} Returns a tuple (show,season,episode) on success,
82 NULL on failure
83 * @private
84 */
85 armadillo.TVRenamer.prototype.parseName_ = function(name) {
86 var pattern = /^(\d+_)?(.+) S?(\d+)(x|E)(\d+)/i;
87 var matches = name.match(pattern);
88 if (!matches || matches.length < 5)
89 return null;
90 return [matches[2], parseInt(matches[3]), parseInt(matches[5])];
91 };
92
93 /**
94 * Builds the query URL.
95 * @param {string!} show Show name
96 * @param {number!} season Season number
97 * @param {number!} episode Episode number
98 * @returns {string}
99 * @private
100 */
101 armadillo.TVRenamer.prototype.buildURL_ = function(show, season, episode) {
102 return "http://services.tvrage.com/tools/quickinfo.php?show=" + show +
103 "&ep=" + season + "x" + episode;
104 };
105
106 /**
107 * Performs the actual rename of the current file to the |newName|.
108 * @param {string!} newName
109 * @private
110 */
111 armadillo.TVRenamer.prototype.rename_ = function(newName) {
112 var path = app.joinPath(this.file_.getParentPath(), newName);
113 this.file_.move(path);
114 };