Welcome to WSL!

New to the forum? Please read this and this.

Generation scripts in Reactor

User avatar
TAIS
Posts: 15
Joined: Wed Sep 13, 2017 3:24 pm

Generation scripts in Reactor

#1

Post by TAIS »

Any Generation Scripts on Reactor?
like this ones:
hmm? ... Are thats gems really lost in an fragmented HDD of a dismanted PC in a burned company in a buried lost city of an unkknow continent?
Regards,

User avatar
SecondMan
Site Admin
Posts: 4904
Joined: Thu Jul 31, 2014 5:31 pm
Answers: 31
Location: Vancouver, Canada
Been thanked: 53 times
Contact:

Re: Generation scripts in Reactor

#2

Post by SecondMan »

Moving this to the Generation forum.

Nobody knows what's going on with Generation, or whether anything is going on with it at all. I see some of its heritage in Fusion's Studio Player, and it's likely you can greatly extend that with scripts (haven't tried), but not sure if you can go as far as building a front-end like you see in the video. Worth looking into.

As for Generation scripts in Reactor, since Generation is currently no longer part of Fusion Studio - for quite a while now - I don't think there's anyone still actively developing for it. Sadly. So no, there is no Generation content in Reactor.

User avatar
TAIS
Posts: 15
Joined: Wed Sep 13, 2017 3:24 pm

Re: Generation scripts in Reactor

#3

Post by TAIS »

What happened to these scripts ?!
What a pity if they are no longer useful.
Nothing replaces the workflow that Generation allows.
I can't accept that it's over.
I already cry on the Generation forum. It doesn't make any waves on the surface. These scripts are dying in the hard drives of people who cannot imagine that they could still be useful to others. Please Free them!

User avatar
Midgardsormr
Fusionator
Posts: 2172
Joined: Wed Nov 26, 2014 8:04 pm
Answers: 28
Location: Los Angeles, CA, USA
Been thanked: 41 times
Contact:

Re: Generation scripts in Reactor

#4

Post by Midgardsormr »

We used Generation for a while and still haven't found a replacement for it, but I'm not sure how much automation we did with it. I know we didn't have any front-end scripting, but there were probably some hooks into our project management software. I'll poke around in the pipeline folders at work and see if anything turns up.

edit: I suppose I'll also need to dig up an installer that still includes Generation…

User avatar
AndrewHazelden
Fusionator
Posts: 1768
Joined: Fri Apr 03, 2015 3:20 pm
Answers: 11
Location: West Dover, Nova Scotia, Canada
Been thanked: 39 times
Contact:

Re: Generation scripts in Reactor

#5

Post by AndrewHazelden »

Midgardsormr wrote:I suppose I'll also need to dig up an installer that still includes Generation…
Fusion Studio v8.2.1 for Windows has the most recent copy of Generation bundled with it. :)

User avatar
TAIS
Posts: 15
Joined: Wed Sep 13, 2017 3:24 pm

Re: Generation scripts in Reactor

#6

Post by TAIS »

Midgardsormr wrote: Mon Sep 21, 2020 4:57 pm We used Generation for a while and still haven't found a replacement for it, but I'm not sure how much automation we did with it. I know we didn't have any front-end scripting, but there were probably some hooks into our project management software. I'll poke around in the pipeline folders at work and see if anything turns up.

edit: I suppose I'll also need to dig up an installer that still includes Generation…
Thank you. Thank you. I'm looking for any scripts. Basically for learning because the manual is too light.

Is Steven Benjamin still in Muse VFX?

I've got a contact with him several years before:

"Hey TAIS,
Absolutely! I've been meaning to post them on here, actually. It's just taken me awhile to clean them up and make sure that studio specific content is removed. But you can expect to have some scripts next week, if that works? Generation is VERY finicky to script for. Here's 1 that I can share along with the xml (A lot of my Generation work included working off of xml's to pass data). Sadly, I don't have the time to do any bug fixes on it, but I can try my best to answer any questions.
-Steven"

Then,

"Hey Tais!
Yes! It's taken me a bit longer than expected. The should be up by the end of the weekend. :)
Cheers,
-StevieB"

Then silent.

Is he alright?
Last edited by TAIS on Tue Sep 22, 2020 7:39 am, edited 1 time in total.

User avatar
Midgardsormr
Fusionator
Posts: 2172
Joined: Wed Nov 26, 2014 8:04 pm
Answers: 28
Location: Los Angeles, CA, USA
Been thanked: 41 times
Contact:

Re: Generation scripts in Reactor

#7

Post by Midgardsormr »

Thanks, Andrew!

Here's a preliminary offering. This script creates a Generation project from an XML file with a specific format. We used it to generate a Dailies session from an XML assembled by our project management system. I will try to find some sample data and will add that if I come across it. This is the only script I've found so far that appears to have been written with other pipelines in mind, so it's a good place to start.
Code: [Select all] [Expand/Collapse] [Download] (MuseGD_v06.01.004.py)
  1. ## MuseGD
  2. ## Copyright 2014-2016 Muse VFX
  3. ## www.musevfx.com
  4. ## Created by: Steven 'StevieB' Benjamin
  5. ##
  6. ## Description:
  7. ##    This script will automatically read in and create or update a Generation project
  8. ##    based off of a given (correctly formatted) XML file.
  9. ##
  10. ##    Note_1: Due to how long it can take for Generation to get going and set
  11. ##    values, you will see many pauses through the script. The script does
  12. ##    not take long to run (roughly 45secs for 500 elements). Gauge accordingly.
  13. ##
  14. ##    Note_2: As of v05, Note_1 is obsolete
  15. ##
  16. ##
  17. ## Version Notes----------------------------------------------------------------------------------------------------------
  18. ## v01.00-----
  19. ## First build. Created project and subs based on xml file. Added each clip properly and added proper metadata to the clip.
  20. ##
  21. ## v01.01-----
  22. ## Fixed bugs
  23. ##
  24. ## v02.00-----
  25. ## Added catch and restart Generation No Dongle Error. Restarts if can't find a license (3 attempts)
  26. ## Added missing shots
  27. ##
  28. ## v03.00-----
  29. ## Added ability to add place holders and reorganize shots to their correct locations within subs and ClipM.
  30. ## Includes "Muse VFX's Proxy" system
  31. ## No longer have to close Generations to in order to build project. Just have to make sure that project isn't locked (i.e. in Viewing mode)
  32. ##
  33. ## v03.01----
  34. ## Fixed duplicating reference images
  35. ## Fixed InPoint problem (was defaulting to 50)
  36. ## Added catch to handle xml's with no PROJECTFILE and/or PROJECTLOCATION (defaults to temp folder on C:\)
  37. ##
  38. ## v03.02----
  39. ## Placeholders are now custom to the shot
  40. ## Fixed some bugs
  41. ##
  42. ## v03.03----
  43. ## Fixed issue with Plates being added in version slot 1 instead of at the top of the clipM. This was accidentally affected when sort order changed in Generations XML. Now, should always be on top.
  44. ## Fixed Generation C:\ drive launch
  45. ##
  46. ## v03.04----
  47. ## Removed C:\ drive launch (Wasn't any quicker than network launching as previously thought nor was it getting the changes made to the S:\ launcher)
  48. ## Fixed setting clip length. Should be setting clip length for every clip in every sub instead of just for the last. Indent issue.
  49. ## Fixed placeholder color range
  50. ## Fixed bug with placeholders being the wrong placeholder as well as added "blank" placeholder for shots with no suitable background image.
  51. ## Added catch for XML files with no items.
  52. ##
  53. ## v04.00 DOES NOT EXIST (Its a long story...)
  54. ##
  55. ## v05.00----
  56. ## Changed MuseGD from opening and using Generation to create a project to straight creating the .genprj xml file with metadata files for each shot. Stripped down and sped up process by roughly 500%
  57. ##
  58. ## v06.01----
  59. ## Added back ability to use CDLs from Grid
  60. ## Fixed improper ordering dealing with different paddings
  61.  
  62.  
  63. ## Import standard library modules. Some may need to be downloaded...
  64. from xml.etree import ElementTree as et
  65. from collections import OrderedDict
  66. import os, sys, subprocess, re, shutil, uuid, datetime, time
  67.  
  68. __VERSION__ = "v06.01"
  69.  
  70. ## Important filepath variables.
  71. BMGeneration = "S:\\net_exe\\BlackMagic\\shortcuts\\_Generation\\Generation.bat" #Change to studio's Generation path
  72. imgmagik = "S:\\net_exe\\ImageMagik\ImageMagick-6.8.9-Q16_static\\" #ImgMagik is required for placeholder creation. Can download latest version at: http://www.imagemagick.org/script/index.php
  73. sslate = "W:\\Muse_Identity\\elements\\MuseSlate\\Muse_Slate_dev_v02.png" ## Muse's default custom blank slate for placeholder creation. If you don't have one, then ImgMagik  can create one for you, but that will need to be changed within the CreatePlaceholder function.
  74.  
  75.  
  76. ## (A) ReadXML: Converts XML to python dictionary for easy manipulation when generating Generation project.
  77. def ReadXML(xml):
  78.     z = 0
  79.     totalcount = 0
  80.     actualcount = 0
  81.  
  82.     ## (A-1) Load xml using element tree module and parse.
  83.     print "Reading XML file: " + str(xml)
  84.     xmlD = et.parse(xml)
  85.     root = xmlD.getroot()
  86.     fpathnum = int((sum(1 for i in xmlD.iter("ITEM"))))
  87.     projdir = (xml.rsplit("\\",2)[0])
  88.     projlocation = xmlD.find("PROJECTLOCATION").text
  89.     try:
  90.         projname = (xmlD.find("PROJECTFILE").text).rsplit(".")[0]
  91.     except:
  92.         projname = "TEMP"
  93.     tempname = (os.path.basename(xml)).rsplit(".",1)[0]
  94.     print "XML successfully loaded."
  95.  
  96.     ## (A-2) Begin building dictionary.
  97.     print "Reading in XML..."
  98.     projdict = {}
  99.     projdict["PROJNAME"] = projname
  100.     LUTlist = []
  101.    
  102.     oktypes = ["plate","element","composite", "precomp", "animatic", "slapcomp"] ## For Muse, we wanted to only allow certain types of shots to be used in Generation. Generation is a bit buggy on some filetypes and this was one of the better ways to handle that.
  103.    
  104.     ## (A-2.1) Iter through items to get a quick count of total items for use later. Would be better to have a tag in the XML for total items that can be added on creation of XML, but if not or until available, this will suffice.
  105.     for show in root.iter('SHOW'):
  106.         for episode in show.iter('EPISODE'):
  107.             for shot in episode:
  108.                 for item in shot:
  109.                     actualcount += 1
  110.  
  111.     ## (A-2.2) Iter through Shows, Episodes, Shots, and Items to build dictionary.
  112.     for show in root.iter('SHOW'):
  113.         showname = (show.text).strip() ## Get rid of all white spaces for cleanliness.
  114.         showname = re.sub('[^a-zA-Z0-9 \n\.]', '_', showname) ## This is actually better to catch for when creating the XML, but provided as a catch here just in case its not possible.
  115.                                                                # Generation DOES NOT like the use of special characters at all when dealing with item names in their .genproj file. So to make the document play nice, every special character
  116.                                                                # is changed into an underscore (_). The only characters it likes is the pound(#) and at(@), but only when denoting img sequences and frames not starting at one(1) respectively.
  117.                                                                # This is shown when building the .genproj file.
  118.         projdict[showname] = {}
  119.  
  120.         for episode in show.iter('EPISODE'):
  121.             epname = (episode.text).strip()
  122.             epname = re.sub('[^a-zA-Z0-9 \n\.]', '_', epname)
  123.             projdict[showname][epname] = {}
  124.  
  125.             for shot in episode:
  126.                 shotname = (shot.text).strip()
  127.                 shotname = re.sub('[^a-zA-Z0-9 \n\.]', '_', shotname)
  128.                 projdict[showname][epname][shotname] = {}
  129.  
  130.                 items = sum(1 for item in shotname)
  131.  
  132.                 itemcount = 0
  133.                 errorcount = 0
  134.                 itemerror = []
  135.  
  136.                 if shotname.find("ITEM") == None:
  137.                     print "No items to add. " + shot + " not added..."
  138.                     continue
  139.                 else:
  140.                     pass
  141.  
  142.                 for item in shot:
  143.                     fpath = item.find("FILEPATH").text
  144.                     approvedtypes = ["Plate","Composite"] ## This can be changed. Muse prefers CDL information to only be applied to the shot types Plates and Compositions when viewing in Generation.
  145.                     if os.path.isfile(fpath) == True:
  146.                         filetype = fpath.rsplit(".",1)[1]
  147.                         i = (item.text).strip()
  148.                         i = re.sub('[^a-zA-Z0-9 \n\.]', '_', i)
  149.                         try:
  150.                             ## If itemnames look similar to the ones in the Muse Exmaple XML (example: 1-v0034298), this will make sure that its readable by Generation.
  151.                             itemnum = i.split("_",1)[0]
  152.                             itemnumstr = '{num:0{width}}'.format(num = int(itemnum), width = len(str(actualcount)))
  153.                             itemname = str(itemnumstr) + "_" + i.split("_",1)[1]
  154.                         except:
  155.                             itemname = i
  156.                         projdict[showname][epname][shotname][itemname] = {}
  157.  
  158.                         try:
  159.                             ## Shot type is used for various things, like to know which item should have a CDL applied or not.
  160.                             shottype = item.find("TYPE").text
  161.                             if shottype == None:
  162.                                 shottype = ""
  163.                         except:
  164.                             shottype = ""
  165.  
  166.                         ## Generation has a fairly slow and poor proxy system. Custom NProxies (network proxies) and LProxes (local proxies) are used instead with Muse_ProxyExchange to quickly change between original and proxy files.
  167.                         nproxy = (item.find("FILEPATH_NPROXY").text)
  168.                         try:
  169.                             if os.path.exists(nproxy) == True:
  170.                                 fpath = nproxy
  171.                             else:
  172.                                 nproxy = ""
  173.                         except:
  174.                             nproxy = ""
  175.  
  176.                         lproxy = (item.find("FILEPATH_LPROXY").text)
  177.                         try:
  178.                             if os.path.exists(lproxy) == True:
  179.                                 fpath = lproxy
  180.                             else:
  181.                                 lproxy = ""
  182.                         except:
  183.                             lproxy = ""
  184.  
  185.                         ## Notes get added in the .genmeta files along with statuses, submitting user information, and other misc information.
  186.                         try:
  187.                             note = item.find("NOTE").text
  188.                             if note == None:
  189.                                 note = ""
  190.                         except:
  191.                             note = ""
  192.                        
  193.                         try:  
  194.                             status = item.find("STATUS").text
  195.                             if status == None:
  196.                                 status = ""
  197.                         except:
  198.                             status = ""
  199.                          
  200.                         try:  
  201.                             version = item.find("VERSION").text
  202.                             if version == None:
  203.                                 version = ""
  204.                         except:
  205.                             version = ""
  206.                            
  207.                         ## Submitting artist of item.
  208.                         try:
  209.                             submittingartist = item.find("SUBMITTINGARTIST").text
  210.                             if submittingartist == None:
  211.                                 submittingartist = ""
  212.                         except:
  213.                             submittingartist = ""
  214.                            
  215.                         ## All artists associated with the particular item.
  216.                         try:
  217.                             allartists = item.find("ALLARTISTS").text
  218.                             if allartists == None:
  219.                                 allartists = ""
  220.                         except:
  221.                             allartists = ""
  222.                            
  223.                         try:
  224.                             gridlocator = item.find("GRIDLOCATOR").text
  225.                             if gridlocator == None:
  226.                                 gridlocator = ""
  227.                         except:
  228.                             gridlocator = ""
  229.  
  230.                         ## Length of item
  231.                         try:
  232.                             length = str(item.find("LENGTH").text)
  233.                             if length == None:
  234.                                 length = str(50)
  235.                         except:
  236.                             length = "50"
  237.                            
  238.                         ## Muse pulls their own plates. This is so that we know where the original plate came from for current item.
  239.                         try:
  240.                             origreel = item.find("ORIGREELNAME").text  
  241.                             if origreel == None:
  242.                                 origreel = ""
  243.                         except:
  244.                             origreel = ""
  245.                            
  246.                         ## Sequence item is in.
  247.                         try:
  248.                             sequence = item.find("SEQUENCE").text
  249.                             if sequence == None:
  250.                                 sequence = "SEQUENCE"
  251.                         except:
  252.                             sequence = ""
  253.  
  254.                         ## CDL information to use on item if proper CDL is given. If not, then the default is used. Numbers generally do not need to be adjusted.
  255.                         try:
  256.                             cdlpath = item.find("CDL").text
  257.                             if cdlpath == None:
  258.                                 cdlpath = ""
  259.                         except:
  260.                             cdlpath = ""
  261.  
  262.                         cdlinfo = {}
  263.                         cdlinfo['SLOPE'] = {'RED': '1.0000', 'GREEN': '1.0000', 'BLUE': '1.0000'}
  264.                         cdlinfo['OFFSET'] = {'RED': '0.0000', 'GREEN': '0.0000', 'BLUE': '0.0000'}
  265.                         cdlinfo['POWER'] = {'RED': '1.0000', 'GREEN': '1.0000', 'BLUE': '1.0000'}
  266.                         cdlinfo['SATURATION'] = '1.0000'
  267.                         try:
  268.                             if filetype.lower() != "exr":
  269.                                 if shottype in approvedtypes:
  270.                                     if cdlpath != "":
  271.                                         cdlinfo = ReadCDL(cdlpath)
  272.                             else:
  273.                                 cdlinfo['POWER'] = {'RED': '0.4545', 'GREEN': '0.4545', 'BLUE': '0.4545'} # These numbers are NOT "1.000" due to the Power to Gamma conversion that Generation does. Power to Gamma conversion (gamma = (1/(power)))
  274.  
  275.                         except:
  276.                             pass
  277.  
  278.                         ## Information for which LUT to use for item if provided.
  279.                         try:
  280.                             lutpath = item.find("LUT").text
  281.                             if lutpath == None:
  282.                                 lutpath = ""
  283.                             else:
  284.                                 if lutpath not in LUTlist:
  285.                                     LUTlist.append(lutpath)
  286.                         except:
  287.                             lutpath = ""
  288.  
  289.                         ## Generation creates .genmeta files anytime an item is adjusted. This makes sure that that file gets bypassed and returns all the files in the directory of the original file. We also need to make sure that the found file is an approved image.
  290.                         listoffiles = []
  291.                         approvedimages = ["jpg","jpeg","png","exr","dpx","tga"]
  292.                         try:
  293.                             for i in os.listdir(fpath.rsplit("\\",1)[0]):
  294.                                 if os.path.isfile(fpath.rsplit("\\",1)[0] + "\\" + i) == True:
  295.                                     if "genmeta" not in i:
  296.                                         if i not in listoffiles:
  297.                                             if str(i.rsplit(".",1)[1]).lower() in approvedimages:
  298.                                                 listoffiles.append(i)
  299.                         except:
  300.                             pass
  301.  
  302.                         ## Generation sometimes needs a framebuffer for the shot or item being submitted. This tries to get it.
  303.                         findfb0 = os.path.basename(fpath).rsplit(".",1)[0]
  304.                         for i in reversed(findfb0):
  305.                             if i.isdigit() == False:
  306.                                 if i.isalpha() == False:
  307.                                     fbbreak = i
  308.                                     break
  309.                         try:
  310.                             fbuffer = len(findfb0.rsplit(fbbreak,1)[1])
  311.                         except:
  312.                             fbuffer = 1
  313.                        
  314.                         ## Gets the first and last frames of the submitted item.
  315.                         try:
  316.                             firstframe0 = re.findall("(\d{%s}?.)" % fbuffer + os.path.basename(listoffiles[0]).rsplit(".",1)[1],os.path.basename(listoffiles[0]))
  317.                             firstframe = int(firstframe0[0].split(".",1)[0])
  318.                         except:
  319.                             firstframe = 1
  320.                        
  321.                         try:
  322.                             lastframe0 = re.findall("(\d{%s}?.)" % fbuffer + os.path.basename(listoffiles[-1]).rsplit(".",1)[1],os.path.basename(listoffiles[-1]))
  323.                             lastframe = int(lastframe0[0].split(".",1)[0])
  324.                         except:
  325.                             lastframe = 1
  326.  
  327.                         ## Add all information for the current item to the dictionary.
  328.                         shotitem = projdict[showname][epname][shotname][itemname]
  329.                         shotitem["FILEPATH"] = fpath
  330.                         shotitem["FILEPATH_LPROXY"] = lproxy
  331.                         shotitem["FILEPATH_NPROXY"] = nproxy
  332.                         shotitem["NOTE"] = note
  333.                         shotitem["STATUS"] = status
  334.                         shotitem["VERSION"] = version
  335.                         shotitem["SUBMITTINGARTIST"] = submittingartist
  336.                         shotitem["ALLARTISTS"] = allartists
  337.                         shotitem["GRIDLOCATOR"] = gridlocator
  338.                         shotitem["LENGTH"] = length
  339.                         shotitem["ORIGREEL"] = origreel
  340.                         shotitem["SEQUENCE"] = sequence
  341.                         shotitem["SHOTTYPE"] = shottype
  342.                         shotitem["CDL_PATH"] = cdlpath
  343.                         shotitem["CDL_INFO"] = cdlinfo
  344.                         shotitem["LUT_PATH"] = lutpath
  345.                         shotitem["EPISODE"] = epname
  346.                         shotitem["SHOW"] = showname
  347.                         shotitem["SHOTNAME"] = shotname
  348.                         shotitem["INAME"] = str("_" + shotname + "_" + version + "_" + itemname + "_").replace("-","_")
  349.                         shotitem["FIRSTFRAME"] = firstframe
  350.                         shotitem["LASTFRAME"] = lastframe
  351.                         shotitem["FRAMEBUFFER"] = fbuffer
  352.  
  353.                         totalcount += 1
  354.                         print "Read item: " + str(itemname)
  355.  
  356.                 ## Sometimes, when dealing with many shots, its difficult to see which shots you're looking at when viewing in column view. This will try to create and insert a placeholder at the top of the column with the shotname on it for easy viewing and finding.
  357.                 try:
  358.                     pholderdir = projdir + "\\_placeholders\\" + showname + "_" + epname
  359.                     if os.path.isdir(pholderdir) == False:
  360.                         os.makedirs(pholderdir)
  361.                     pholder = os.path.abspath(pholderdir + "\\" + showname + "_" + shotname + "_placeholder.jpg")
  362.                     if os.path.exists(pholder) == False:
  363.                         CreatePlaceholder(pholder)
  364.                     projdict[showname][epname][shotname]["PLACEHOLDER"] = pholder
  365.                 except:
  366.                     print "Could not create placeholders for current item."
  367.                     pass
  368.  
  369.     ## (A-3) Finish the dictionary.
  370.     ## Total items successfully able to be read in XML.
  371.     projdict["TOTAL_ITEMS"] = str(totalcount)
  372.     ## Sometimes the XML will contain multiple shows, episodes, and shots that utilize different LUTs. This gathers a list of them to be used later.
  373.     projdict["LUT_LIST"] = LUTlist
  374.  
  375.     return projdict
  376.  
  377. ## (B) Build Generation Project file.
  378. def BuildProj(xml):
  379.     ## (B-1) Gather and set basic information.
  380.     print "Creating Generation project..."
  381.     UUID = 1
  382.     projdict = ReadXML(xml)
  383.     projnum = int(projdict["TOTAL_ITEMS"])
  384.     projname = projdict["PROJNAME"]
  385.     LUTlist = projdict["LUT_LIST"]
  386.     ## Generation standard LUT library.
  387.     standardLUTS = ["S:\\net_exe\\eyeon\\generation\\LUTS\\log_blk0_sRGB.alut3",
  388.                     "S:\\net_exe\\eyeon\\generation\\LUTS\\AlexaV3_K1S1_LogC2Video_Rec709_EE_fusion3d.3dl",
  389.                     "S:\\net_exe\\eyeon\\generation\\LUTS\\Log_to_sRGB.setting",
  390.                     "S:\\net_exe\\eyeon\\generation\\LUTS\\m_Gamma2.2.setting",
  391.                     "S:\\net_exe\\eyeon\\generation\\LUTS\\log_blk95_sRGB.alut3"]
  392.     projfile = (xml.rsplit("\\",2)[0]) + "\\" + projname + ".genprj"
  393.     logfile = (xml.rsplit("\\",2)[0]) + "\\" + projname + "_log.txt"
  394.     totalcount = 1
  395.     ## Only want to use the part of the dictionary with items for this part.
  396.     badnames = ["TOTAL_ITEMS","PROJNAME", "LUT_LIST"]
  397.     okfiletypes = ["jpg","tga","dpx","exr"] ## Generation is slow with movs and other filetypes can cause bad crashes. So we try to limit what Generation can successfully read.
  398.  
  399.     ## (B-2) Start writing out the file with log files and add ALL media FIRST
  400.     with open(logfile, "w") as lf:
  401.         with open(projfile, "w") as pf:
  402.             ## (B-2.1) Generation project files are basic XML files, so they require the proper header.
  403.             pf.write('<?xml version="1.0" encoding="UTF-8"?>\n')
  404.             pf.write('<GenProj Build="Sep 18 2015" Version="3.01" Name="' + projname + '">\n')
  405.             pf.write('  <Format FPS="24.0000" Width="1920" Height="1080" FrameHold="50" HoldPrevious="0"/>\n')
  406.             pf.write('  <Media>\n')
  407.  
  408.             print "Adding necessary media..."
  409.             lf.write("Adding necessary media...\n")
  410.  
  411.             for showname, showstuff in sorted(projdict.iteritems()):
  412.                 if showname not in badnames:
  413.                     for episode, episodestuff in sorted(showstuff.iteritems()):
  414.                         for shotname, shotstuff in sorted(episodestuff.iteritems()):
  415.                             for item, vstuff in reversed(sorted(shotstuff.iteritems())):
  416.                                 if item != "PLACEHOLDER":
  417.                                     ## Figures out which path is best to use. LProxy, NProxy, or original file path.
  418.                                     if os.path.exists(vstuff["FILEPATH_LPROXY"]) == True:
  419.                                         mypath = vstuff["FILEPATH_LPROXY"]
  420.                                     elif os.path.exists(vstuff["FILEPATH_NPROXY"]) == True:
  421.                                         mypath = vstuff["FILEPATH_NPROXY"]
  422.                                     else:
  423.                                         mypath = vstuff["FILEPATH"]
  424.                                     filetype = vstuff["FILEPATH"].rsplit(".",1)[1]
  425.                                     shotnum = item
  426.                                     ## (B-2.2) It is EXTREMELY important that the ONLY special characters in the itemname are underscores(_) or else Generation WILL NOT load the project file.
  427.                                     ## It also needs to be noted that Generation uses a specific system to determine a singleframe/item vs an img sequence (multiple items) thats starts at frame 1 vs an img sequence (multiple items) that does not start at frame 1
  428.                                     iname = vstuff["INAME"]
  429.                                     iname = re.sub('[^a-zA-Z0-9 \n\.]', '_', iname)
  430.                                     pf.write('    <Clip UUID="' + str(uuid.uuid4()) + '" ItemName="' + iname + '">\n') ## After testing, UUIDs are not actually necessary, but Generation MIGHT be using them somewhere else, therefore are being added here as well.
  431.                                     try:
  432.                                         if filetype.lower() in okfiletypes:
  433.                                             fbuffer = vstuff["FRAMEBUFFER"]
  434.                                             firstframe = vstuff["FIRSTFRAME"]
  435.                                             lastframe = vstuff["LASTFRAME"]
  436.                                             frame = re.findall("(\d{%s}?.)" % fbuffer,os.path.basename(mypath))[0].rsplit(".",1)[0]
  437.                                             begin = mypath.rsplit(frame,1)[0].replace("\\","\\\\")
  438.                                             mid = str(str(firstframe) + "-" + str(lastframe))
  439.                                             if firstframe == lastframe:
  440.                                                 raise
  441.                                             if firstframe == 1:
  442.                                                 numpattern = "#" ## Img sequence that starts at frame 1.
  443.                                             else:
  444.                                                 numpattern = "@" * fbuffer ## Img sequence that DOES NOT start at frame 1.
  445.  
  446.                                             pf.write("      <FilePattern>" + begin + mid + numpattern + "." + filetype + "</FilePattern>\n")
  447.                                         else:
  448.                                             raise
  449.                                     except:
  450.                                         pf.write(("      <Filename>" + vstuff["FILEPATH"].replace("\\","\\\\") + "</Filename>\n")) ## Single frame/item.
  451.  
  452.                                     date = datetime.datetime.now()
  453.                                     pf.write('      <CreationInfo Time="' + str(date).split(" ")[0].replace("-","") + "-" + str(date).split(" ")[1].split(".")[0].replace(":","") + '"/>\n')
  454.                                     pf.write("    </Clip>\n")
  455.                                     print "Media added for " + iname + "   " + str(totalcount) + " of " + str(projnum)
  456.                                     lf.write(str("%03d"%totalcount) + " " + mypath.rsplit("\\",1)[0] + "\\" + (os.path.basename(mypath)) + "\n")
  457.                                     totalcount += 1
  458.  
  459.                             ## Try to add placeholders.
  460.                             try:
  461.                                 pholder = shotstuff["PLACEHOLDER"]
  462.                                 if os.path.exists(pholder) == True:
  463.                                     pf.write('    <Clip UUID="' + str(uuid.uuid4()) + '" ItemName="_' + shotname.replace("-","_")  + '_placeholder_jpg_">\n')
  464.                                     pf.write(("      <Filename>" + pholder.replace("\\","\\\\") + "</Filename>\n"))
  465.                                     date = datetime.datetime.now()
  466.                                     pf.write('      <CreationInfo Time="' + str(date).split(" ")[0].replace("-","") + "-" + str(date).split(" ")[1].split(".")[0].replace(":","") + '"/>\n')
  467.                                     pf.write("    </Clip>\n")
  468.                                 else:
  469.                                     pass
  470.                             except:
  471.                                 pass
  472.  
  473.  
  474.                 else:
  475.                     pass
  476.             pf.write('  </Media>\n')
  477.             pf.write("  <Subs>\n")
  478.             showsubs = {}
  479.             shownum = 0
  480.  
  481.             ## (B-3) Properly organize media and create columns. Everything needs to be in the same order as how it appears in the media section.
  482.             for showname, showstuff in sorted(projdict.iteritems()):
  483.                 if showname not in badnames:
  484.                     showname = showname.replace(" ","_")
  485.                     showsubs[showname] = {}
  486.                     shownum += 1
  487.                     epnum = 0
  488.                     for episode, episodestuff in sorted(showstuff.iteritems()):
  489.                         showsubs[showname][str(epnum)] = episode
  490.                         epnum += 1
  491.                         print "Adding " + showname + "_" + episode + "..."
  492.                         pf.write('    <Sub Name="' + showname + "_" + episode +'" UUID="' + str(uuid.uuid4()) + '">\n') ## This will create the various sub directories.
  493.                         pf.write('      <Tracks>\n')
  494.                         pf.write('        <Track Name="' + showname + "_" + episode +'" UUID="' + str(uuid.uuid4()) + '">\n')## The bottom track needs to be identified.
  495.                         pf.write('          <Clips>\n')
  496.                         clipin = 0
  497.                         clipout = 0
  498.                         shotnum = 0
  499.                         for shotname, shotstuff in sorted(episodestuff.iteritems()):
  500.                             try:
  501.                                 itemnum = 0
  502.                                 keys = sorted(shotstuff.keys(), reverse = True)
  503.                                 keycount = int(len(keys))
  504.  
  505.                                 firstframe = shotstuff[keys[1]]["FIRSTFRAME"]
  506.                                 lastframe = shotstuff[keys[1]]["LASTFRAME"]
  507.  
  508.                                 if shotnum == 0:
  509.                                     clipout = lastframe - 1
  510.                                 else:
  511.                                     clipout = clipin + lastframe - 1
  512.  
  513.                                 vindex = 0
  514.                                 pf.write('            <Clip UUID="' + str(uuid.uuid4()) + '" InPoint="' + str(clipin) + '" OutPoint="' + str(clipout) + '" Name="_' + shotname.replace("-","_") + "_" +  shotstuff[keys[1]]["VERSION"] + "_" + str(keys[1]) + '_">\n') ## First version/item to be in the column (at the bottom)
  515.                                 pf.write('              <Versions>\n')
  516.                                 for version, vstuff in reversed(sorted(shotstuff.iteritems())): ## This will take the media section and put the latest version on bottom. If preferred to have on top, simple remove the 'reverse' function.
  517.                                     try:
  518.                                         iname = projdict[showname][episode][shotname][version]["INAME"]
  519.                                         if vindex == 0:
  520.                                             pf.write('                <Version Index="' + str(vindex) + '" UUID="' + str(uuid.uuid4()) + '" InPoint="0" UserFrame="2" Status="' + vstuff["STATUS"] + '" PrevStatus="None" Assign="' + vstuff["SUBMITTINGARTIST"] + '" PrevAssign="None">\n') ## Name isn't needed for the first version/item as it is already defined above
  521.                                         else:
  522.                                             pf.write('                <Version Index="' + str(vindex) + '" Name="' + iname + '" UUID="' + str(uuid.uuid4()) + '" InPoint="1" UserFrame="2" Status="' + vstuff["STATUS"] + '" PrevStatus="None" Assign="' + vstuff["SUBMITTINGARTIST"] + '" PrevAssign="None">\n') ## This is how to define every other item in the column
  523.                                         try:
  524.                                             cdlinfo = vstuff["CDL_INFO"]
  525.                                             pf.write('                  <ColorAdjust RedGain="' + cdlinfo["SLOPE"]["RED"] + '" RedOffset="' + cdlinfo["OFFSET"]["RED"] + '" RedGamma="' + str(1/float(cdlinfo["POWER"]["RED"])) + '" GreenGain="' + cdlinfo["SLOPE"]["GREEN"] + '" GreenOffset="' + cdlinfo["OFFSET"]["GREEN"] + '" GreenGamma="' + str(1/float(cdlinfo["POWER"]["GREEN"])) + '" BlueGain="' + cdlinfo["SLOPE"]["BLUE"] + '" BlueOffset="' + cdlinfo["OFFSET"]["BLUE"] + '" BlueGamma="' + str(1/float(cdlinfo["POWER"]["BLUE"])) + '" Saturation="' + cdlinfo["SATURATION"] + '"/>\n') ## If available, this will add the CDL information per inserted item. Simply comment out if not desired.
  526.                                         except:
  527.                                             pass
  528.                                         pf.write('                </Version>\n')
  529.                                         try:
  530.                                             CreateGenMeta(vstuff) ## Create the .genmeta file for the item with all the other information attached to it
  531.                                         except:
  532.                                             pass
  533.                                         vindex += 1
  534.                                         itemnum += 1
  535.                                     except:
  536.                                         pass
  537.                                 try:
  538.                                     if os.path.exists(shotstuff["PLACEHOLDER"]) == True:
  539.                                         pf.write('                <Version Index="' + str(vindex) + '" Name="_' + shotname.replace("-","_") + '_placeholder_jpg_" UUID="' + str(uuid.uuid4()) + '" InPoint="1" UserFrame="2" Status="' + vstuff["STATUS"] + '" PrevStatus="None" Assign="' + vstuff["SUBMITTINGARTIST"] + '" PrevAssign="None"/>\n') ## Info for the placeholder if available
  540.                                     else:
  541.                                         pass
  542.                                 except:
  543.                                     pass
  544.                                 pf.write('              </Versions>\n')
  545.                                 pf.write('            </Clip>\n')
  546.                                 clipin = clipout
  547.                                 shotnum += 1
  548.                                 print shotname + " added"
  549.                             except:
  550.                                 pass
  551.                         pf.write('          </Clips>\n')
  552.                         pf.write('        </Track>\n')
  553.                         pf.write('        <Track Name="TrackM1" UUID="' + str(uuid.uuid4()) + '">\n') ## For some reason, Generation likes to have an extry empty track listed. I THINK its a bug as it seems to be hit and miss if this section is commented out.
  554.                         pf.write('          <Clips/>\n')
  555.                         pf.write('        </Track>\n')
  556.                         pf.write('      </Tracks>\n')
  557.                         pf.write('    </Sub>\n')
  558.  
  559.                 else:
  560.                     pass
  561.             pf.write("  </Subs>\n")
  562.  
  563.             ## (B-4) Continue creating the information needed for the .genproj file.
  564.  
  565.             ## Default.
  566.             pf.write("  <Render>\n")
  567.             pf.write("    <Queues/>\n")
  568.             pf.write("  </Render>\n")
  569.  
  570.             ## Muse has its own proxy system that we use, so this is all default values; all of which can be changed.
  571.             pf.write("  <Proxy>\n")
  572.             pf.write("    <ProxyGroups>\n")
  573.             pf.write('      <ProxyGroup Name="local" PathDepth="14">\n')
  574.             pf.write("        <Paths/>\n")
  575.             pf.write("      </ProxyGroup>\n")
  576.             pf.write('      <ProxyGroup Name="network" PathDepth="14">\n')
  577.             pf.write("        <Paths>\n")
  578.             pf.write("          <Path>C:\\\\Gen_Proxy\\\\</Path>\n")
  579.             pf.write("        </Paths>\n")
  580.             pf.write("      </ProxyGroup>\n")
  581.             pf.write("    </ProxyGroups>\n")
  582.             pf.write("  </Proxy>\n")
  583.  
  584.             pf.write("  <Info>\n")
  585.             pf.write('    <LoadedSub>' + showsubs.keys()[0] + "_" + showsubs[str(showsubs.keys()[0])]["0"] + '</LoadedSub>\n') ## Defines the first sub directory to be loaded.
  586.             pf.write('    <LoadedTrack>' + showsubs.keys()[0] + "_" + showsubs[str(showsubs.keys()[0])]["0"] + '</LoadedTrack>\n') ## Defines the track in that sub directory to be loaded.
  587.  
  588.             pf.write("    <HistoryCount>1</HistoryCount>\n") ## This particular number really doesn't seem to matter. Default is one(1) so I've just decided to leave it alone. Haven't really figured out if it serves an actual purpose. Generation mystery!
  589.  
  590.             pf.write("    <LUTPath>S:\\net_exe\\eyeon\\generation\\LUTS\\</LUTPath>\n") ## Generation default LUT path. Can be changed.
  591.             pf.write("    <GuidePath>C:\\Program Files\\eyeon\\Generation [AM]\\S:\\net_exe\\eyeon\\generation\\Generation_3.1_062612\\guides\\</GuidePath>\n") ## Muse default guide path. Can be changed.
  592.  
  593.             ## Define LUTs to use.
  594.             pf.write("    <LUTs>\n")
  595.             ## These are the default LUT paths.
  596.             # pf.write("      <LUT>S:\\net_exe\\eyeon\\generation\\LUTS\\AlexaV3_K1S1_LogC2Video_Rec709_EE_fusion3d.3dl</LUT>\n")
  597.             # pf.write("      <LUT>S:\\net_exe\\eyeon\\generation\\LUTS\\log_blk95_sRGB.alut3</LUT>\n")
  598.             # pf.write("      <LUT>S:\\net_exe\\eyeon\\generation\\LUTS\\Log_to_sRGB.setting</LUT>\n")
  599.             # pf.write("      <LUT>S:\\net_exe\\eyeon\\generation\\LUTS\\Lin2sRGB.3dl</LUT>\n")
  600.             # pf.write("      <LUT>S:\\net_exe\\eyeon\\generation\\LUTS\\m_Gamma2.2.setting</LUT>\n")
  601.  
  602.             ## If you have your own LUTs, its best to provide them within the SML.
  603.             for i in LUTlist:
  604.                 try:
  605.                     pf.write("      <LUT>" + i + "</LUT>\n")
  606.                 except:
  607.                     pass
  608.             for i in standardLUTS:
  609.                 try:
  610.                     pf.write("      <LUT>" + i + "</LUT>\n")
  611.                 except:
  612.                     pass
  613.             pf.write("    </LUTs>\n")
  614.  
  615.             ## This sets the given LUTs to the numbers at the bottom right of viewport in Generation.
  616.             pf.write("    <LUTSlots>\n")
  617.             for i in range(5):
  618.                 try:
  619.                     pf.write("      <LUT>" + LUTlist[i] + "</LUT>\n")
  620.                 except:
  621.                     pass
  622.             pf.write("    </LUTSlots>\n")
  623.  
  624.             ## These are the default paths for the Guides.
  625.             pf.write("    <Guides>\n")
  626.             pf.write("      <Guide>S:\\net_exe\\eyeon\\generation\\Generation_3.1_062612\\guides\\SafeFrame.guide</Guide>\n")
  627.             pf.write("      <Guide>S:\\net_exe\\eyeon\\generation\\Generation_3.1_062612\\guides\\whd_frame.guide</Guide>\n")
  628.             pf.write("      <Guide>S:\\net_exe\\eyeon\\generation\\Generation_3.1_062612\\guides\\test.guide</Guide>\n")
  629.             pf.write("    </Guides>\n")
  630.             ## This sets the guides to their appropriate slots (the numbers beside the LUT numbers).
  631.             pf.write("    <GuideSlots>\n")
  632.             pf.write("      <Guide>S:\\net_exe\\eyeon\\generation\\Generation_3.1_062612\\guides\\SafeFrame.guide</Guide>\n")
  633.             pf.write("      <Guide>S:\\net_exe\\eyeon\\generation\\Generation_3.1_062612\\guides\\whd_frame.guide</Guide>\n")
  634.             pf.write("      <Guide>S:\\net_exe\\eyeon\\generation\\Generation_3.1_062612\\guides\\test.guide</Guide>\n")
  635.             pf.write("    </GuideSlots>\n")
  636.  
  637.             date = datetime.datetime.now()
  638.             pf.write("    <LastSaved>" + str(date).split(" ")[0].replace("-","") + "-" + str(date).split(" ")[1].split(".")[0].replace(":","") + "</LastSaved>\n")
  639.             pf.write("  </Info>\n")
  640.             pf.write("</GenProj>\n")
  641.             pf.close()
  642.         lf.close()
  643.  
  644.     return projfile
  645.  
  646. ## (C) Create placeholder function.
  647. def CreatePlaceholder(myfile): ## Creates placeholders. NOTE: Uses ImageMagik.
  648.     shot = os.path.basename(myfile).split("placeholder")[0]
  649.     os.chdir(imgmagik)
  650.     newplaceholder = myfile.rsplit("\\",1)[0] + "\\" + shot + "placeholder.jpg"
  651.     ## 'sslate' refers to a custom blank slate for Img Magick to use. You could also just have ImgMagik create a black frame instead by changing the 'command'.
  652.     command = ('convert -size 1920x1080 canvas:black ' + sslate + ' -composite -pointsize 200 -fill white -annotate +100+790 "' + shot + '" ' + newplaceholder)
  653.     os.system(command)
  654.     return
  655.  
  656. ## (D) Create Generation Metadata file.
  657. def CreateGenMeta(vstuff): ## Adds extra information the .genmeta file to be loaded into Generation per item. .genmeta is also in standard XML format.
  658.     vdict = vstuff.copy()
  659.     if os.path.exists(vdict["FILEPATH_LPROXY"]) == True:
  660.         myfile = vdict["FILEPATH_LPROXY"]
  661.  
  662.     elif os.path.exists(vdict["FILEPATH_NPROXY"]) == True:
  663.         myfile = vdict["FILEPATH_NPROXY"]
  664.  
  665.     else:
  666.         myfile = vdict["FILEPATH"]
  667.  
  668.     genfile = (myfile.rsplit("\\",1)[0]) + "\\" + vdict["SHOTNAME"] + "_" + vdict["VERSION"] + "..genmeta"
  669.     if os.path.exists(genfile) == False:
  670.         os.remove(genfile)
  671.     with open(genfile, "w") as gf:
  672.         gf.write('<?xml version="1.0" encoding="UTF-8"?>\n')
  673.         gf.write('<eyeonGeneration>\n')
  674.         gf.write('  <Metadata>\n')
  675.         gf.write('    <ShowName>"' + vdict["SHOW"] + '"</ShowName>\n')
  676.         gf.write('    <Episode>"' + vdict["EPISODE"] + '"</Episode>\n')
  677.         gf.write('    <ShotName>"' + vdict["SHOTNAME"] + '"</ShotName>\n')
  678.         gf.write('    <Sequence>"' + vdict["SEQUENCE"] + '"</Sequence>\n')
  679.         gf.write('    <OriginalReel>"' + vdict["ORIGREEL"] + '"</OriginalReel>\n')
  680.         gf.write('    <Length>"' + vdict["LENGTH"] + '"</Length>\n')
  681.         gf.write('    <GridLocator>"' + vdict["GRIDLOCATOR"] + '"</GridLocator>\n')
  682.         gf.write('    <ShotType>"' + vdict["SHOTTYPE"] + '"</ShotType>\n')
  683.         gf.write('    <MainFilepath>"' + vdict["FILEPATH"] + '"</MainFilepath>\n')
  684.         gf.write('    <NetworkProxy>"' + vdict["FILEPATH_NPROXY"] + '"</NetworkProxy>\n')
  685.         gf.write('    <LocalProxy>"' + vdict["FILEPATH_LPROXY"] + '"</LocalProxy>\n')
  686.         gf.write('    <CDLPath>"' + vdict["CDL_PATH"] + '"</CDLPath>\n')
  687.         gf.write('    <LUTPath>"' + vdict["LUT_PATH"] + '"</LUTPath>\n')
  688.         gf.write('  </Metadata>')
  689.         gf.write('</eyeonGeneration>')
  690.         gf.close()
  691.  
  692.     return
  693.  
  694. ## (E) Read in CDLs for use per item.
  695. def ReadCDL(cdl): ## Reads standard CDL files.
  696.     cdlinfo = {}
  697.     cdlinfo["OFFSET"] = {}
  698.     cdlinfo["SLOPE"] = {}
  699.     cdlinfo["POWER"] = {}
  700.     cdlxml = et.parse(cdl)
  701.     cdlroot = cdlxml.getroot()
  702.     for cc in cdlroot.iter("ColorCorrection"):
  703.         for sop in cc.iter('SOPNode'):
  704.             slope = sop.find("Slope").text.strip()
  705.             cdlinfo["SLOPE"]["RED"] = slope.split()[0]
  706.             cdlinfo["SLOPE"]["GREEN"] = slope.split()[1]
  707.             cdlinfo["SLOPE"]["BLUE"] = slope.split()[2]
  708.             offset = sop.find("Offset").text.strip()
  709.             cdlinfo["OFFSET"]["RED"] = offset.split()[0]
  710.             cdlinfo["OFFSET"]["GREEN"] = offset.split()[1]
  711.             cdlinfo["OFFSET"]["BLUE"] = offset.split()[2]
  712.             power = sop.find("Power").text.strip()
  713.             cdlinfo["POWER"]["RED"] = power.split()[0]
  714.             cdlinfo["POWER"]["GREEN"] = power.split()[1]
  715.             cdlinfo["POWER"]["BLUE"] = power.split()[2]
  716.         for sat in cc.iter('SatNode'):
  717.             saturation = sat.find("Saturation").text.strip()
  718.             cdlinfo["SATURATION"] = saturation
  719.     return cdlinfo
  720.  
  721. ## (F) Launch Generation with newly created project file.
  722. def LaunchGen(xml): ## Simply launch everything.
  723.     genproj = BuildProj(xml)
  724.     subprocess.Popen([BMGeneration ,genproj])
  725.     return
  726.  
  727. ## (G) Can only run script as its own. Cannot be called.
  728. if __name__ == "__main__":
  729.     print "MuseGD_" + str(__VERSION__) + "\n"
  730.     time.sleep(1)
  731.     xml = sys.argv[1]
  732.     LaunchGen(xml)
  733.     time.sleep(5)
Added in 3 minutes 59 seconds:
StevieB's no longer at Muse, alas. He signed on with Encore to help build pipeline for their facility in Atlanta so he could be closer to his family. It think he's at Crafty Apes now, if I remember right. The above is probably the script he was referring to.

User avatar
Midgardsormr
Fusionator
Posts: 2172
Joined: Wed Nov 26, 2014 8:04 pm
Answers: 28
Location: Los Angeles, CA, USA
Been thanked: 41 times
Contact:

Re: Generation scripts in Reactor

#8

Post by Midgardsormr »

And I've found some test XML documents. I haven't compared them to see if the format is the same, so I'll just post both here.

Code: [Select all] [Expand/Collapse] [Download] (TEST_v01_00.xml)
  1. <PROJECT>DAILIES_TEST
  2.     <SHOW>DWAB
  3.         <CDLROOTPATH></CDLROOTPATH>
  4.         <EPISODE>221
  5.             <SHOTNAME>VFX07
  6.                 <ITEM>v02
  7.                     <FILEPATH>Z:\DWAB\221\DWAB_221_07\composites\DWAB_221_07_v02\1920x1080\DWAB_221_07_v02_0001.tga</FILEPATH>
  8.                     <ORIGREELNAME></ORIGREELNAME>
  9.                     <SEQUENCE></SEQUENCE>
  10.                     <TYPE></TYPE>
  11.                     <LENGTH>230</LENGTH>
  12.                     <NOTE>You want the truth? YOU CAN'T HANDLE THE TRUTH!</NOTE>
  13.                     <STATUS>Work in Progress</STATUS>
  14.                     <SUBMITTINGARTIST>sbenjamin</SUBMITTINGARTIST>
  15.                     <ALLARTISTS>Blochi/comp  StevieB/comp  Bobby/Light</ALLARTISTS>
  16.                     <GRIDLOCATOR></GRIDLOCATOR>
  17.                 </ITEM>
  18.                 <ITEM>v03
  19.                     <FILEPATH>Z:\DWAB\221\DWAB_221_07\composites\DWAB_221_07_v03\1920x1080\DWAB_221_07_v03_0001.tga</FILEPATH>
  20.                     <ORIGREELNAME></ORIGREELNAME>
  21.                     <SEQUENCE></SEQUENCE>
  22.                     <TYPE></TYPE>
  23.                     <LENGTH>230</LENGTH>
  24.                     <NOTE>I'm a leaf on the wind. Watch how I soar.</NOTE>
  25.                     <STATUS>Greenlit</STATUS>
  26.                     <SUBMITTINGARTIST>fpienkos</SUBMITTINGARTIST>
  27.                     <ALLARTISTS>Fred/comp</ALLARTISTS>
  28.                     <GRIDLOCATOR></GRIDLOCATOR>
  29.                 </ITEM>
  30.             </SHOTNAME>
  31.         </EPISODE>
  32.         <EPISODE>222
  33.             <SHOTNAME>VFX01
  34.                 <ITEM>v01
  35.                     <FILEPATH>Z:\DWAB\222\DWAB_222_01\v01\1920x1080\DWAB_222_01_v01_0001.tga</FILEPATH>
  36.                     <ORIGREELNAME></ORIGREELNAME>
  37.                     <SEQUENCE></SEQUENCE>
  38.                     <TYPE></TYPE>
  39.                     <LENGTH>70</LENGTH>
  40.                     <NOTE>Luke. I am your father.</NOTE>
  41.                     <STATUS>Greenlit</STATUS>
  42.                     <SUBMITTINGARTIST></SUBMITTINGARTIST>
  43.                     <ALLARTISTS></ALLARTISTS>
  44.                     <GRIDLOCATOR></GRIDLOCATOR>
  45.                 </ITEM>
  46.                 <ITEM>v02
  47.                     <FILEPATH>Z:\DWAB\222\DWAB_222_01\v02\1920x1080\DWAB_222_01_v02_0001.tga</FILEPATH>
  48.                     <ORIGREELNAME></ORIGREELNAME>
  49.                     <SEQUENCE></SEQUENCE>
  50.                     <TYPE></TYPE>
  51.                     <LENGTH>70</LENGTH>
  52.                     <NOTE>NNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!!!!!!</NOTE>
  53.                     <STATUS>Not Started</STATUS>
  54.                     <SUBMITTINGARTIST></SUBMITTINGARTIST>
  55.                     <ALLARTISTS></ALLARTISTS>
  56.                     <GRIDLOCATOR></GRIDLOCATOR>
  57.                 </ITEM>
  58.             </SHOTNAME>
  59.             <SHOTNAME>VFX15
  60.                 <ITEM>v01
  61.                     <FILEPATH>Z:\DWAB\222\DWAB_222_15\v01\1920x1080\DWAB_222_15_v01_0001.tga</FILEPATH>
  62.                     <ORIGREELNAME></ORIGREELNAME>
  63.                     <SEQUENCE></SEQUENCE>
  64.                     <TYPE></TYPE>
  65.                     <LENGTH>53</LENGTH>
  66.                     <NOTE>Say hello to my little friend!</NOTE>
  67.                     <STATUS>Work in Progress</STATUS>
  68.                     <SUBMITTINGARTIST></SUBMITTINGARTIST>
  69.                     <ALLARTISTS></ALLARTISTS>
  70.                     <GRIDLOCATOR></GRIDLOCATOR>
  71.                 </ITEM>
  72.                 <ITEM>v02
  73.                     <FILEPATH>Z:\DWAB\222\DWAB_222_15\v02\1920x1080\DWAB_222_15_v02_0001.tga</FILEPATH>
  74.                     <ORIGREELNAME></ORIGREELNAME>
  75.                     <SEQUENCE></SEQUENCE>
  76.                     <TYPE></TYPE>
  77.                     <LENGTH>53</LENGTH>
  78.                     <NOTE>Ray. When someone asks if you're a god...you say YES!</NOTE>
  79.                     <STATUS>Greenlit</STATUS>
  80.                     <SUBMITTINGARTIST></SUBMITTINGARTIST>
  81.                     <ALLARTISTS></ALLARTISTS>
  82.                     <GRIDLOCATOR></GRIDLOCATOR>
  83.                 </ITEM>
  84.             </SHOTNAME>
  85.         </EPISODE>
  86.     </SHOW>
  87.     <SHOW>TEEN_WOLF
  88.         <CDLROOTPATH>W:\Teen_Wolf\CDLs\Season04</CDLROOTPATH>
  89.         <EPISODE>401
  90.             <SHOTNAME>401_001X001
  91.                 <ITEM>v01
  92.                     <FILEPATH>Z:\Teen_Wolf\401\TW_401_001x001\v01\1920x1080\401_001x001_v01_0001.dpx</FILEPATH>
  93.                     <ORIGREELNAME>A030C003_140224_R2RN.mov</ORIGREELNAME>
  94.                     <SEQUENCE></SEQUENCE>
  95.                     <TYPE></TYPE>
  96.                     <LENGTH>300</LENGTH>
  97.                     <NOTE>Mama always said that life was like a box of chocolates.</NOTE>
  98.                     <STATUS>Work in Progress</STATUS>
  99.                     <SUBMITTINGARTIST></SUBMITTINGARTIST>
  100.                     <ALLARTISTS></ALLARTISTS>
  101.                     <GRIDLOCATOR></GRIDLOCATOR>
  102.                 </ITEM>
  103.                 <ITEM>v02
  104.                     <FILEPATH>Z:\Teen_Wolf\401\TW_401_001x001\v02\1920x1080\401_001x001_v02_0001.dpx</FILEPATH>
  105.                     <ORIGREELNAME>A030C003_140224_R2RN.mov</ORIGREELNAME>
  106.                     <SEQUENCE></SEQUENCE>
  107.                     <TYPE></TYPE>
  108.                     <LENGTH>300</LENGTH>
  109.                     <NOTE>Waaaaattter sucks. It really, really sucks! Waaaaaattteerrr sucks. It really, really ssssuuuuccckkkksssss!</NOTE>
  110.                     <STATUS>Greenlit</STATUS>
  111.                     <SUBMITTINGARTIST>fpienkos</SUBMITTINGARTIST>
  112.                     <ALLARTISTS>Blochi/comp</ALLARTISTS>
  113.                     <GRIDLOCATOR></GRIDLOCATOR>
  114.                 </ITEM>
  115.                 <ITEM>v03
  116.                     <FILEPATH>Z:\Teen_Wolf\401\TW_401_001x001\v03\1920x1080\401_001x001_v03_0001.dpx</FILEPATH>
  117.                     <ORIGREELNAME>A030C003_140224_R2RN.mov</ORIGREELNAME>
  118.                     <SEQUENCE></SEQUENCE>
  119.                     <TYPE></TYPE>
  120.                     <LENGTH>300</LENGTH>
  121.                     <NOTE>Hello, my name is Inigo Montoya. You killed my father. Prepare to die.</NOTE>
  122.                     <STATUS>Needs Redo</STATUS>
  123.                     <SUBMITTINGARTIST>musebot</SUBMITTINGARTIST>
  124.                     <ALLARTISTS>StevieB/comp  Tom/roto</ALLARTISTS>
  125.                     <GRIDLOCATOR></GRIDLOCATOR>
  126.                 </ITEM>
  127.             </SHOTNAME>
  128.             <SHOTNAME>401_001X003
  129.                 <ITEM>v01
  130.                     <FILEPATH>Z:\Teen_Wolf\401\TW_401_001x003\v01\1920x1080\TW_401_001x003_0001.dpx</FILEPATH>
  131.                     <ORIGREELNAME>A030C010_140224_R2RN.mov</ORIGREELNAME>
  132.                     <SEQUENCE></SEQUENCE>
  133.                     <TYPE></TYPE>
  134.                     <LENGTH>127</LENGTH>
  135.                     <NOTE>Tis only a scratch!</NOTE>
  136.                     <STATUS>Greenlit</STATUS>
  137.                     <SUBMITTINGARTIST></SUBMITTINGARTIST>
  138.                     <ALLARTISTS></ALLARTISTS>
  139.                     <GRIDLOCATOR></GRIDLOCATOR>
  140.                 </ITEM>
  141.             </SHOTNAME>
  142.         </EPISODE>
  143.         <EPISODE>402
  144.             <SHOTNAME>402_002X001
  145.                 <ITEM>v01
  146.                     <FILEPATH>Z:\Teen_Wolf\402\402_002X001\v01\402_002X001_v01_0001.dpx</FILEPATH>
  147.                     <ORIGREELNAME>A050C024_140228_R2RN.mov</ORIGREELNAME>
  148.                     <SEQUENCE></SEQUENCE>
  149.                     <TYPE></TYPE>
  150.                     <LENGTH>133</LENGTH>
  151.                     <NOTE>All right, you primitive screwheads, listen up -- you see this? This... is my boomstick!</NOTE>
  152.                     <STATUS>Needs Redo</STATUS>
  153.                     <SUBMITTINGARTIST></SUBMITTINGARTIST>
  154.                     <ALLARTISTS></ALLARTISTS>
  155.                     <GRIDLOCATOR></GRIDLOCATOR>
  156.                 </ITEM>
  157.             </SHOTNAME>
  158.             <SHOTNAME>402_002X003
  159.                 <ITEM>v01
  160.                     <FILEPATH>Z:\Teen_Wolf\402\402_002X003\v01\1920x1080\402_002X003_v01_0001.dpx</FILEPATH>
  161.                     <ORIGREELNAME>A052C007_140301_R2RN.mov</ORIGREELNAME>
  162.                     <SEQUENCE></SEQUENCE>
  163.                     <TYPE></TYPE>
  164.                     <LENGTH>374</LENGTH>
  165.                     <NOTE> You've got to ask yourself one question: 'Do I feel lucky?' Well, do ya, punk?</NOTE>
  166.                     <STATUS>Work in Progress</STATUS>
  167.                     <SUBMITTINGARTIST></SUBMITTINGARTIST>
  168.                     <ALLARTISTS></ALLARTISTS>
  169.                     <GRIDLOCATOR></GRIDLOCATOR>
  170.                 </ITEM>
  171.                 <ITEM>v02
  172.                     <FILEPATH>Z:\Teen_Wolf\402\402_002X003\v02\1920x1080\402_002X003_v02_0001.dpx</FILEPATH>
  173.                     <ORIGREELNAME>A052C007_140301_R2RN.mov</ORIGREELNAME>
  174.                     <SEQUENCE></SEQUENCE>
  175.                     <TYPE></TYPE>
  176.                     <LENGTH>374</LENGTH>
  177.                     <NOTE>Houston, we have a problem.</NOTE>
  178.                     <STATUS>Greenlit</STATUS>
  179.                     <SUBMITTINGARTIST></SUBMITTINGARTIST>
  180.                     <ALLARTISTS></ALLARTISTS>
  181.                     <GRIDLOCATOR></GRIDLOCATOR>
  182.                 </ITEM>
  183.             </SHOTNAME>
  184.         </EPISODE>
  185.     </SHOW>
  186. </PROJECT>
Code: [Select all] [Expand/Collapse] [Download] (TEST_v02_00.xml)
  1. <PROJECT>DAILIES
  2.     <PROJECTFILE>TEST</PROJECTFILE>
  3.     <PROJECTLOCATION></PROJECTLOCATION>
  4.     <SHOW>TESTING
  5.         <CDLROOTPATH></CDLROOTPATH>
  6.         <EPISODE>102
  7.             <SHOTNAME>102_006_030
  8.                 <ITEM>115-v0005025
  9.                     <FILEPATH>""</FILEPATH>
  10.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  11.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  12.                     <VERSION>v04</VERSION>
  13.                     <ORIGREELNAME></ORIGREELNAME>
  14.                     <SEQUENCE></SEQUENCE>
  15.                     <TYPE>Composite</TYPE>
  16.                     <LENGTH>148</LENGTH>
  17.                     <NOTE></NOTE>
  18.                     <STATUS>Client Reviewing</STATUS>
  19.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  20.                     <ALLARTISTS>""</ALLARTISTS>
  21.                     <GRIDLOCATOR>""</GRIDLOCATOR>
  22.                 </ITEM>
  23.                 <ITEM>116-v0005026
  24.                     <FILEPATH>""</FILEPATH>
  25.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  26.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  27.                     <VERSION>v05</VERSION>
  28.                     <ORIGREELNAME></ORIGREELNAME>
  29.                     <SEQUENCE></SEQUENCE>
  30.                     <TYPE>Composite</TYPE>
  31.                     <LENGTH>148</LENGTH>
  32.                     <NOTE></NOTE>
  33.                     <STATUS>Client Reviewing</STATUS>
  34.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  35.                     <ALLARTISTS>""</ALLARTISTS>
  36.                     <GRIDLOCATOR>v0005026</GRIDLOCATOR>
  37.                 </ITEM>
  38.                 <ITEM>117-v0005109
  39.                     <FILEPATH>""</FILEPATH>
  40.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  41.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  42.                     <VERSION>v06</VERSION>
  43.                     <ORIGREELNAME></ORIGREELNAME>
  44.                     <SEQUENCE></SEQUENCE>
  45.                     <TYPE>Composite</TYPE>
  46.                     <LENGTH>148</LENGTH>
  47.                     <NOTE></NOTE>
  48.                     <STATUS>Client Reviewing</STATUS>
  49.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  50.                     <ALLARTISTS>""</ALLARTISTS>
  51.                     <GRIDLOCATOR>v0005109</GRIDLOCATOR>
  52.                 </ITEM>
  53.             </SHOTNAME>
  54.             <SHOTNAME>102_022_020
  55.                 <ITEM>118-v0005035
  56.                     <FILEPATH>""</FILEPATH>
  57.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  58.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  59.                     <VERSION>v03</VERSION>
  60.                     <ORIGREELNAME></ORIGREELNAME>
  61.                     <SEQUENCE></SEQUENCE>
  62.                     <TYPE>Composite</TYPE>
  63.                     <LENGTH>173</LENGTH>
  64.                     <NOTE></NOTE>
  65.                     <STATUS>Client Reviewing</STATUS>
  66.                     <SUBMITTINGARTIST>sbenjamin</SUBMITTINGARTIST>
  67.                     <ALLARTISTS>sbenjamin</ALLARTISTS>
  68.                     <GRIDLOCATOR>v0005035</GRIDLOCATOR>
  69.                 </ITEM>
  70.                 <ITEM>119-v0005117
  71.                     <FILEPATH>""</FILEPATH>
  72.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  73.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  74.                     <VERSION>v04</VERSION>
  75.                     <ORIGREELNAME></ORIGREELNAME>
  76.                     <SEQUENCE></SEQUENCE>
  77.                     <TYPE>Composite</TYPE>
  78.                     <LENGTH>173</LENGTH>
  79.                     <NOTE></NOTE>
  80.                     <STATUS>Client Reviewing</STATUS>
  81.                     <SUBMITTINGARTIST>sbenjamin</SUBMITTINGARTIST>
  82.                     <ALLARTISTS>sbenjamin</ALLARTISTS>
  83.                     <GRIDLOCATOR>v0005117</GRIDLOCATOR>
  84.                 </ITEM>
  85.             </SHOTNAME>
  86.             <SHOTNAME>102_030_010
  87.                 <ITEM>120-v0005004
  88.                     <FILEPATH>""</FILEPATH>
  89.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  90.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  91.                     <VERSION></VERSION>
  92.                     <ORIGREELNAME></ORIGREELNAME>
  93.                     <SEQUENCE></SEQUENCE>
  94.                     <TYPE>Plate</TYPE>
  95.                     <LENGTH>112</LENGTH>
  96.                     <NOTE></NOTE>
  97.                     <STATUS>Delivered</STATUS>
  98.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  99.                     <ALLARTISTS>""</ALLARTISTS>
  100.                     <GRIDLOCATOR>v0005004</GRIDLOCATOR>
  101.                 </ITEM>
  102.                 <ITEM>121-v0005011
  103.                     <FILEPATH>""</FILEPATH>
  104.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  105.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  106.                     <VERSION>v01</VERSION>
  107.                     <ORIGREELNAME></ORIGREELNAME>
  108.                     <SEQUENCE></SEQUENCE>
  109.                     <TYPE>Composite</TYPE>
  110.                     <LENGTH>112</LENGTH>
  111.                     <NOTE></NOTE>
  112.                     <STATUS>Delivered</STATUS>
  113.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  114.                     <ALLARTISTS>""</ALLARTISTS>
  115.                     <GRIDLOCATOR>v0005011</GRIDLOCATOR>
  116.                 </ITEM>
  117.                 <ITEM>122-v0005038
  118.                     <FILEPATH>""</FILEPATH>
  119.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  120.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  121.                     <VERSION>v02</VERSION>
  122.                     <ORIGREELNAME></ORIGREELNAME>
  123.                     <SEQUENCE></SEQUENCE>
  124.                     <TYPE>Composite</TYPE>
  125.                     <LENGTH>112</LENGTH>
  126.                     <NOTE></NOTE>
  127.                     <STATUS>Delivered</STATUS>
  128.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  129.                     <ALLARTISTS>""</ALLARTISTS>
  130.                     <GRIDLOCATOR>v0005038</GRIDLOCATOR>
  131.                 </ITEM>
  132.             </SHOTNAME>
  133.             <SHOTNAME>102_030_020
  134.                 <ITEM>123-v0005005
  135.                     <FILEPATH>""</FILEPATH>
  136.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  137.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  138.                     <VERSION></VERSION>
  139.                     <ORIGREELNAME></ORIGREELNAME>
  140.                     <SEQUENCE></SEQUENCE>
  141.                     <TYPE>Plate</TYPE>
  142.                     <LENGTH>56</LENGTH>
  143.                     <NOTE></NOTE>
  144.                     <STATUS>Delivered</STATUS>
  145.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  146.                     <ALLARTISTS>""</ALLARTISTS>
  147.                     <GRIDLOCATOR>v0005005</GRIDLOCATOR>
  148.                 </ITEM>
  149.                 <ITEM>124-v0005014
  150.                     <FILEPATH>""</FILEPATH>
  151.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  152.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  153.                     <VERSION>v01</VERSION>
  154.                     <ORIGREELNAME></ORIGREELNAME>
  155.                     <SEQUENCE></SEQUENCE>
  156.                     <TYPE>Composite</TYPE>
  157.                     <LENGTH>56</LENGTH>
  158.                     <NOTE></NOTE>
  159.                     <STATUS>Delivered</STATUS>
  160.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  161.                     <ALLARTISTS>""</ALLARTISTS>
  162.                     <GRIDLOCATOR>v0005014</GRIDLOCATOR>
  163.                 </ITEM>
  164.             </SHOTNAME>
  165.             <SHOTNAME>102_030_030
  166.                 <ITEM>125-v0005006
  167.                     <FILEPATH>""</FILEPATH>
  168.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  169.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  170.                     <VERSION></VERSION>
  171.                     <ORIGREELNAME></ORIGREELNAME>
  172.                     <SEQUENCE></SEQUENCE>
  173.                     <TYPE>Plate</TYPE>
  174.                     <LENGTH>207</LENGTH>
  175.                     <NOTE></NOTE>
  176.                     <STATUS>Delivered</STATUS>
  177.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  178.                     <ALLARTISTS>""</ALLARTISTS>
  179.                     <GRIDLOCATOR>v0005006</GRIDLOCATOR>
  180.                 </ITEM>
  181.                 <ITEM>126-v0005015
  182.                     <FILEPATH>""</FILEPATH>
  183.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  184.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  185.                     <VERSION>v01</VERSION>
  186.                     <ORIGREELNAME></ORIGREELNAME>
  187.                     <SEQUENCE></SEQUENCE>
  188.                     <TYPE>Composite</TYPE>
  189.                     <LENGTH>207</LENGTH>
  190.                     <NOTE></NOTE>
  191.                     <STATUS>Delivered</STATUS>
  192.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  193.                     <ALLARTISTS>""</ALLARTISTS>
  194.                     <GRIDLOCATOR>v0005015</GRIDLOCATOR>
  195.                 </ITEM>
  196.             </SHOTNAME>
  197.             <SHOTNAME>102_030_040
  198.                 <ITEM>127-v0005007
  199.                     <FILEPATH>""</FILEPATH>
  200.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  201.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  202.                     <VERSION></VERSION>
  203.                     <ORIGREELNAME></ORIGREELNAME>
  204.                     <SEQUENCE></SEQUENCE>
  205.                     <TYPE>Plate</TYPE>
  206.                     <LENGTH>136</LENGTH>
  207.                     <NOTE></NOTE>
  208.                     <STATUS>Delivered</STATUS>
  209.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  210.                     <ALLARTISTS>""</ALLARTISTS>
  211.                     <GRIDLOCATOR>v0005007</GRIDLOCATOR>
  212.                 </ITEM>
  213.                 <ITEM>128-v0005021
  214.                     <FILEPATH>""</FILEPATH>
  215.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  216.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  217.                     <VERSION>v01</VERSION>
  218.                     <ORIGREELNAME></ORIGREELNAME>
  219.                     <SEQUENCE></SEQUENCE>
  220.                     <TYPE>Composite</TYPE>
  221.                     <LENGTH>136</LENGTH>
  222.                     <NOTE></NOTE>
  223.                     <STATUS>Delivered</STATUS>
  224.                     <SUBMITTINGARTIST>""</SUBMITTINGARTIST>
  225.                     <ALLARTISTS>""</ALLARTISTS>
  226.                     <GRIDLOCATOR>v0005021</GRIDLOCATOR>
  227.                 </ITEM>
  228.             </SHOTNAME>
  229.             <SHOTNAME>102_031_020
  230.                 <ITEM>129-v0005018
  231.                     <FILEPATH>""</FILEPATH>
  232.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  233.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  234.                     <VERSION>v04</VERSION>
  235.                     <ORIGREELNAME></ORIGREELNAME>
  236.                     <SEQUENCE></SEQUENCE>
  237.                     <TYPE>Composite</TYPE>
  238.                     <LENGTH>55</LENGTH>
  239.                     <NOTE></NOTE>
  240.                     <STATUS>Client Reviewing</STATUS>
  241.                     <SUBMITTINGARTIST>sbenjamin</SUBMITTINGARTIST>
  242.                     <ALLARTISTS>sbenjamin</ALLARTISTS>
  243.                     <GRIDLOCATOR>v0005018</GRIDLOCATOR>
  244.                 </ITEM>
  245.             </SHOTNAME>
  246.             <SHOTNAME>102_031_040
  247.                 <ITEM>130-v0005019
  248.                     <FILEPATH>""</FILEPATH>
  249.                     <FILEPATH_LPROXY></FILEPATH_LPROXY>
  250.                     <FILEPATH_NPROXY></FILEPATH_NPROXY>
  251.                     <VERSION>v04</VERSION>
  252.                     <ORIGREELNAME></ORIGREELNAME>
  253.                     <SEQUENCE></SEQUENCE>
  254.                     <TYPE>Composite</TYPE>
  255.                     <LENGTH>56</LENGTH>
  256.                     <NOTE></NOTE>
  257.                     <STATUS>Client Reviewing</STATUS>
  258.                     <SUBMITTINGARTIST>sbenjamin</SUBMITTINGARTIST>
  259.                     <ALLARTISTS>sbenjamin</ALLARTISTS>
  260.                     <GRIDLOCATOR>v0005019</GRIDLOCATOR>
  261.                 </ITEM>
  262.             </SHOTNAME>
  263.         </EPISODE>
  264.     </SHOW>
  265. </PROJECT>
Added in 7 minutes 34 seconds:
Looks like that's the only useful thing in StevieB's archive.