• 1
  • 14
  • 15
  • 16(current)
  • 17
  • 18
  • 19
Release [Helix-Isengard] WiMM - Web interface Media Manager for Kodi
(2015-06-07, 00:46)uNiversal Wrote: Two posts back you were talking about the new version, so I assumed it was this you looking for.

Ill try to find out where to do it in default old WIMM but dont hold your breath.

Ive also asked you to open issues and feature request for it on the relevant github and you done neither which indicates you may not be that worried about it.
Also I have currently nothing to do with development for the new WIMM-ng 5.0 whatsoever and old WIMM is pretty much done I think since the efforts are probably being concentrated on NEW WIMM.

Well, this IS the release thread for this add-on, is it not?

The rest of your reply just makes no sense. There is no NEW version or OLD version. Nothing released. Nothing noted. No discussion here or on the github itself. IF there are further updates they haven't been noted by anyone anywhere outside of just adding/changing some files.

If you didn't know the answer to my questions, unfortunately you linking some search results didn't help. As for doing things on the git, how does one do that?
(2015-05-07, 20:07)Batiatus Wrote: OK so I upgraded to Isengard Beta1 to find out my web interface no longer worked. Looked into it and found multiple updates to the change over to WiMM (even though the main page is sorely out of date) and got the latest 5.0.3 installed. Now my web browser just sits with 2 spinning blue half-circles and no interface comes up.Rather disappointing.

Here you talking about NEW 5..0.3 WIMM-ng you know the NEW development version the first version was released http://forum.kodi.tv/showthread.php?tid=...pid1982076 and further NEWER versions where delivered after more recent posts by fyfe

(2015-05-14, 09:47)Batiatus Wrote: 2 problems with this new version that weren't in the previous XiMM.

No search box to search for things by title or partial title. So to get to a certain movie that's not brand new I have to scroll through my entire library to find it.

Second, only 24 items per "page" gives me 96 pages to work through to find a movie.

These 2 things are a big pain in the butt. My browser can handle more than 24 items and not being able to search makes finding things super tedious. I like the newly added feature but that's not always the only search I require.

Also,. the web layout is far more difficult to navigate, read and find things than before. Some good changes but too much has gone the wrong way.

So you are talking about 5.0.3 WIMM? 4.x? There is a huge difference you know.

(2015-06-07, 02:23)Batiatus Wrote:
(2015-06-07, 00:46)uNiversal Wrote: Two posts back you were talking about the new version, so I assumed it was this you looking for.

Ill try to find out where to do it in default old WIMM but dont hold your breath.

Ive also asked you to open issues and feature request for it on the relevant github and you done neither which indicates you may not be that worried about it.
Also I have currently nothing to do with development for the new WIMM-ng 5.0 whatsoever and old WIMM is pretty much done I think since the efforts are probably being concentrated on NEW WIMM.

Well, this IS the release thread for this add-on, is it not?

The rest of your reply just makes no sense. There is no NEW version or OLD version. Nothing released. Nothing noted. No discussion here or on the github itself. IF there are further updates they haven't been noted by anyone anywhere outside of just adding/changing some files.

If you didn't know the answer to my questions, unfortunately you linking some search results didn't help. As for doing things on the git, how does one do that?

Yes yes it is, but here we release OLD version 4.x and NEW (development) version 5.x

Perhaps it is you that should now tell me what version you talking about.

Im not making sense? Try my shoes why dont you?

So. ok first post on this thread explains EXACTLY how to post in github issues, So wimm 4.x goto https://github.com/slash2009/XWMM/issues for 5.x you need to go to https://github.com/fyfe/WIMM-ng

OK so now over to you... Please be clear what addon version you are talking about exactly and then Ill try to point you in right direction.
(2015-06-07, 10:13)uNiversal Wrote: OK so now over to you... Please be clear what addon version you are talking about exactly and then Ill try to point you in right direction.

(2015-05-07, 20:07)Batiatus Wrote: OK so I upgraded to Isengard Beta1 to find out my web interface no longer worked. Looked into it and found multiple updates to the change over to WiMM (even though the main page is sorely out of date) and got the latest 5.0.3 installed. Now my web browser just sits with 2 spinning blue half-circles and no interface comes up.Rather disappointing.

It was very clear I installed 5.0.3, the newest, latest version, and had a problem getting it to work in my browser at first. Once that resolved I posted my findings on the features that were missing or made it difficult to go through a library of over 2300 movies. This is the version I asked if there was any news or updates and asked where in the code is the limits to items per page so I can fix that myself and not have 88 pages of movies to slowly scroll through to find things.

What ever version you linked to has files that were not in the release version of 5.0.3 and still yet I have no answer. If everything is supposed to go through the github why is there nothing there, no one but yourself looking at things here or anything? Seems like a dead add-on to me. Especially ince you state issues and requests will get lost in this thread yet before 2 days ago the second last post in this thread was mine from a month ago noting issues and requests. Instead I need to sign up another account in another place just to ask a question or say there's something wrong?
Then for 5.0.3 refer to link I originally posted search (you dismissed) for the items, read the code and alter the values and see if it helps

It is the code so it has to be there in one form or another, Im not 100% familiar with it but that is indeed the source correct code for your addon, Im not that far gone..

Its very clear and Ive posted this many times before. And let me make it clear, thers nothing wrong by reporting issues here on this thread, however they cannot be tracked will get buried probably lost and is ineffective.
I understand and share your opinion about making yet another account, but think if it is the best and most efficient to help this project and you have interest in helping by providing feedback and reports which are sure to be seen and read and tracked, its not so much of a huge deal.

Up to you, I dont really care, not nice to says so, but after your replies, Ive lost will to live never mind waste my time on something I used a couple of times and have wasted countless hours trying to make the project live on for the greater good of the community.
I get tht you are trying to help, and I do appreciate it. I don't think you need to be as dramatic about my questions though. I just don't understand who is actually working on this app, if anyone anymore. And thus, who might know the information I am after. I don't understand this code at all and I am trying to learn as I go but really I just want to make 1 or 2 tweaks to make navigating my massive library easier. It's frustrating on all ends, and to this point I've not found any other media manager that is as easy and effective to use as XiMM was.

And of course if I can figure out my questions I'm happy to help others who may also be interested to know. Especially if it's a quick sort of fix.
I found the control that limits items per page to 24 in version 5.0.3.

In the sub-folder app/assests/js is a file called 'app.js'. If you open this file in Notepad++ it only has 3 lines. The first line is a massive run-on string and near the end is this bit of code

Code:
{PAGE_SIZE:24}

So search for 24, or page_size, to easily find it. Then change the value 24 to whatever value you'd like. I made mine 504 so it fills every row completely and turns 99 pages of movies to look through to less than 6. It's a tiny bit slower in my system than just reading 24 items at a time but far easier to work with.

Changing this value also does the same for TV Shows as well.

It does not, however, change the limit of only 25 most recently added movie items, but does now put all 25 on 1 web page.

Hope that helps anyone who was curious out.

Below is the complete code now from the app.js file with a per page limit changed to 504. You can copy it into a basic text document and save it with the .js extension and then put it in the proper directory if you are unsure how to mod the file itself.

Code:
!function(angular){"use strict";angular.module("WIMM.common",["ngSocket"])}(window.angular),function(angular){"use strict";function config(gettext,$stateProvider){$stateProvider.state("movies",{"abstract":!0,url:"/movies",templateUrl:"assets/templates/movies/index.html"}).state("movies.title",{url:"/by-title?page",templateUrl:"assets/templates/movies/movie-list.html",controller:"ListMoviesCtrl",resolve:{movies:getMovies}}).state("movies.recent",{url:"/recently-added?
",templateUrl:"assets/templates/movies/movie-list.html",controller:"ListMoviesCtrl",resolve:{movies:getRecentlyAdded},data:{sectionTitle:gettext("Recently Added")}}).state("movies.genres",{url:"/by-genre",templateUrl:"assets/templates/movies/group-list.html",controller:"ListMovieGroupCtrl",resolve:{groups:getGenres}}).state("movies.genre",{url:"/genre/{genre}?page",templateUrl:"assets/templates/movies/movie-list.html",controller:"ListMoviesCtrl",resolve:{movies:getMovies}}).state("movies.tags",{url:"/by-tag",templateUrl:"assets/templates/movies/group-list.html",controller:"ListMovieGroupCtrl",resolve:{groups:getTags}}).state("movies.tag",{url:"/tag/{tag}?page",templateUrl:"assets/templates/movies/movie-list.html",controller:"ListMoviesCtrl",resolve:{movies:getMovies}}).state("movies.sets",{url:"/by-set",templateUrl:"assets/templates/movies/group-list.html",controller:"ListMovieGroupCtrl",resolve:{groups:getSets}}).state("movies.set",{url:"/set/{set}?page",templateUrl:"assets/templates/movies/movie-list.html",controller:"ListMoviesCtrl",resolve:{movies:getMovies}}).state("movie",{url:"/movie-{movieid:int}",templateUrl:"assets/templates/movies/movie.html",controller:"MovieCtrl",resolve:{movie:getMovie}})}function getMovies(CONFIG,VideoLibraryService,$stateParams){var limits={start:CONFIG.PAGE_SIZE*(($stateParams.page||1)-1)};limits.end=limits.start+CONFIG.PAGE_SIZE;var filter;return $stateParams&&($stateParams.set?filter={field:"set",operator:"is",value:$stateParams.set}:$stateParams.genre?filter={field:"genre",operator:"contains",value:$stateParams.genre}:$stateParams.tag&&(filter={field:"tag",operator:"contains",value:$stateParams.tag})),VideoLibraryService.getMovies(filter,limits)}function getRecentlyAdded(CONFIG,VideoLibraryService,$stateParams){var limits={start:CONFIG.PAGE_SIZE*(($stateParams.page||1)-1)};return limits.end=limits.start+CONFIG.PAGE_SIZE,VideoLibraryService.getRecentlyAddedMovies(limits)}function getGenres(VideoLibraryService){return VideoLibraryService.getGenres("movie")}function getTags(VideoLibraryService){return VideoLibraryService.getMovieTags()}function getSets(VideoLibraryService){return VideoLibraryService.getMovieSets()}function getMovie(VideoLibraryService,$stateParams){return VideoLibraryService.getMovieDetails($stateParams.movieid)}angular.module("WIMM.movies",[]).config(config),config.$inject=["gettext","$stateProvider"],getMovies.$inject=["CONFIG","VideoLibraryService","$stateParams"],getRecentlyAdded.$inject=["CONFIG","VideoLibraryService","$stateParams"],getGenres.$inject=["VideoLibraryService"],getTags.$inject=["VideoLibraryService"],getSets.$inject=["VideoLibraryService"],getMovie.$inject=["VideoLibraryService","$stateParams"]}(window.angular),function(angular){"use strict";function config($stateProvider){$stateProvider.state("tvShows",{"abstract":!0,url:"/tv-shows",templateUrl:"assets/templates/tv-shows/index.html"}).state("tvShows.title",{url:"/by-title?page",templateUrl:"assets/templates/tv-shows/show-list.html",controller:"ListShowsCtrl",resolve:{tvShows:getShows}}).state("tvShows.genres",{url:"/by-genre",templateUrl:"assets/templates/tv-shows/group-list.html",controller:"ListShowGroupCtrl",resolve:{groups:getGenres}}).state("tvShows.genre",{url:"/genre/{genre}?page",templateUrl:"assets/templates/tv-shows/show-list.html",controller:"ListShowsCtrl",resolve:{tvShows:getShows}}).state("tvShows.tags",{url:"/by-tag",templateUrl:"assets/templates/tv-shows/group-list.html",controller:"ListShowGroupCtrl",resolve:{groups:getTags}}).state("tvShows.tag",{url:"/tag/{tag}?page",templateUrl:"assets/templates/tv-shows/show-list.html",controller:"ListShowsCtrl",resolve:{tvShows:getShows}}).state("tvShow",{url:"/show-{tvshowid:int}",templateUrl:"assets/templates/tv-shows/show.html",controller:"ShowCtrl",resolve:{tvShow:getShow,seasons:getSeasons}}).state("tvSeason",{url:"/show-{tvshowid:int}/season-{season:int}",templateUrl:"assets/templates/tv-shows/season.html",controller:"SeasonCtrl",resolve:{tvShow:getShow,episodes:getEpisodes}}).state("tvEpisode",{url:"/show-{tvshowid:int}/season-{season:int}/{episodeid:int}-episode-{episode:int}",templateUrl:"assets/templates/tv-shows/episode.html",controller:"EpisodeCtrl",resolve:{tvShow:getShow,episode:getEpisode}})}function getShows(CONFIG,VideoLibraryService,$stateParams){var limits={start:CONFIG.PAGE_SIZE*(($stateParams.page||1)-1)};limits.end=limits.start+CONFIG.PAGE_SIZE;var filter;return $stateParams&&($stateParams.genre?filter={field:"genre",operator:"contains",value:$stateParams.genre}:$stateParams.tag&&(filter={field:"tag",operator:"contains",value:$stateParams.tag})),VideoLibraryService.getTVShows(filter,limits)}function getGenres(VideoLibraryService){return VideoLibraryService.getGenres("tvshow")}function getTags(VideoLibraryService){return VideoLibraryService.getTVShowTags()}function getShow(VideoLibraryService,$stateParams){return VideoLibraryService.getTVShowDetails($stateParams.tvshowid)}function getSeasons(VideoLibraryService,$stateParams){return VideoLibraryService.getSeasons($stateParams.tvshowid)}function getEpisodes(VideoLibraryService,$stateParams){return VideoLibraryService.getEpisodes($stateParams.tvshowid,$stateParams.season)}function getEpisode(VideoLibraryService,$stateParams){return VideoLibraryService.getEpisodeDetails($stateParams.tvshowid,$stateParams.episodeid)}angular.module("WIMM.tvShows",[]).config(config),config.$inject=["$stateProvider"],getShows.$inject=["CONFIG","VideoLibraryService","$stateParams"],getGenres.$inject=["VideoLibraryService"],getTags.$inject=["VideoLibraryService"],getShow.$inject=["VideoLibraryService","$stateParams"],getSeasons.$inject=["VideoLibraryService","$stateParams"],getEpisodes.$inject=["VideoLibraryService","$stateParams"],getEpisode.$inject=["VideoLibraryService","$stateParams"]}(window.angular),function(angular){"use strict";function wimmArrayToList(){return{restrict:"A",require:"ngModel",link:wimmArrayToListLink}}function wimmArrayToListLink(scope,element,attr,ngModel){function parse(value){for(var array=value.split("\n"),i=0,len=array.length;len>i;i++)array[i]=array[i].trim();return array}function format(value){return value.join("\n")}ngModel.$parsers.push(parse),ngModel.$formatters.push(format)}angular.module("WIMM.common").directive("wimmArrayToList",wimmArrayToList)}(window.angular),function(angular){"use strict";function wimmConvertDate(){return{restrict:"A",require:"ngModel",link:wimmConvertDateLink}}function wimmConvertDateLink(scope,element,attr,ngModel){function parse(dt){return dt.toISOString().substr(0,10)}function format(text){var parts=text.split("-"),dt=new Date(parts[0],parts[1]-1,parts[2]);return dt}ngModel.$parsers.push(parse),ngModel.$formatters.push(format)}angular.module("WIMM.common").directive("wimmConvertDate",wimmConvertDate)}(window.angular),function(angular){"use strict";function wimmStringToNumber(){return{restrict:"A",require:"ngModel",link:wimmStringToNumberLink}}function wimmStringToNumberLink(scope,element,attr,ngModel){function parse(value){return"number"!=typeof value&&(value=parseFloat(value)),value}function format(value){return"number"!=typeof value&&(value=parseFloat(value)),value}ngModel.$parsers.push(parse),ngModel.$formatters.push(format)}angular.module("WIMM.common").directive("wimmStringToNumber",wimmStringToNumber)}(window.angular),function(angular){"use strict";function wimmArtworkUrl(value){var url="";return value&&(url="/image/"+encodeURIComponent(value)),url}angular.module("WIMM.common").filter("wimmArtworkUrl",function(){return wimmArtworkUrl})}(window.angular),function(angular){"use strict";function wimmRemoveArticle(title){return title=title||"","the "===title.substr(0,4).toLowerCase()&&(title=title.substr(4)),title}angular.module("WIMM.common").filter("wimmRemoveArticle",function(){return wimmRemoveArticle})}(window.angular),function(angular){"use strict";function episodeCtrl($scope,VideoLibraryService,tvShow,episode){$scope.tvShow=tvShow.tvshowdetails,$scope.episode=episode.episodedetails,$scope.saveChanges=function(episodeid,form){var changes={};return angular.forEach(form,checkForChanges,changes),"{}"===angular.toJson(changes)?(form.$setPristine(),void form.$setUntouched()):void VideoLibraryService.setEpisodeDetails(episodeid,changes).then(function(result){"OK"===result&&(form.$setSubmitted(),form.$setPristine(),form.$setUntouched())})}}function checkForChanges(value){value&&value.$dirty&&(this[value.$name]=value.$modelValue)}angular.module("WIMM.tvShows").controller("EpisodeCtrl",episodeCtrl),episodeCtrl.$inject=["$scope","VideoLibraryService","tvShow","episode"]}(window.angular),function(angular){"use strict";function listGroupCtrl(CONFIG,$scope,gettext,groups){groups.genres?($scope.$parent.sectionTitle=gettext("Genres"),$scope.groups=groups.genres,$scope.link=function(group){return"tvShows.genre("+angular.toJson({genre:group})+")"}):groups.tags&&($scope.$parent.sectionTitle=gettext("Tags"),$scope.groups=groups.tags,$scope.link=function(group){return"tvShows.tag("+angular.toJson({tag:group})+")"})}angular.module("WIMM.tvShows").controller("ListShowGroupCtrl",listGroupCtrl),listGroupCtrl.$inject=["CONFIG","$scope","gettext","groups"]}(window.angular),function(angular){"use strict";function listShowsCtrl(CONFIG,$scope,$state,$stateParams,tvShows){$scope.data=tvShows,$scope.$parent.sectionTitle="",$stateParams.genre?$scope.$parent.sectionTitle=$stateParams.genre:$stateParams.tag&&($scope.$parent.sectionTitle=$stateParams.tag),$scope.itemsPerPage=CONFIG.PAGE_SIZE,$scope.totalItems=tvShows.limits.total,$scope.currentPage=Math.ceil(tvShows.limits.start/$scope.itemsPerPage)+1,$scope.numPages=10,$scope.changePage=function(page){$state.go($state.current.name,{page:page})}}angular.module("WIMM.tvShows").controller("ListShowsCtrl",listShowsCtrl),listShowsCtrl.$inject=["CONFIG","$scope","$state","$stateParams","tvShows"]}(window.angular),function(angular){"use strict";function seasonCtrl($scope,$stateParams,tvShow,episodes){$scope.tvShow=tvShow.tvshowdetails,$scope.season=$stateParams.season,$scope.episodes=episodes.episodes}angular.module("WIMM.tvShows").controller("SeasonCtrl",seasonCtrl),seasonCtrl.$inject=["$scope","$stateParams","tvShow","episodes"]}(window.angular),function(angular){"use strict";function showCtrl($scope,VideoLibraryService,tvShow,seasons){$scope.tvShow=tvShow.tvshowdetails,$scope.seasons=seasons,$scope.viewTvDbPage=function(id){window.open("http://thetvdb.com/index.php?tab=series&id="+id,"WIMM.Ext")},$scope.saveChanges=function(tvshowid,form){var changes={};return angular.forEach(form,checkForChanges,changes),"{}"===angular.toJson(changes)?(form.$setPristine(),void form.$setUntouched()):void VideoLibraryService.setTVShowDetails(tvshowid,changes).then(function(result){"OK"===result&&(form.$setSubmitted(),form.$setPristine(),form.$setUntouched())})}}function checkForChanges(value){value&&value.$dirty&&(this[value.$name]=value.$modelValue)}angular.module("WIMM.tvShows").controller("ShowCtrl",showCtrl),showCtrl.$inject=["$scope","VideoLibraryService","tvShow","seasons"]}(window.angular),function(window,angular){"use strict";function KodiWebSocketService($q,$rootScope,$log,ngSocket,$http){function onMessage(messageObj){var deferred,results;callbacks.hasOwnProperty(messageObj.id)?handleResponse(messageObj):angular.isArray(messageObj)?(deferred=callbacks[messageObj[0].id].cb,results=handleBatchResponse(messageObj),$log.log("kodiService#WS: response recieved. id =",messageObj[0].id,messageObj),$rootScope.$apply(results.errors.length?deferred.reject(results):deferred.resolve(results)),delete callbacks[messageObj.id]):messageObj.hasOwnProperty("method")?handleNotification(messageObj):$log.warn("KodiWebSocket: unknown data recieved.",messageObj)}function handleResponse(messageObj){var deferred=callbacks[messageObj.id].cb;messageObj.hasOwnProperty("result")?($log.log("KodiWebSocket: response recieved. id =",messageObj.id,messageObj.result),$rootScope.$apply(deferred.resolve(messageObj.result))):messageObj.hasOwnProperty("error")?($log.error("KodiWebSocket: error recieved. id =",messageObj.id,messageObj.error),$rootScope.$apply(deferred.reject(messageObj.error))):$log.warn("KodiWebSocket: unknown response. id =",messageObj.id,messageObj),delete callbacks[messageObj.id]}function handleBatchResponse(messageObj){for(var ret={results:[],errors:[]},i=0,len=messageObj.length;len>i;i++)messageObj[i].hasOwnProperty("result")?($log.log("KodiWebSocket: response recieved. id =",messageObj[i].id,messageObj[i].result),ret.results.push(messageObj[i].result)):messageObj[i].hasOwnProperty("error")?($log.error("KodiWebSocket: error recieved. id =",messageObj[i].id,messageObj[i].error),ret.errors.push(messageObj[i].error)):$log.warn("KodiWebSocket: unknown response. id =",messageObj.id,messageObj);return ret}function handleNotification(messageObj){$log.log("KodiWebSocket: notification recieved.",messageObj),$rootScope.$broadcast(messageObj.method,messageObj.params.data)}function sendRequest(request){var defer=$q.defer(),callbackId=getCallbackId();if(callbacks[callbackId]={request:request,cb:defer},angular.isArray(request))for(var i=0,len=request.length;len>i;i++)request[i].id=callbackId;else request.id=callbackId;return $log.log("KodiWebSocket: sending request. id =",callbackId,request),ws.send(angular.toJson(request)),defer.promise}function getCallbackId(){return currentCallbackId+=1,currentCallbackId>1e4&&(currentCallbackId=0),"WIMM-"+currentCallbackId}var KodiWebSocket={},callbacks={},currentCallbackId=0,ws=!1;return KodiWebSocket.connect=function(url){url=url||"ws://"+window.location.hostname+":9090/jsonrpc",$log.log("KodiWSFactory: connecting to ",url),ws=ngSocket(url),ws.onMessage(onMessage,{fromJson:!0})},KodiWebSocket.isConnected=function(){return ws&&ws.readyState===WebSocket.OPEN},KodiWebSocket.disconnect=function(){ws.close()},KodiWebSocket.sendCommand=function(method,params){params=params||{};var request={jsonrpc:"2.0",method:method,params:params,id:"WIMM"},promise=sendRequest(request);return promise},KodiWebSocket.sendBatchCommand=function(method,params){params=params||[{}];var requests=[],promises=[];console.log(method,params);for(var i=0,len=params.length;len>i;i++)requests.push({jsonrpc:"2.0",method:method,params:params[i],id:"WIMM"});return requests.length>0&&(console.log(JSON.stringify(requests).length),promises=$http.post("/jsonrpc",JSON.stringify(requests))),promises},KodiWebSocket}angular.module("WIMM.common").factory("KodiWebSocketService",KodiWebSocketService),KodiWebSocketService.$inject=["$q","$rootScope","$log","ngSocket","$http"]}(window,window.angular),function(angular,_){"use strict";angular.module("WIMM.common").factory("lodash",function(){return _.noConflict()})}(window.angular,window._),function(window,angular){"use strict";function VideoLibraryService($q,$rootScope,$log,$filter,gettext,KodiWebSocketService,lodash){function postLoadCleanUp(value,fieldName){"sorttitle"!==fieldName||value&&0!==value.length?"votes"!==fieldName&&"top250"!==fieldName||angular.isNumber(value)?"rating"!==fieldName||angular.isNumber(value)||(this.rating=parseFloat(value),isNaN(this.rating)&&(this.rating=value,$log.error(gettext("Unable to parse %s as a float. [%s]"),fieldName,value))):(this[fieldName]=parseInt(value),isNaN(this[fieldName])&&(this[fieldName]=value,$log.error(gettext("Unable to parse %s as an integer. [%s]"),fieldName,value))):this[fieldName]=$filter("wimmRemoveArticle")(this.title)}function preSaveCleanUp(value,fieldName){"sorttitle"===fieldName&&value&&value===$filter("wimmRemoveArticle")(this.title)?this[fieldName]=null:"votes"===fieldName?this[fieldName]=value.toString():"rating"===fieldName&&(this[fieldName]=parseFloat(value.toFixed(1)))}var Service={ws:KodiWebSocketService},movieBasicProperties=["title","year","thumbnail","tag"],movieDetailedProperties=["title","genre","year","rating","director","trailer","tagline","plot","plotoutline","originaltitle","lastplayed","playcount","writer","studio","mpaa","cast","country","imdbnumber","runtime","set","showlink","streamdetails","top250","votes","fanart","thumbnail","file","sorttitle","resume","dateadded","tag","art"],tvShowBasicProperties=["title","thumbnail","tag"],tvShowDetailedProperties=["title","genre","rating","plot","studio","mpaa","playcount","imdbnumber","premiered","votes","lastplayed","originaltitle","sorttitle","episodeguide","tag"],seasonProperties=["season","thumbnail"],episodeBasicProperties=["title","episode","thumbnail"],episodeDetailedProperties=["title","playcount","runtime","director","plot","rating","votes","lastplayed","writer","firstaired","season","episode","originaltitle"];return Service.getGenres=function(type){console.assert(void 0!==type,"type shoud be either movie, tvshow or musicvideo");var promise=Service.ws.sendCommand("VideoLibrary.GetGenres",{type:type,properties:["title"],sort:{order:"ascending",ignorearticle:!0,method:"title"}});return promise},Service.getMovieSets=function(){var promise=Service.ws.sendCommand("VideoLibrary.GetMovieSets",{properties:["title"],sort:{order:"ascending",ignorearticle:!0,method:"title"}});return promise},Service.getMovieTags=function(){var promise=Service.getMovies({field:"tag",operator:"greaterthan",value:"0"}).then(angular.bind(this,function(result){for(var movie,tags=[],groups=[],i=0,iLen=result.movies.length;iLen>i;i++)if(movie=result.movies[i],angular.isArray(movie.tag))for(var j=0,jLen=movie.tag.length;jLen>j;j++)lodash.contains(tags,movie.tag[j])||(tags.push(movie.tag[j]),groups.push({title:movie.tag[j]}));return{tags:groups,limits:{start:0,end:groups.length,total:groups.length}}}));return promise},Service.getMovies=function(filter,limits){var params={properties:movieBasicProperties,sort:{order:"ascending",ignorearticle:!0,method:"sorttitle"}};angular.isUndefined(filter)||(params.filter=filter),angular.isUndefined(limits)||(params.limits=limits);var promise=Service.ws.sendCommand("VideoLibrary.GetMovies",params),defer=$q.defer();return promise.then(function(result){if(result.movies)for(var i=0;i<result.movies.length;i++)angular.forEach(result.movies[i],postLoadCleanUp,result.movies[i]);else result.movies=[];defer.resolve(result)},function(error){defer.reject(error)}),defer.promise},Service.getMovieDetails=function(movieid){if(0>movieid)return void $log.error("kodi.VideoLibraryService#getMovie: movieid must be >= 0.",movieid);var promise=Service.ws.sendCommand("VideoLibrary.GetMovieDetails",{movieid:movieid,properties:movieDetailedProperties}),defer=$q.defer();return promise.then(function(result){angular.forEach(result.moviedetails,postLoadCleanUp,result.moviedetails),defer.resolve(result)},function(error){defer.reject(error)}),defer.promise},Service.setMovieDetails=function(movieid,updates){angular.forEach(updates,preSaveCleanUp,updates),updates.movieid=movieid;var promise=Service.ws.sendCommand("VideoLibrary.SetMovieDetails",updates);return promise},Service.getRecentlyAddedMovies=function(limits){var params={properties:movieBasicProperties,sort:{order:"descending",ignorearticle:!0,method:"dateadded"}};angular.isUndefined(limits)||(params.limits=limits);var promise=Service.ws.sendCommand("VideoLibrary.GetRecentlyAddedMovies",params),defer=$q.defer();return promise.then(function(result){if(result.movies)for(var i=0;i<result.movies.length;i++)angular.forEach(result.movies[i],postLoadCleanUp,result.movies[i]);else result.movies=[];defer.resolve(result)},function(error){defer.reject(error)}),defer.promise},Service.getTVShows=function(filter,limits){var params={properties:tvShowBasicProperties,sort:{order:"ascending",ignorearticle:!0,method:"sorttitle"}};angular.isUndefined(filter)||(params.filter=filter),angular.isUndefined(limits)||(params.limits=limits);var promise=Service.ws.sendCommand("VideoLibrary.GetTVShows",params),defer=$q.defer();return promise.then(function(result){if(result.tvshows)for(var i=0;i<result.tvshows.length;i++)angular.forEach(result.tvshows[i],postLoadCleanUp,result.tvshows[i]);else result.tvshows=[];defer.resolve(result)},function(error){defer.reject(error)}),defer.promise},Service.getTVShowDetails=function(tvshowid){if(0>tvshowid)return void $log.error("kodi.VideoLibraryService#getTVShow: tvshowid must be >= 0.",tvshowid);var promise=Service.ws.sendCommand("VideoLibrary.GetTVShowDetails",{tvshowid:tvshowid,properties:tvShowDetailedProperties}),defer=$q.defer();return promise.then(function(result){angular.forEach(result.tvshowdetails,postLoadCleanUp,result.tvshowdetails),defer.resolve(result)},function(error){defer.reject(error)}),defer.promise},Service.getSeasons=function(tvshowid){if(0>tvshowid)return void $log.error("kodi.VideoLibraryService#getSeasons: tvshowid must be >= 0.",tvshowid);var promise=Service.ws.sendCommand("VideoLibrary.GetSeasons",{tvshowid:tvshowid,properties:seasonProperties});return promise},Service.getEpisodes=function(tvshowid,season){if(0>tvshowid)return void $log.error("kodi.VideoLibraryService#getSeasons: tvshowid must be >= 0.",tvshowid);var promise=Service.ws.sendCommand("VideoLibrary.GetEpisodes",{tvshowid:tvshowid,season:season,properties:episodeBasicProperties}),defer=$q.defer();return promise.then(function(result){if(result.episodes)for(var i=0;i<result.episodes.length;i++)angular.forEach(result.episodes[i],postLoadCleanUp,result.episodes[i]);else result.episodes=[];defer.resolve(result)},function(error){defer.reject(error)}),defer.promise},Service.getEpisodeDetails=function(tvshowid,episodeid){if(0>tvshowid)return void $log.error("kodi.VideoLibraryService#getSeasons: tvshowid must be >= 0.",tvshowid);var promise=Service.ws.sendCommand("VideoLibrary.GetEpisodeDetails",{episodeid:episodeid,properties:episodeDetailedProperties}),defer=$q.defer();return promise.then(function(result){angular.forEach(result.episodedetails,postLoadCleanUp,result.episodedetails),defer.resolve(result)},function(error){defer.reject(error)}),defer.promise},Service.setTVShowDetails=function(tvshowid,updates){angular.forEach(updates,preSaveCleanUp,updates),updates.tvshowid=tvshowid;var promise=Service.ws.sendCommand("VideoLibrary.SetTVShowDetails",updates);return promise},Service.setEpisodeDetails=function(episodeid,updates){angular.forEach(updates,preSaveCleanUp,updates),updates.episodeid=episodeid;var promise=Service.ws.sendCommand("VideoLibrary.SetEpisodeDetails",updates);return promise},Service.getTVShowTags=function(){var promise=Service.getTVShows({field:"tag",operator:"greaterthan",value:"0"}).then(angular.bind(this,function(result){for(var show,tags=[],groups=[],i=0,iLen=result.tvshows.length;iLen>i;i++)if(show=result.tvshows[i],angular.isArray(show.tag))for(var j=0,jLen=show.tag.length;jLen>j;j++)lodash.contains(tags,show.tag[j])||(tags.push(show.tag[j]),groups.push({title:show.tag[j]}));return{tags:groups,limits:{start:0,end:groups.length,total:groups.length}}}));return promise},Service}angular.module("WIMM.common").factory("VideoLibraryService",VideoLibraryService),VideoLibraryService.$inject=["$q","$rootScope","$log","$filter","gettext","KodiWebSocketService","lodash"]}(window,window.angular),function(angular){"use strict";function listGroupCtrl(CONFIG,$scope,gettext,groups){groups.genres?($scope.$parent.sectionTitle=gettext("Genres"),$scope.groups=groups.genres,$scope.link=function(group){return"movies.genre("+angular.toJson({genre:group})+")"}):groups.sets?($scope.$parent.sectionTitle=gettext("Sets"),$scope.groups=groups.sets,$scope.link=function(group){return"movies.set("+angular.toJson({set:group})+")"}):groups.tags&&($scope.$parent.sectionTitle=gettext("Tags"),$scope.groups=groups.tags,$scope.link=function(group){return"movies.tag("+angular.toJson({tag:group})+")"})}angular.module("WIMM.movies").controller("ListMovieGroupCtrl",listGroupCtrl),listGroupCtrl.$inject=["CONFIG","$scope","gettext","groups"]}(window.angular),function(angular){"use strict";function listMoviesCtrl(CONFIG,$scope,$state,$stateParams,movies){$scope.data=movies,$scope.$parent.sectionTitle="",$stateParams.set?$scope.$parent.sectionTitle=$stateParams.set:$stateParams.genre?$scope.$parent.sectionTitle=$stateParams.genre:$stateParams.tag?$scope.$parent.sectionTitle=$stateParams.tag:$state.current.data&&$state.current.data.sectionTitle&&($scope.$parent.sectionTitle=$state.current.data.sectionTitle),$scope.itemsPerPage=CONFIG.PAGE_SIZE,$scope.totalItems=movies.limits.total,$scope.currentPage=Math.ceil(movies.limits.start/$scope.itemsPerPage)+1,$scope.numPages=10,$scope.changePage=function(page){$state.go($state.current.name,{page:page})}}angular.module("WIMM.movies").controller("ListMoviesCtrl",listMoviesCtrl),listMoviesCtrl.$inject=["CONFIG","$scope","$state","$stateParams","movies"]}(window.angular),function(angular){"use strict";function movieCtrl($scope,VideoLibraryService,movie){$scope.movie=movie.moviedetails,$scope.saveChanges=function(movieid,form){var changes={};return angular.forEach(form,checkForChanges,changes),"{}"===angular.toJson(changes)?(form.$setPristine(),void form.$setUntouched()):void VideoLibraryService.setMovieDetails(movieid,changes).then(function(result){"OK"===result&&(form.$setSubmitted(),form.$setPristine(),form.$setUntouched())})}}function checkForChanges(value){value&&value.$dirty&&(this[value.$name]=value.$modelValue)}angular.module("WIMM.movies").controller("MovieCtrl",movieCtrl),movieCtrl.$inject=["$scope","VideoLibraryService","movie"]}(window.angular),function(angular,$,FastClick){"use strict";function config($urlRouterProvider,$stateProvider,$locationProvider){$urlRouterProvider.otherwise("/movies/recently-added"),$stateProvider.state("about",{url:"/about",templateUrl:"assets/templates/about.html"}).state("musicVideos",{url:"/music-videos",templateUrl:"assets/templates/music-videos/index.html"}).state("music",{url:"/music",templateUrl:"assets/templates/music/index.html"}),$locationProvider.html5Mode({enabled:!1,requireBase:!1}),$locationProvider.hashPrefix("!")}function run(gettextCatalog){FastClick.attach(document.body),gettextCatalog.setCurrentLanguage("en_GB")}function appCtrl(PKG,$rootScope,$scope,$log,gettext,KodiWebSocketService){$scope.PKG=PKG,$scope.version=PKG.version,$scope.kodiVersion=gettext("not connected"),$scope.kodiVersionExtra="",$scope.apiVersion=gettext("not connected"),$scope.connected=!1,$scope.init=function(){$log.log("Thunderbirds are go!"),KodiWebSocketService.connect(),KodiWebSocketService.sendCommand("JSONRPC.Version").then(function(result){$scope.apiVersion=result.version.major+"."+result.version.minor+"."+result.version.patch}),KodiWebSocketService.sendCommand("Application.GetProperties",{properties:["version"]}).then(function(result){$scope.kodiVersion=result.version.major+"."+result.version.minor,$scope.kodiVersionExtra=result.version.tag+"-"+result.version.revision})},$rootScope.$on("$stateChangeStart",function(){$("#loading-screen").addClass("show")}),$rootScope.$on("$stateChangeSuccess",function(){$("#loading-screen").removeClass("show")}),$rootScope.$on("$stateChangeError",function(event,toState,toParams,fromState,fromParams,error){event.preventDefault(),$log.log(error)})}angular.module("WIMM",["ui.router","ngAnimate","gettext","mm.foundation","WIMM.common","WIMM.movies","WIMM.tvShows"]).config(config).run(run).constant("CONFIG",{PAGE_SIZE:504}).controller("AppCtrl",appCtrl),config.$inject=["$urlRouterProvider","$stateProvider","$locationProvider"],run.$inject=["gettextCatalog"],appCtrl.$inject=["PKG","$rootScope","$scope","$log","gettext","KodiWebSocketService"]}(window.angular,window.jQuery,window.FastClick),function(module){try{module=angular.module("WIMM")}catch(e){module=angular.module("WIMM",[])}module.constant("PKG",{name:"webinterface.wimm-ng",version:"5.0.3",description:"A web interface for managing the Kodi media library.",license:{type:"GPL",url:"https://github.com/fyfe/WIMM-ng/raw/master/LICENSE"},author:{name:"Andrew Fyfe",email:"[email protected]"},contributors:[{name:"",email:""}],homepage:"https://github.com/fyfe/WIMM-ng",support:"http://forum.kodi.tv/showthread.php?tid=188839",repository:{type:"git",url:"https://github.com/fyfe/WIMM-ng.git"},bugs:{url:"https://github.com/fyfe/WIMM-ng/issues"}})}();
//# sourceMappingURL=app.js.map
Can anyone tell me where the fanart for sets is stored?
All art is stored in userdata (wiki) Thumbnails folder
(2015-06-17, 10:13)uNiversal Wrote: All art is stored in userdata (wiki) Thumbnails folder

Ah ha! That's why my set fanart wasn't transferred when I copied my data to a different Kodi installation. All the other fanart was stored in folders with the files, since I had exported them from the database.

Oh well, it isn't that hard to rebuild the fanart for the sets manually.
No thats not it, the texture13db need to repopulate again and if it ist you get nothing.
Very nice tool :-)

Two remarks I have:

- I have an empty entry which I cannot delete - so a delte butto would be great
- I have multiple genres that are actually the same. It would be good to be able to rename a dupe and have that genre retagged on all files. This way it would be easy to clean up by renaming the dupes to match with the genre that you want to keep. I tried but the movie that should have appeared in the master genre didn't.

Hope this is somewhat understandable.
I've tried installing both 4.x and 5.x versions via the "install from zip file" method (under Isengard RC1) but all attempts bring up an an error about the file not being the correct structure.

Any ideas

Edit. 4.20 installs OK
I just installed this and it's almost everything I've wanted. I'm not sure if it's possible but could you add the ability to change the time/duration of tv shows? Great work!
Brevity should never equate to rudeness.
Rubicon:
not really a solution, but a workaround/hack. i know the problem from other plugins. mostly if you copy them manually to the right location it should work. just go the the addon folder (in linux it's ~/.xbmc/addons/ (or with newer version it might be .kodi instead of .xbmc). you might need to make a new folder here and copy the things from the zip in here).
Check out my plugin yarc, it's a web-remote optimised for all screen sizes (especially touch and small screen).
Rubicon, we going to need specific information about which version addons you were trying to install in which Kodi version. The workaround isn't advised at all since if the issue could be the addon.xml dependency entry and even by doing the workaround you may or may not end up with a non working addon.

But cant say really the issues of that caused that error have been fixed in all builds, you just need to install the correct plugin in the correct kodi version..
  • 1
  • 14
  • 15
  • 16(current)
  • 17
  • 18
  • 19

Logout Mark Read Team Forum Stats Members Help
[Helix-Isengard] WiMM - Web interface Media Manager for Kodi1