Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
body for a script that allows mass import of videos
- Loading branch information
Showing
1 changed file
with
199 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,199 @@ | ||
### copyright (c) 2012 Toni Mueller <support@oeko.net> | ||
### AGPLv3 if possible, otherwise GPLv3 or later | ||
### incorporates portions of code from ore.contentmirror | ||
|
||
""" | ||
Usage: | ||
./bin/instance run addvideos PORTAL_PATH FS_PATH | ||
PORTAL_PATH: root folder for a Plone site in the ZODB (eg. /01/mnt/Plone) | ||
FS_PATH: path where existing video files (.metadata) reside | ||
The configured root path for all videos should be a prefix of FS_PATH, | ||
otherwise your results will be garbage. | ||
The target Plone site must have the on.video product installed, | ||
otherwise this script will not work. | ||
""" | ||
|
||
import os | ||
import os.path | ||
import re | ||
import sys | ||
import optparse | ||
|
||
|
||
try: | ||
from cStringIO import StringIO | ||
except: | ||
from StringIO import StringIO | ||
|
||
from datetime import datetime | ||
|
||
import transaction | ||
|
||
from Products.Five import zcml | ||
from zope.component import queryMultiAdapter | ||
from zope.component import queryUtility | ||
from zope.app.component.hooks import setSite | ||
from zope.i18n.interfaces import ITranslationDomain | ||
from zope.i18n.locales import locales | ||
from zope.interface import implements | ||
from zope.app.component.hooks import getSite | ||
from Products.CMFCore.exceptions import BadRequest | ||
from plone.uuid.interfaces import IMutableUUID | ||
from Products.CMFCore.utils import getToolByName | ||
from Products.ATContentTypes.utils import dt2DT | ||
|
||
from Products.CMFCore.utils import getToolByName | ||
|
||
from AccessControl import getSecurityManager | ||
from AccessControl import Unauthorized | ||
#from AccessControl.Owner import changeOwnership | ||
from Products.CMFCore import permissions | ||
from plone.app.textfield.value import RichTextValue | ||
|
||
from plone.registry.interfaces import IRegistry | ||
from on.video.configuration import IVideoConfiguration | ||
|
||
#from zopestuff import recreateSite | ||
|
||
#from config import dburl, targetpath | ||
|
||
|
||
site = None # the site we are working on | ||
|
||
catalog = None | ||
|
||
stdlicense = """ | ||
<a class="video-copyright-link" title="CC-BY-NC-ND" href="http://creativecommons.org/licenses/by-nc-nd/3.0/fr/"> | ||
<img title="Creative Commons BY-NC-ND" sclass="video-copyright-image" rc="resolveuid/525e886f48314790b6b83b3446ab4fb5" alt="Creative Commons BY-NC-ND"> | ||
</a> | ||
""" | ||
|
||
licenses = {'CC-BY-NC-ND': stdlicense } | ||
|
||
|
||
def beautifyId(s): | ||
"""Turn a string into something resembling a headline. | ||
Method: Split on all spaces and underscores, then capitalize | ||
every piece, then return the joined parts. | ||
""" | ||
print "beautifyId(%s)" % s | ||
shards = [ c.capitalize() for c in re.split('[-_ ]', s) ] | ||
print " crumbs = ", shards | ||
return " ".join(shards) | ||
|
||
|
||
def getVideoList(path): | ||
"""Get all videos in the specified directory""" | ||
registry = queryUtility(IRegistry) | ||
settings = registry.forInterface(IVideoConfiguration) | ||
vroot = settings.fspath | ||
prefix = "" | ||
if path.startswith(vroot) and path != vroot: | ||
prefix = path[len(vroot):] | ||
prefix = prefix.strip('/') | ||
allfiles = [ f[:f.find('.metadata')] for f in os.listdir(path) if f.endswith('.metadata') and f != '.metadata' ] | ||
result = {} | ||
for element in allfiles: | ||
result[os.path.join(prefix, element)] = beautifyId(element) | ||
return result | ||
|
||
def addAllVideos(site, folder, fs_path, rights, publish = False): | ||
"""Add all videos found in the fs_path to the site.""" | ||
parts = folder.split('/') | ||
target = site | ||
|
||
if publish: | ||
wft = getToolByName(site, 'portal_workflow') | ||
for part in parts: | ||
if part not in target.keys(): | ||
target.invokeFactory('Folder', id=part, title=part) | ||
target = target[part] | ||
videos = getVideoList(fs_path) # a dictionary | ||
for video in videos: | ||
newid = video[video.rfind('/')+1:] | ||
nv_id = target.invokeFactory('on.video.Video', id=newid, title=videos[video], filename = video) | ||
newvideo = target[nv_id] | ||
if rights: | ||
newvideo.body = RichTextValue('<p class="licenseimage">' + rights + '</p>') | ||
newvideo.setExcludeFromNav(True) | ||
if publish: | ||
wft.doActionFor(newvideo, 'publish') | ||
|
||
### system integration boilerplate: | ||
|
||
def get_app(): | ||
frame = sys._getframe(2) | ||
return frame.f_locals.get('app') | ||
|
||
|
||
def setup_parser(): | ||
parser = optparse.OptionParser( | ||
usage="usage: ./bin/instance run ./bin/%prog [options] portal_path filesystem_path") | ||
parser.add_option( | ||
'-f', '--folder', dest="folder", default="", | ||
help="Which folder to import into (default: use an auto-generated name)") | ||
parser.add_option( | ||
'-l', '--license', dest="licensekey", default="CC-BY-NC-ND", action='store', | ||
help="""License string (default: CC-BY-NC-ND). If you want to use something else, specify the full required HTML code. If you want no license, specify NONE.""") | ||
parser.add_option( | ||
'-p', '--publish', dest="publish", default=False, action='store_true', | ||
help="Immediately publish all videos (they are likely to not be elegantly named)") | ||
return parser | ||
|
||
|
||
### MAIN: | ||
|
||
def main(app=None, instance_path=None): | ||
parser = setup_parser() | ||
options, args = parser.parse_args() | ||
global site | ||
|
||
if len(args) != 2: | ||
parser.print_help() | ||
sys.exit(1) | ||
return | ||
|
||
if app is None: | ||
app = get_app() | ||
try: | ||
instance_path = args[0] | ||
fs_path = args[1] | ||
except: | ||
parser.print_help() | ||
sys.exit(2) | ||
|
||
#folder = "imported-videos-%s" % datetime.now().strftime("%s") | ||
folder = 'imported-videos' | ||
licensekey = 'CC-BY-NC-ND' | ||
|
||
if not os.path.isdir(fs_path): | ||
parser.print_help() | ||
sys.exit(1) | ||
|
||
try: | ||
portal = app.unrestrictedTraverse(instance_path) | ||
except: | ||
print "The specified Plone site does not seem to exist, bailing out." | ||
parser.print_help() | ||
sys.exit(1) | ||
|
||
setSite(portal) | ||
site = portal | ||
|
||
if options.licensekey in licenses: | ||
rights = licenses[options.licensekey] | ||
elif options.licensekey != "NONE": | ||
rights = options.licensekey | ||
else: | ||
rights = None | ||
|
||
addAllVideos(site, folder, fs_path, rights, options.publish) | ||
|
||
transaction.commit() |