From 5cfe3a0eccb7ea986235f7155b79449ed4fe8f68 Mon Sep 17 00:00:00 2001 From: lucas_nz Date: Mon, 15 Dec 2014 20:25:09 +1300 Subject: [PATCH] Sorting improvements - now sorts by time metadata field (or originalAirDate if time is set to oad). --- content/main.css | 22 ++++++++++++++++++++ plugin.py | 14 +++++++++++-- plugins/video/templates/container_html.tmpl | 26 +++++++++++++++++++++--- plugins/video/video.py | 31 +++++++++++++++++++++++++---- 4 files changed, 84 insertions(+), 9 deletions(-) diff --git a/content/main.css b/content/main.css index d3089de..71c65f2 100644 --- a/content/main.css +++ b/content/main.css @@ -89,6 +89,28 @@ div.button { text-align: left; } +td.downarrow { + background-repeat: no-repeat; + background-position: center right; + padding-right: 21px; + background-image: url(data:image/gif;base64,R0lGODlhFQAEAIABAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjAzODAxMTc0MDcyMDY4MTE4OEM2REYyN0ExMDhBNDJFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjdCNTAyODc0MEY4NjExRTBBMzkyQzAyM0E1RDk3RDc3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdCNTAyODczMEY4NjExRTBBMzkyQzAyM0E1RDk3RDc3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgTWFjaW50b3NoIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDM4MDExNzQwNzIwNjgxMTg4QzZERjI3QTEwOEE0MkUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDM4MDExNzQwNzIwNjgxMTg4QzZERjI3QTEwOEE0MkUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQDw4NDAsKCQgHBgUEAwIBAAAh+QQBAAABACwAAAAAFQAEAAACDYwfoAvoz9qbZ9FrJC0AOw==); + cursor: pointer; +} +td.uparrow { + background-repeat: no-repeat; + background-position: center right; + padding-right: 21px; + background-image: url(data:image/gif;base64,R0lGODlhFQAEAIABAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjAyODAxMTc0MDcyMDY4MTE4OEM2REYyN0ExMDhBNDJFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjhFNzNGQjI3MEY4NjExRTBBMzkyQzAyM0E1RDk3RDc3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjhFNzNGQjI2MEY4NjExRTBBMzkyQzAyM0E1RDk3RDc3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgTWFjaW50b3NoIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDI4MDExNzQwNzIwNjgxMTg4QzZERjI3QTEwOEE0MkUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDI4MDExNzQwNzIwNjgxMTg4QzZERjI3QTEwOEE0MkUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQDw4NDAsKCQgHBgUEAwIBAAAh+QQBAAABACwAAAAAFQAEAAACDYyPAcmtsJyDVDKKWQEAOw==); + cursor: pointer; +} +td.updownarrow { + background-repeat: no-repeat; + background-position: center right; + padding-right: 21px; + background-image: url(data:image/gif;base64,R0lGODlhFQAJAIABAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjAxODAxMTc0MDcyMDY4MTE4OEM2REYyN0ExMDhBNDJFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjdCNTAyODcwMEY4NjExRTBBMzkyQzAyM0E1RDk3RDc3IiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdCNTAyODZGMEY4NjExRTBBMzkyQzAyM0E1RDk3RDc3IiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgTWFjaW50b3NoIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDE4MDExNzQwNzIwNjgxMTg4QzZERjI3QTEwOEE0MkUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDE4MDExNzQwNzIwNjgxMTg4QzZERjI3QTEwOEE0MkUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQDw4NDAsKCQgHBgUEAwIBAAAh+QQBAAABACwAAAAAFQAJAAACF4yPgMsJ2mJ4VDKKrd4GVz5lYPeMiVUAADs=); + cursor: pointer; +} + /* Smartphones (portrait and landscape) ----------- */ @media only screen and (max-width : 480px) { diff --git a/plugin.py b/plugin.py index 66e8749..15a43db 100644 --- a/plugin.py +++ b/plugin.py @@ -219,12 +219,22 @@ class Plugin(object): def date_sort(x, y): return cmp(y.mdate, x.mdate) - sortby = query.get('SortOrder', ['Normal'])[0] + def name_sort_rev(x, y): + return cmp(y.name, x.name) + + def date_sort_rev(x, y): + return cmp(x.mdate, y.mdate) + + sortby = query.get('SortOrder', ['Normal'])[0].lower() if filelist.unsorted or filelist.sortby != sortby: if force_alpha: filelist.files.sort(dir_sort) - elif sortby == '!CaptureDate': + elif sortby == '!capturedate': filelist.files.sort(date_sort) + elif sortby == 'capturedate': + filelist.files.sort(date_sort_rev) + elif sortby == '!normal': + filelist.files.sort(name_sort_rev) else: filelist.files.sort(name_sort) diff --git a/plugins/video/templates/container_html.tmpl b/plugins/video/templates/container_html.tmpl index 51f133c..d2b05b7 100644 --- a/plugins/video/templates/container_html.tmpl +++ b/plugins/video/templates/container_html.tmpl @@ -41,12 +41,32 @@ Push from $folders[0] ## Header Row - - + #set $arrowicon = 'updownarrow' + #set sortorder = 'CaptureDate' + #if $sortby == '!capturedate' + #set $arrowicon = 'downarrow' + #end if + #if $sortby == 'capturedate' + #set $sortorder = '!CaptureDate' + #set $arrowicon = 'uparrow' + #end if + #set $i = 0 ## i variable is used to alternate colors of row diff --git a/plugins/video/video.py b/plugins/video/video.py index 39187d7..38e287d 100644 --- a/plugins/video/video.py +++ b/plugins/video/video.py @@ -21,6 +21,8 @@ import qtfaststart import transcode from plugin import EncodeUnicode, Plugin, quote +from operator import itemgetter + logger = logging.getLogger('pyTivo.video.video') SCRIPTDIR = os.path.dirname(__file__) @@ -399,8 +401,8 @@ class BaseVideo(Plugin): try: now = isodt(data['time']) except: - logger.warning('Bad time format: ' + data['time'] + - ' , using current time') + logger.warning('Bad time format: "' + data['time'] + + '", using current time') duration = self.__duration(full_path) duration_delta = timedelta(milliseconds = duration) @@ -438,6 +440,7 @@ class BaseVideo(Plugin): videos = [] local_base_path = self.get_local_base_path(handler, query) + resort = False for f in files: video = VideoDetails() mtime = f.mdate @@ -465,12 +468,22 @@ class BaseVideo(Plugin): if video['valid']: video.update(self.metadata_full(f.name, tsn, mtime=mtime)) - if len(files) == 1: - video['captureDate'] = hex(isogm(video['time'])) else: video['valid'] = True video.update(metadata.basic(f.name, mtime)) + if 'time' in video and video['time'] != '': + if video['time'].lower() == 'oad': + video['time'] = video['originalAirDate'] + resort = True + try: + video['captureDate'] = hex(isogm(video['time'])) + video['textDate'] = time.strftime('%b %d, %Y', time.localtime(isogm(video['time']))) + resort = True + except: + logger.warning('Bad time format: "' + video['time'] + + '", using current time') + if self.use_ts(tsn, f.name): video['mime'] = 'video/x-tivo-mpeg-ts' else: @@ -485,6 +498,16 @@ class BaseVideo(Plugin): else: t = Template(XML_CONTAINER_TEMPLATE, filter=EncodeUnicode) + sortby = query.get('SortOrder', ['Normal'])[0].lower() + t.sortby = sortby + if use_html and resort: + if sortby == 'capturedate': + logger.info('re-sorting by captureDate, reverse=True') + videos.sort(key=itemgetter('captureDate'), reverse=True) + elif sortby == '!capturedate': + logger.info('re-sorting by captureDate, reverse=False') + videos.sort(key=itemgetter('captureDate'), reverse=False) + t.container = handler.cname t.name = subcname t.total = total -- 2.11.4.GIT
+ #set $arrowicon = 'updownarrow' + #set sortorder = 'Normal' + #if $sortby == '!normal' + #set $arrowicon = 'downarrow' + #end if + #if $sortby == 'normal' + #set sortorder = '!Normal' + #set $arrowicon = 'uparrow' + #end if + - Title + Title SizeCapture Date + Capture Date +