diff --git a/pandora/config.indiancinema.jsonc b/pandora/config.indiancinema.jsonc index f04949a8..d2a69098 100644 --- a/pandora/config.indiancinema.jsonc +++ b/pandora/config.indiancinema.jsonc @@ -36,6 +36,7 @@ "canEditRightsLevel": {"researcher": true, "staff": true, "admin": true}, "canEditSitePages": {"staff": true, "admin": true}, "canEditUsers": {"staff": true, "admin": true}, + "canExportAnnotations": {"member": true, "researcher": true, "staff": true, "admin": true}, "canImportAnnotations": {"researcher": true, "staff": true, "admin": true}, "canManageDocuments": {"member": true, "researcher": true, "staff": true, "admin": true}, "canManagePlacesAndEvents": {"member": true, "researcher": true, "staff": true, "admin": true}, diff --git a/pandora/config.padma.jsonc b/pandora/config.padma.jsonc index 969ce881..e69de29b 100644 --- a/pandora/config.padma.jsonc +++ b/pandora/config.padma.jsonc @@ -1,802 +0,0 @@ -/* - Pan.do/ra Settings - - You can edit this file. -*/ -{ - "annotations": { - "showUsers": true - }, - "cantPlay": { - "icon": "", - "link": "", - "text": "" - }, - /* - Capabilities are per user level. - They can either be general: - {level: true} means a user of that level has the capability) - or related to items: - {level: x} means a user of that level has the capability - for items of a rights level up to and including x - */ - "capabilities": { - "canAddItems": {"member": true, "staff": true, "admin": true}, - "canDownloadVideo": {"guest": 0, "member": 0, "staff": 4, "admin": 4}, - "canEditAnnotations": {"staff": true, "admin": true}, - "canEditDocuments": {"staff": true, "admin": true}, - "canEditEvents": {"staff": true, "admin": true}, - "canEditFeaturedEdits": {"staff": true, "admin": true}, - "canEditFeaturedLists": {"staff": true, "admin": true}, - "canEditFeaturedTexts": {"staff": true, "admin": true}, - "canEditMedia": {"staff": true, "admin": true}, - "canEditMetadata": {"staff": true, "admin": true}, - "canEditPlaces": {"staff": true, "admin": true}, - "canEditRightsLevel": {"member": true, "staff": true, "admin": true}, - "canEditSitePages": {"staff": true, "admin": true}, - "canEditUsers": {"admin": true}, - "canImportAnnotations": {"member": true, "staff": true, "admin": true}, - "canManageDocuments": {"member": true, "staff": true, "admin": true}, - "canManagePlacesAndEvents": {"member": true, "staff": true, "admin": true}, - "canManageTitlesAndNames": {"member": true, "staff": true, "admin": true}, - "canManageUsers": {"staff": true, "admin": true}, - "canPlayClips": {"guest": 1, "member": 1, "staff": 4, "admin": 4}, - "canPlayVideo": {"guest": 1, "member": 1, "staff": 4, "admin": 4}, - "canReadText": {"guest": 0, "member": 0, "staff": 1, "admin": 1}, - "canRemoveItems": {"admin": true}, - "canSeeAccessed": {"staff": true, "admin": true}, - "canSeeDebugMenu": {"staff": true, "admin": true}, - "canSeeExtraItemViews": {"staff": true, "admin": true}, - "canSeeMedia": {"staff": true, "admin": true}, - "canSeeItem": {"guest": 1, "member": 1, "staff": 4, "admin": 4}, - "canSeeSize": {"staff": true, "admin": true}, - "canSeeSoftwareVersion": {"staff": true, "admin": true}, - "canSendMail": {"staff": true, "admin": true} - }, - /* - clipKeys are the properties that clips can be sorted by. - If sortOperator is not specified, it will be + for strings and - for numbers. - */ - "clipKeys": [ - {"id": "text", "title": "Text", "type": "string"}, - {"id": "position", "title": "Position", "type": "float", "sortOperator": "+"}, - {"id": "duration", "title": "Duration", "type": "float"}, - {"id": "hue", "title": "Hue", "type": "float", "sortOperator": "+"}, - {"id": "saturation", "title": "Saturation", "type": "float"}, - {"id": "lightness", "title": "Lightness", "type": "float"}, - {"id": "volume", "title": "Volume", "type": "float"} - ], - /* - clipLayers is the ordered list of public layers that will appear as the - text of clips. Excluding a layer from this list means it will not be - included in find annotations. // FIXME: the last bit is not implemented. - */ - "clipLayers": ["transcripts", "keywords", "places", "events", "descriptions"], - "flags": false, - "help": [ - {"id": "help", "title": "Help"}, - {"id": "accounts", "title": "Accounts"}, - {"id": "navigation", "title": "Navigation"}, - {"id": "views", "title": "Views"}, - {"id": "timelines", "title": "Timelines"}, - {"id": "clips", "title": "Clips"}, - {"id": "maps", "title": "Maps"}, - {"id": "calendars", "title": "Calendars"}, - {"id": "find", "title": "Find"}, - {"id": "filters", "title": "Filters"}, - {"id": "lists", "title": "Lists"}, - {"id": "player", "title": "Player"}, - {"id": "editor", "title": "Editor"}, - {"id": "documents", "title": "Documents"}, - {"id": "edits", "title": "Edits"}, - {"id": "texts", "title": "Texts"}, - {"id": "embeds", "title": "Embeds"} - ], - /* - An itemKey must have the following properties: - id: The id of the key (as known by the server) - title: The title of the key (as displayed by the client) - type: text, string, float, integer, or array of any of these - and can have any of the following properties: - autocomplete: If true, find element will autocomplete - autocompleteSort: Sort order of autocomplete suggestions - capability: A capability required to see this key - columnRequired: If true, the column can't be removed - columnWidth: Default column width in px - filter: if true, one can filter results by this key - find: If true, this key will appear as a find option - format: {type: "...", args: [...]}, for special formatting - (Ox.formatType(args) will be called) - secondaryId: If true, loading /value will redirect to the item - sort: If true, one can sort results by this key - sortOperator: sort operator (+, -), in case it differs from the - default for the key's type (+ for strings, - for numbers) - sortType: special sort type (title, person) - value: {key: "...", type: "..."}, for keys that are derived - from other keys (like number of actors), or "capability" - */ - "itemKeys": [ - { - "id": "*", - "title": "All", - "type": "text", - "find": true - }, - { - "id": "title", - "title": "Title", - "type": "string", - "autocomplete": true, - "autocompleteSort": [{"key": "timesaccessed", "operator": "-"}], - "columnRequired": true, - "columnWidth": 180, - "find": true, - "sort": true, - "sortType": "title" - }, - { - "id": "source", - "title": "Source", - "type": "string", - "autocomplete": true, - "description": true, - "columnWidth": 180, - "filter": true, - "find": true, - "sort": true - }, - { - "id": "project", - "title": "Project", - "type": "string", - "autocomplete": true, - "description": true, - "columnWidth": 120, - "filter": true, - "find": true, - "sort": true - }, - { - "id": "topic", - "title": "Topic", - "type": ["string"], - "autocomplete": true, - "columnWidth": 180, - "filter": true, - "find": true, - "sort": true - }, - { - "id": "name", - "title": "People", - "type": ["string"], - "autocomplete": true, - "filter": true, - "find": true - }, - { - "id": "director", - "title": "Director", - "type": ["string"], - "autocomplete": true, - "columnRequired": true, - "columnWidth": 180, - "sort": true, - "sortType": "person" - }, - { - "id": "cinematographer", - "title": "Cinematographer", - "type": ["string"], - "autocomplete": true, - "columnWidth": 180, - "sort": true, - "sortType": "person" - }, - { - "id": "featuring", - "title": "Featuring", - "type": ["string"], - "autocomplete": true, - "columnRequired": true, - "columnWidth": 180, - "filter": true, - "sort": true, - "sortType": "person" - }, - { - "id": "language", - "title": "Language", - "type": ["string"], - "autocomplete": true, - "columnWidth": 120, - "filter": true, - "find": true, - "sort": true - }, - { - "id": "location", - "title": "Location", - "type": "string", - "autocomplete": true, - "columnWidth": 180, - "filter": true, - "find": true, - "sort": true - }, - { - "id": "date", - "title": "Date", - "type": "string", - "columnWidth": 120, - //"format": {"type": "date", "args": ["%a, %b %e, %Y"]}, - "sort": true - }, - { - "id": "summary", - "title": "Summary", - "type": "text", - "find": true - }, - { - "id": "notes", - "title": "Notes", - "type": "text", - "capability": "canEditMetadata" - }, - { - "id": "id", - "title": "ID", - "type": "string", - "columnWidth": 90, - "sort": true - }, - { - "id": "annotations", - "title": "Annotations", - "type": "string", // fixme: not the best type for this magic key - "find": true - }, - { - "id": "places", - "title": "Places", - "type": "layer", - "filter": true, - "find": true - }, - { - "id": "events", - "title": "Events", - "type": "layer", - "filter": true, - "find": true - }, - { - "id": "keywords", - "title": "Keywords", - "type": "layer", - "filter": true, - "find": true - }, - { - "id": "descriptions", - "title": "Descriptions", - "type": "layer", - "find": true - }, - { - "id": "transcripts", - "title": "Transcripts", - "type": "layer", - "find": true - }, - { - "id": "numberofannotations", - "title": "Annotations", - "type": "integer", - "columnWidth": 60, - "sort": true - }, - { - "id": "duration", - "title": "Duration", - "type": "time", - "columnWidth": 90, - "format": {"type": "duration", "args": [0, "short"]}, - "sort": true - }, - { - "id": "resolution", - "title": "Resolution", - "type": ["integer"], - "columnWidth": 90, - "format": {"type": "resolution", "args": ["px"]}, - "sort": true - }, - { - "id": "aspectratio", - "title": "Aspect Ratio", - "type": "float", - "columnWidth": 90, - "format": {"type": "unit", "args": [":1", 3]}, - "sort": true - }, - { - "id": "pixels", - "title": "Pixels", - "type": "integer", - "columnWidth": 90, - "format": {"type": "value", "args": ["px"]}, - "sort": true - }, - { - "id": "hue", - "title": "Hue", - "type": "hue", - "columnWidth": 90, - "format": {"type": "color", "args": ["hue"]}, - "sort": true, - "sortOperator": "+" - }, - { - "id": "saturation", - "title": "Saturation", - "type": "float", - "columnWidth": 90, - "format": {"type": "color", "args": ["saturation"]}, - "sort": true - }, - { - "id": "lightness", - "title": "Lightness", - "type": "float", - "columnWidth": 90, - "format": {"type": "color", "args": ["lightness"]}, - "sort": true - }, - { - "id": "volume", - "title": "Volume", - "type": "float", - "columnWidth": 60, - "format": {"type": "color", "args": ["lightness"]}, - "sort": true - }, - { - "id": "numberofcuts", - "title": "Number of Cuts", - "type": "integer", - "columnWidth": 60, - "format": {"type": "number", "args": []}, - "sort": true, - "value": {"key": "cuts", "type": "length"} - }, - { - "id": "cutsperminute", - "title": "Cuts per Minute", - "type": "float", - "columnWidth": 60, - "format": {"type": "number", "args": [3]}, - "sort": true, - "value": {"key": "cuts", "type": "lengthperminute"} - }, - { - "id": "words", - "title": "Number of Words", - "type": "integer", - "columnWidth": 60, - "format": {"type": "number", "args": []}, - "sort": true, - "value": {"layer": "transcripts", "type": "words"} - }, - { - "id": "wordsperminute", - "title": "Words per Minute", - "type": "float", - "columnWidth": 60, - "format": {"type": "number", "args": [3]}, - "sort": true, - "value": {"layer": "transcripts", "type": "wordsperminute"} - }, - { - "id": "size", - "title": "Size", - "type": "integer", - "capability": "canSeeMedia", - "columnWidth": 60, - "format": {"type": "value", "args": ["B"]}, - "sort": true - }, - { - "id": "bitrate", - "title": "Bitrate", - "type": "integer", - "columnWidth": 60, - "format": {"type": "value", "args": ["bps"]}, - "sort": true - }, - { - "id": "numberoffiles", - "title": "Number of Files", - "type": "integer", - "capability": "canSeeMedia", - "columnWidth": 60, - "sort": true, - "value": {"key": "files", "type": "length"} - }, - { - "id": "user", - "title": "User", - "type": "string", - "capability": "canSeeMedia", - "find": true - }, - { - "id": "groups", - "title": "Group", - "type": ["string"] - }, - { - "id": "filename", - "title": "Filename", - "type": ["string"], - "capability": "canSeeMedia", - "find": true - }, - { - "id": "created", - "title": "Date Created", - "type": "date", - "columnWidth": 120, - "format": {"type": "date", "args": ["%Y-%m-%d %H:%M:%S"]}, - "sort": true - }, - { - "id": "modified", - "title": "Last Modified", - "type": "date", - "columnWidth": 90, - "format": {"type": "date", "args": ["%Y-%m-%d %H:%M:%S"]}, - "sort": true - }, - { - "id": "accessed", - "title": "Last Accessed", - "type": "date", - "capability": "canSeeAccessed", - "columnWidth": 90, - "format": {"type": "date", "args": ["%Y-%m-%d %H:%M:%S"]}, - "sort": true - }, - { - "id": "timesaccessed", - "title": "Times Accessed", - "type": "integer", - "capability": "canSeeAccessed", - "columnWidth": 60, - "format": {"type": "number", "args": []}, - "sort": true - }, - { - "id": "license", - "title": "License", - "type": ["string"], - "columnWidth": 120, - "filter": true, - "sort": true, - "default": [ - "Creative Commons Attribution-ShareAlike 3.0 License", - "Pad.ma General Public License" - ] - }, - { - "id": "rightslevel", - "title": "Rights Level", - "type": "enum", - "columnWidth": 90, - "format": {"type": "ColorLevel", "args": [ - ["Public", "Restricted", "Private"] - ]}, - "sort": true, - "sortOperator": "+", - "values": ["Public", "Restricted", "Private", "Unknown"] - }, - { - "id": "random", - "title": "Random", - "type": "integer", - "sort": true - } - ], - "itemName": { - "singular": "Video", - "plural": "Videos" - }, - "itemRequiresVideo": true, - "itemViews": [ - {"id": "info", "title": "Info"}, - {"id": "player", "title": "Player"}, - {"id": "editor", "title": "Editor"}, - {"id": "timeline", "title": "Timeline"}, - {"id": "clips", "title": "Clips"}, - {"id": "map", "title": "Map"}, - {"id": "calendar", "title": "Calendar"}, - {"id": "documents", "title": "Documents"}, - {"id": "data", "title": "Data"}, - {"id": "media", "title": "Media"} - ], - "language": "en", - "languages": ["ar", "el", "en", "hi"], - "layers": [ - { - "id": "places", - "title": "Places", - "canAddAnnotations": {"member": true, "staff": true, "admin": true}, - "item": "Place", - "overlap": true, - "type": "place" - }, - { - "id": "events", - "title": "Events", - "canAddAnnotations": {"member": true, "staff": true, "admin": true}, - "item": "Event", - "overlap": true, - "type": "event" - }, - { - "id": "keywords", - "title": "Keywords", - "canAddAnnotations": {"member": true, "staff": true, "admin": true}, - "item": "Keyword", - "overlap": true, - "type": "string" - }, - { - "id": "descriptions", - "title": "Descriptions", - "canAddAnnotations": {"member": true, "staff": true, "admin": true}, - "item": "Description", - "showInfo": true, - "type": "text" - }, - { - "id": "transcripts", - "title": "Transcripts", - "canAddAnnotations": {"member": true, "staff": true, "admin": true}, - "item": "Transcript", - "showInfo": true, - "type": "text" - } - ], - "listViews": [ - {"id": "list", "title": "as List"}, - {"id": "grid", "title": "as Grid"}, - {"id": "timelines", "title": "with Timelines"}, - {"id": "clips", "title": "with Clips"}, - {"id": "clip", "title": "as Clips"}, - //{"id": "video", "title": "as Video"}, - {"id": "map", "title": "on Map"}, - {"id": "calendar", "title": "on Calendar"} - ], - "media": { - "importPosters": false, - "importFrames": false - }, - "menuExtras": [ - "user", - //"locale", - "reload" - ], - "personalLists": [ - {"title": "Favorites"} - ], - "posters": { - "ratio": 0.625 - }, - "rightsLevel": {"member": 2, "staff": 2, "admin": 2}, - "rightsLevels": [ - {"name": "Public", "color": [128, 255, 128]}, - {"name": "Restricted", "color": [255, 192, 128]}, - {"name": "Private", "color": [255, 128, 128]} - ], - "sendReferrer": true, - "site": { - "description": "Pad.ma is an online archive of densely text-annotated video material, primarily footage and not finished films. The entire collection is searchable and viewable online, and is free to download for non-commercial use.", - "email": { - // E-mail address in contact form (to) - "contact": "pad.ma@pad.ma", - "footer": "-- \nPad.ma - http://pad.ma", - "prefix": "Pad.ma News -", - // E-mail address uses by the system (from) - "system": "system@pad.ma" - }, - "https": true, - "id": "padma", - "name": "Pad.ma", - "url": "pad.ma", - "videoprefix": "" - }, - "sitePages": [ - {"id": "about", "title": "About"}, - {"id": "news", "title": "News"}, - //{"id": "tour", "title": "Take a Tour"}, - {"id": "faq", "title": "Frequently Asked Questions"}, - {"id": "terms", "title": "Terms of Service"}, - {"id": "license", "title": "License"}, - {"id": "contact", "title": "Contact"} - ], - "sites": [ - {"name": "Indiancine.ma", "url": "indiancine.ma", "https": true}, - {"name": "OxDB", "url": "0xdb.org", "https": true} - ], - "textRightsLevels": [ - {"name": "Public", "color": [128, 255, 128]}, - {"name": "Private", "color": [255, 128, 128]} - ], - "themes": ["oxlight", "oxmedium", "oxdark"], - "timelines": [ - {"id": "antialias", "title": "Anti-Alias"}, - {"id": "slitscan", "title": "Slit-Scan"}, - {"id": "keyframes", "title": "Keyframes"}, - {"id": "audio", "title": "Waveform"} - ], - "totals": [ - {"id": "items"}, - {"id": "files", "admin": true}, - {"id": "duration", "admin": true}, - {"id": "size", "admin": true}, - {"id": "pixels"} - ], - "tv": { - "showLogo": false - }, - "user": { - "level": "guest", - "ui": { - "annotationsCalendarSize": 128, - "annotationsMapSize": 128, - "annotationsRange": "position", - "annotationsSize": 256, - "annotationsSort": "position", - "calendarFind": "", - "calendarSelection": "", - "clipColumns": 2, - "columns": { - "Colors": { - "columns": ["title", "source", "project", "language", "hue", "saturation", "brightness"], - "columnWidth": {} - } - }, - "document": "", - "documents": {}, - "documentSize": 256, - "documentsSelection": {}, - "documentsSort": [{"key": "name", "operator": "+"}], - "documentsView": "grid", - "edit": "", - "edits": {}, - "editSelection": [], - "editSort": [ - {"key": "index", "operator": "+"}, - {"key": "year", "operator": "+"}, - {"key": "director", "operator": "+"}, - {"key": "title", "operator": "+"}, - {"key": "position", "operator": "+"}, - {"key": "duration", "operator": "+"} - ], - "editView": "list", - "embedSize": 256, - "filters": [ - {"id": "source", "sort": [{"key": "name", "operator": "+"}]}, - {"id": "project", "sort": [{"key": "name", "operator": "+"}]}, - {"id": "topic", "sort": [{"key": "items", "operator": "-"}]}, - {"id": "name", "sort": [{"key": "items", "operator": "-"}]}, - {"id": "keywords", "sort": [{"key": "items", "operator": "-"}]}, - {"id": "places", "sort": [{"key": "items", "operator": "-"}]} - ], - "filtersSize": 176, - "find": {"conditions": [], "operator": "&"}, - "followPlayer": true, - "help": "", - "icons": "frames", - "infoIconSize": 256, - "item": "", - "itemFind": "", - "itemSort": [{"key": "position", "operator": "+"}], - "itemView": "info", - "listColumns": ["title", "source", "project", "topic", "language", "duration"], - "listColumnWidth": {}, - "listSelection": [], - "listSort": [{"key": "title", "operator": "+"}], - "listView": "grid", - "lists": {}, - "locale": "en", - "mapFind": "", - "mapSelection": "", - "onload": "", - "page": "", - "part": { - "api": "", - "documents": "", - "faq": "", - "help": "", - "news": "", - "preferences": "", - "tv": "" - }, - "section": "items", - "sequenceMode": "shape", - "sequenceSort": [{"key": "director", "operator": "+"}], - "showAdvancedEmbedOptions": false, - "showAnnotations": true, - "showAnnotationsCalendar": true, - "showAnnotationsMap": true, - "showBrowser": true, - "showCalendarControls": true, // fixme: should be false - "showClips": true, - "showDocument": true, - "showFilters": true, - "showIconBrowser": false, - "showInfo": true, - "showLayers": { - "places": false, - "events": false, - "keywords": true, - "descriptions": true, - "transcripts": true - }, - "showMapControls": false, - "showMapLabels": false, - "showFolder": { - "edits": { - "personal": true, - "favorite": true, - "featured": true, - "volumes": true - }, - "items": { - "personal": true, - "favorite": true, - "featured": true, - "volumes": true - }, - "texts": { - "personal": true, - "favorite": true, - "featured": true - } - }, - "showReflections": true, - "showSidebar": true, - "showSitePosters": false, - "showTimeline": true, - "sidebarSize": 256, - "text": "", - "texts": {}, - "theme": "oxlight", - "updateAdvancedFindResults": false, - "videoLoop": false, - "videoMuted": false, - "videoPoints": {}, - "videoResolution": 240, - "videoScale": "fit", - "videoSize": "large", - "videoSubtitles": false, - "videoTimeline": "antialias", - "videoView": "player", - "videoVolume": 1 - }, - "username": "", - "volumes": [] - }, - "userLevels": ["guest", "member", "staff", "admin"], - "video": { - "torrent": true, - "formats": ["webm", "mp4"], - "previewRatio": 1.3333333333, - //supported resolutions are - //1080, 720, 480, 432, 360, 288, 240, 144, 96 - "resolutions": [96, 240, 480] - } -} diff --git a/static/js/editor.js b/static/js/editor.js index 4cae88dd..0fc24e7c 100644 --- a/static/js/editor.js +++ b/static/js/editor.js @@ -22,7 +22,7 @@ pandora.ui.editor = function(data) { cuts: data.cuts || [], duration: data.duration, enableDownload: pandora.site.capabilities.canDownloadVideo[pandora.user.level] >= data.rightslevel || data.editable, - enableExport: true, + enableExport: pandora.site.capabilities.canExportAnnotations[pandora.user.level] || data.editable, enableImport: pandora.site.capabilities.canImportAnnotations[pandora.user.level] || data.editable, enableSetPosterFrame: !pandora.site.media.importFrames && data.editable, enableSubtitles: ui.videoSubtitles,