PageRenderTime 57ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/share/spice/guidebox/getid/guidebox_getid.js

http://github.com/duckduckgo/zeroclickinfo-spice
JavaScript | 124 lines | 94 code | 18 blank | 12 comment | 11 complexity | f7526b843453546a7c8b1bfea66fba44 MD5 | raw file
Possible License(s): Apache-2.0
  1. (function(env){
  2. "use strict";
  3. env.ddg_spice_guidebox_getid = function(api_result) {
  4. if (!api_result || !api_result.results) {
  5. return Spice.failed('guidebox');
  6. }
  7. var SKIP_ARRAY = ["online","tv","episode","episodes","free","guidebox","watch","full"],
  8. results = api_result.results.result,
  9. relevant;
  10. // Check which show is relevant to our query.
  11. $.each(results, function(key, result) {
  12. if (DDG.isRelevant(result.title, SKIP_ARRAY, 3) && !relevant) {
  13. relevant = result;
  14. }
  15. });
  16. // Exit if we didn't find anything relevant.
  17. if (!relevant) {
  18. return;
  19. }
  20. // Prevent jQuery from appending "_={timestamp}" in our url.
  21. $.ajaxSetup({
  22. cache: true
  23. });
  24. var metadata = {
  25. res_title : relevant.title,
  26. network : relevant.network,
  27. more : relevant.url
  28. };
  29. var url = '/js/spice/guidebox/lastshows/series/' + relevant.id;
  30. $.getJSON(url, function(api_result) {
  31. if(!api_result){
  32. return Spice.failed('guidebox');
  33. }
  34. var isMobile = $('.is-mobile').length;
  35. Spice.add({
  36. id: 'guidebox',
  37. name: 'TV',
  38. data: toArray(api_result.results.result),
  39. meta: {
  40. sourceName: "Guidebox",
  41. sourceUrl: metadata.more,
  42. itemType: 'episodes of ' + metadata.res_title
  43. },
  44. templates: {
  45. group: 'products_simple',
  46. options: {
  47. price: true,
  48. buy: Spice.guidebox_getid.buy
  49. },
  50. variants: {
  51. tile: "video"
  52. }
  53. },
  54. normalize: function(item) {
  55. // We have to check if the required properties exist before we do anything.
  56. // Returning null skips the item and prevents it from getting displayed.
  57. if(!DDG.getProperty(item, 'episode_name') || !DDG.getProperty(item, 'season_number') ||
  58. !DDG.getProperty(item, 'overview')) {
  59. return null;
  60. }
  61. var network;
  62. metadata.network ? network = " on "+ metadata.network : network = "";
  63. var subtitle_tile = "Season "+ item.season_number+ ", #" + item.episode_number,
  64. subtitle_detail = "(Season "+ item.season_number+ ", #" + item.episode_number+")",
  65. abstract_length = (isMobile ? 175 : 200),
  66. abstract = Handlebars.helpers.ellipsis(item.overview, abstract_length),
  67. aired = "Originally aired "+ Handlebars.helpers.guideBox_getDate(item.first_aired) + network;
  68. return {
  69. image: item.thumbnail_304x171,
  70. img: item.thumbnail_400x225,
  71. title: item.episode_name,
  72. ratingText: subtitle_tile,
  73. heading: item.episode_name + subtitle_detail,
  74. url: item.smart_url,
  75. abstract: abstract,
  76. price: aired
  77. }
  78. },
  79. // relevancy: {
  80. // primary: [
  81. // {required: 'episode_name'},
  82. // {required: 'season_number'},
  83. // {required: 'overview'}
  84. // ]
  85. // }
  86. });
  87. });
  88. }
  89. function toArray(obj) {
  90. var result = [];
  91. if($.isArray(obj)) {
  92. return obj;
  93. } else {
  94. $.each(obj, function(key, value) {
  95. result[key] = value;
  96. });
  97. return result;
  98. }
  99. }
  100. Handlebars.registerHelper("guideBox_getDate", function(first_aired) {
  101. var aired = DDG.getDateFromString(first_aired),
  102. days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
  103. months = [ 'January','February','March','April','May','June','July','August','September','October','November','December'];
  104. return days[aired.getDay()] + ", " + months[aired.getMonth()] + " " + aired.getDate() + ", " + aired.getFullYear()
  105. });
  106. }(this));