314 | | command = path_png2yuv[0] + " -n %s -v0 -I p -f %s -j '%s' | %s -b 5000 -a %s -v 1 -f 8 -o '%s'" \ |
315 | | % (totalframes, framespersecond, background, path_mpeg2enc[0], aspectratio, tempvideo) |
| 324 | if usejpeg == True: |
| 325 | command = path_jpeg2yuv[0] + " -n %s -v0 -I p -f %s -j '%s' | %s -b 5000 -a %s -v 1 -f 8 -o '%s'" \ |
| 326 | % (totalframes, framespersecond, background, path_mpeg2enc[0], aspectratio, tempvideo) |
| 327 | else: |
| 328 | command = path_png2yuv[0] + " -n %s -v0 -I p -f %s -j '%s' | %s -b 5000 -a %s -v 1 -f 8 -o '%s'" \ |
| 329 | % (totalframes, framespersecond, background, path_mpeg2enc[0], aspectratio, tempvideo) |
| 2186 | def createEmptyPreviewFolder(videoitem): |
| 2187 | previewfolder = os.path.join(getItemTempPath(videoitem), "preview") |
| 2188 | if os.path.exists(previewfolder): |
| 2189 | deleteAllFilesInFolder(previewfolder) |
| 2190 | os.rmdir (previewfolder) |
| 2191 | os.makedirs(previewfolder) |
| 2192 | return previewfolder |
| 2193 | |
| 2194 | |
| 2195 | def generateVideoPreview(videoitem, itemonthispage, menuitem, starttime, menulength, previewfolder): |
| 2196 | """generate thumnails for an preview in a menu""" |
| 2197 | |
| 2198 | positionx = 9999 |
| 2199 | positiony = 9999 |
| 2200 | maskpicture = None |
| 2201 | |
| 2202 | #run through the theme items and find any graphics that is using a movie identifier |
| 2203 | |
| 2204 | for node in menuitem.childNodes: |
| 2205 | if node.nodeName=="graphic": |
| 2206 | if node.attributes["filename"].value == "%movie": |
| 2207 | |
| 2208 | #This is an movie preview item so we need to generate the thumbnails |
| 2209 | |
| 2210 | inputfile = os.path.join(getItemTempPath(videoitem),"stream.mv2") |
| 2211 | outputfile = os.path.join(previewfolder, "preview-i%d-f" % itemonthispage) |
| 2212 | previewsize = "%dx%d" %(getScaledAttribute(node, "w"), getScaledAttribute(node, "h")) |
| 2213 | startframe=secondsToFrames(starttime) |
| 2214 | endframe=int(secondsToFrames(int(starttime + menulength))-1) |
| 2215 | |
| 2216 | splitcmd = path_transcode[0] + " -i %s -x auto,null -I 5 -Z %s -y im,null -F png -c %d-%d -o %s" %(inputfile, previewsize, startframe, endframe, outputfile) |
| 2217 | |
| 2218 | result = runCommand(splitcmd) |
| 2219 | if (result != 0): |
| 2220 | write( "split failed with code %d. Command = %s" % (result, splitcmd) ) |
| 2221 | positionx = getScaledAttribute(node, "x") |
| 2222 | positiony = getScaledAttribute(node, "y") |
| 2223 | |
| 2224 | #see if this graphics item has a mask |
| 2225 | |
| 2226 | if node.hasAttribute("mask"): |
| 2227 | imagemaskfilename = getThemeFile(themeName, node.attributes["mask"].value) |
| 2228 | if node.attributes["mask"].value <> "" and doesFileExist(imagemaskfilename): |
| 2229 | maskpicture = Image.open(imagemaskfilename,"r").resize((getScaledAttribute(node, "w"), getScaledAttribute(node, "h"))) |
| 2230 | maskpicture = maskpicture.convert("RGBA") |
| 2231 | |
| 2232 | return (positionx, positiony, maskpicture) |
| 2233 | |
| 2234 | |
2170 | 2235 | def drawThemeItem(page, itemsonthispage, itemnum, menuitem, bgimage, draw, |
2171 | 2236 | bgimagemask, drawmask, highlightcolor, spumuxdom, spunode, |
2172 | 2237 | numberofitems, chapternumber, chapterlist): |
2192 | | if doesFileExist(imagefilename): |
2193 | | picture = Image.open(imagefilename,"r").resize((getScaledAttribute(node, "w"), getScaledAttribute(node, "h"))) |
2194 | | picture = picture.convert("RGBA") |
2195 | | bgimage.paste(picture, (getScaledAttribute(node, "x"), getScaledAttribute(node, "y")), picture) |
2196 | | del picture |
2197 | | write( "Added image %s" % imagefilename) |
| 2256 | #if this graphic item is a movie thumbnail then we dont process it here |
| 2257 | if node.attributes["filename"].value == "%movie": |
| 2265 | if doesFileExist(imagefilename) == False: |
| 2266 | if imagefilename == node.attributes["filename"].value: |
| 2267 | imagefilename = getThemeFile(themeName, node.attributes["filename"].value) |
| 2268 | if doesFileExist(imagefilename): |
| 2269 | picture = Image.open(imagefilename,"r").resize((getScaledAttribute(node, "w"), getScaledAttribute(node, "h"))) |
| 2270 | picture = picture.convert("RGBA") |
| 2271 | |
| 2272 | #see if an image mask exists |
| 2273 | |
| 2274 | imagemaskfilename = None |
| 2275 | if node.hasAttribute("mask"): |
| 2276 | if node.attribute["mask"].value <> "": |
| 2277 | imagemaskfilename = getThemeFile(themeName, node.attributes["mask"].value) |
| 2278 | if imagemaskfilename <> None and doesFileExist(imagemaskfilename): |
| 2279 | maskpicture = Image.open(imagemaskfilename,"r").resize((getScaledAttribute(node, "w"), getScaledAttribute(node, "h"))) |
| 2280 | maskpicture = maskpicture.convert("RGBA") |
| 2281 | bgimage.paste(picture, (getScaledAttribute(node, "x"), getScaledAttribute(node, "y")), maskpicture) |
| 2282 | del maskpicture |
| 2283 | else: |
| 2284 | bgimage.paste(picture, (getScaledAttribute(node, "x"), getScaledAttribute(node, "y")), picture) |
| 2285 | del picture |
| 2286 | write( "Added image %s" % imagefilename) |
| 2287 | |
| 2288 | boundarybox=checkBoundaryBox(boundarybox, node) |
| 2289 | else: |
| 2290 | write( "Image file does not exist '%s'" % imagefilename) |
| 2291 | |
| 2561 | #need to check if any of the videos are flags as movies |
| 2562 | #and if so generate the required preview |
| 2563 | |
| 2564 | write( "Creating Preview Video") |
| 2565 | previewitem = itemnum |
| 2566 | itemsonthispage = 0 |
| 2567 | haspreview = False |
| 2568 | |
| 2569 | previewx = [] |
| 2570 | previewy = [] |
| 2571 | previewmask = [] |
| 2572 | while previewitem <= numberofitems and itemsonthispage < itemsperpage: |
| 2573 | menuitem=menuitems[ itemsonthispage ] |
| 2574 | itemsonthispage+=1 |
| 2575 | |
| 2576 | #make sure the preview folder is empty and present |
| 2577 | |
| 2578 | previewfolder = createEmptyPreviewFolder(previewitem) |
| 2579 | |
| 2580 | #and then generate the preview if required (px=9999 means not required) |
| 2581 | |
| 2582 | px, py, maskimage = generateVideoPreview(previewitem, itemsonthispage, menuitem, 0, menulength, previewfolder) |
| 2583 | previewx.append(px) |
| 2584 | previewy.append(py) |
| 2585 | previewmask.append(maskimage) |
| 2586 | if px != 9999: |
| 2587 | haspreview = True |
| 2588 | |
| 2589 | previewitem+=1 |
| 2590 | |
| 2591 | #previews generated but need to save where we started from |
| 2592 | savedpreviewitem = itemnum |
| 2593 | |
| 2639 | #now that the base background has been made and all the previews generated |
| 2640 | #we need to add the previews to the background |
| 2641 | #Assumption: We assume that there is nothing in the location of where the items go (ie, no text on the images) |
| 2642 | |
| 2643 | itemsonthispage = 0 |
| 2644 | |
| 2645 | numframes=secondsToFrames(menulength) |
| 2646 | |
| 2647 | #numframes should be the number of preview images that have been created |
| 2648 | |
| 2649 | if haspreview == True: |
| 2650 | # only generate the preview video if required. |
| 2651 | |
| 2652 | write( "Generation the chapter images" ) |
| 2653 | framenum = 0 |
| 2654 | while framenum < numframes: |
| 2655 | previewitem = savedpreviewitem |
| 2656 | itemsonthispage = 0 |
| 2657 | while previewitem <= numberofitems and itemsonthispage < itemsperpage: |
| 2658 | itemsonthispage+=1 |
| 2659 | if previewx[itemsonthispage-1] != 9999: |
| 2660 | previewpath = os.path.join(getItemTempPath(previewitem), "preview") |
| 2661 | previewfile = "preview-i%d-f%06d.png" % (itemsonthispage, framenum) |
| 2662 | imagefile = os.path.join(previewpath, previewfile) |
| 2663 | |
| 2664 | if doesFileExist(imagefile): |
| 2665 | picture = Image.open(imagefile, "r") |
| 2666 | picture = picture.convert("RGBA") |
| 2667 | imagemaskfile = os.path.join(previewpath, "mask-i%d.png" % itemsonthispage) |
| 2668 | if previewmask[itemsonthispage-1] != None: |
| 2669 | bgimage.paste(picture, (previewx[itemsonthispage-1], previewy[itemsonthispage-1]), previewmask[itemsonthispage-1]) |
| 2670 | else: |
| 2671 | bgimage.paste(picture, (previewx[itemsonthispage-1], previewy[itemsonthispage-1])) |
| 2672 | del picture |
| 2673 | previewitem+=1 |
| 2674 | #-> slow bgimage.save(os.path.join(getTempPath(),"background-%s-f%06d.png" % (page, framenum)),"PNG",quality=100,optimize=0,dpi=screendpi) |
| 2675 | bgimage.save(os.path.join(getTempPath(),"background-%s-f%06d.jpg" % (page, framenum)),"JPEG",dpi=screendpi) |
| 2676 | framenum+=1 |
| 2677 | |
2528 | | encodeMenu(os.path.join(getTempPath(),"background-%s.png" % page), |
2529 | | os.path.join(getTempPath(),"temp.m2v"), |
2530 | | getThemeFile(themeName,menumusic), |
2531 | | menulength, |
2532 | | os.path.join(getTempPath(),"temp.mpg"), |
2533 | | os.path.join(getTempPath(),"spumux-%s.xml" % page), |
2534 | | os.path.join(getTempPath(),"menu-%s.mpg" % page), |
2535 | | aspect_ratio) |
| 2704 | if haspreview == True: |
| 2705 | encodeMenu(os.path.join(getTempPath(),"background-%s-f%%06d.jpg" % page), |
| 2706 | os.path.join(getTempPath(),"temp.m2v"), |
| 2707 | getThemeFile(themeName,menumusic), |
| 2708 | menulength, |
| 2709 | os.path.join(getTempPath(),"temp.mpg"), |
| 2710 | os.path.join(getTempPath(),"spumux-%s.xml" % page), |
| 2711 | os.path.join(getTempPath(),"menu-%s.mpg" % page), |
| 2712 | aspect_ratio, |
| 2713 | True) |
| 2714 | else: |
| 2715 | encodeMenu(os.path.join(getTempPath(),"background-%s.png" % page), |
| 2716 | os.path.join(getTempPath(),"temp.m2v"), |
| 2717 | getThemeFile(themeName,menumusic), |
| 2718 | menulength, |
| 2719 | os.path.join(getTempPath(),"temp.mpg"), |
| 2720 | os.path.join(getTempPath(),"spumux-%s.xml" % page), |
| 2721 | os.path.join(getTempPath(),"menu-%s.mpg" % page), |
| 2722 | aspect_ratio, |
| 2723 | False) |
| 2808 | #now need to preprocess the menu to see if any preview videos are required |
| 2809 | #This must be done on an individual basis since we do the resize as the |
| 2810 | #images are extracted. |
| 2811 | |
| 2812 | #first make sure the preview folder is empty and present |
| 2813 | |
| 2814 | previewfolder = createEmptyPreviewFolder(page) |
| 2815 | |
| 2816 | haspreview = False |
| 2817 | |
| 2818 | previewsegment=int(getLengthOfVideo(page) / itemsperpage) |
| 2819 | previewtime = 0 |
| 2820 | previewchapter = 0 |
| 2821 | previewx = [] |
| 2822 | previewy = [] |
| 2823 | previewmask = [] |
| 2824 | while previewchapter < itemsperpage: |
| 2825 | menuitem=menuitems[ previewchapter ] |
| 2826 | |
| 2827 | #generate the preview if required (px=9999 means not required) |
| 2828 | |
| 2829 | px, py, maskimage = generateVideoPreview(page, previewchapter, menuitem, previewtime, menulength, previewfolder) |
| 2830 | previewx.append(px) |
| 2831 | previewy.append(py) |
| 2832 | previewmask.append(maskimage) |
| 2833 | if px != 9999: |
| 2834 | haspreview = True |
| 2835 | |
| 2836 | previewchapter+=1 |
| 2837 | previewtime+=previewsegment |
| 2838 | |
| 2858 | if haspreview == True: |
| 2859 | numframes=secondsToFrames(menulength) |
| 2860 | |
| 2861 | #numframes should be the number of preview images that have been created |
| 2862 | |
| 2863 | write( "Generation the sub-menu images" ) |
| 2864 | framenum = 0 |
| 2865 | while framenum < numframes: |
| 2866 | previewchapter = 0 |
| 2867 | while previewchapter < itemsperpage: |
| 2868 | if previewx[previewchapter] != 9999: |
| 2869 | previewpath = os.path.join(getItemTempPath(page), "preview") |
| 2870 | previewfile = "preview-i%d-f%06d.png" % (previewchapter, framenum) |
| 2871 | imagefile = os.path.join(previewpath, previewfile) |
| 2872 | |
| 2873 | if doesFileExist(imagefile): |
| 2874 | picture = Image.open(imagefile, "r") |
| 2875 | picture = picture.convert("RGBA") |
| 2876 | imagemaskfile = os.path.join(previewpath, "mask-i%d.png" % previewchapter) |
| 2877 | if previewmask[previewchapter] != None: |
| 2878 | bgimage.paste(picture, (previewx[previewchapter], previewy[previewchapter]), previewmask[previewchapter]) |
| 2879 | else: |
| 2880 | bgimage.paste(picture, (previewx[previewchapter], previewy[previewchapter])) |
| 2881 | del picture |
| 2882 | previewchapter+=1 |
| 2883 | bgimage.save(os.path.join(getTempPath(),"chaptermenu-%s-f%06d.jpg" % (page, framenum)),"JPEG",dpi=screendpi) |
| 2884 | framenum+=1 |
| 2885 | |
2651 | | encodeMenu(os.path.join(getTempPath(),"chaptermenu-%s.png" % page), |
2652 | | os.path.join(getTempPath(),"temp.m2v"), |
2653 | | getThemeFile(themeName,menumusic), |
2654 | | menulength, |
2655 | | os.path.join(getTempPath(),"temp.mpg"), |
2656 | | os.path.join(getTempPath(),"chapterspumux-%s.xml" % page), |
2657 | | os.path.join(getTempPath(),"chaptermenu-%s.mpg" % page), |
2658 | | aspect_ratio) |
| 2914 | if haspreview == True: |
| 2915 | encodeMenu(os.path.join(getTempPath(),"chaptermenu-%s-f%%06d.jpg" % page), |
| 2916 | os.path.join(getTempPath(),"temp.m2v"), |
| 2917 | getThemeFile(themeName,menumusic), |
| 2918 | menulength, |
| 2919 | os.path.join(getTempPath(),"temp.mpg"), |
| 2920 | os.path.join(getTempPath(),"chapterspumux-%s.xml" % page), |
| 2921 | os.path.join(getTempPath(),"chaptermenu-%s.mpg" % page), |
| 2922 | aspect_ratio, |
| 2923 | True) |
| 2924 | else: |
| 2925 | encodeMenu(os.path.join(getTempPath(),"chaptermenu-%s.png" % page), |
| 2926 | os.path.join(getTempPath(),"temp.m2v"), |
| 2927 | getThemeFile(themeName,menumusic), |
| 2928 | menulength, |
| 2929 | os.path.join(getTempPath(),"temp.mpg"), |
| 2930 | os.path.join(getTempPath(),"chapterspumux-%s.xml" % page), |
| 2931 | os.path.join(getTempPath(),"chaptermenu-%s.mpg" % page), |
| 2932 | aspect_ratio, |
| 2933 | False) |
| 2934 | |
2713 | | drawThemeItem(0, 0, itemnum, detailnode, bgimage, draw, None, None, |
| 3007 | drawThemeItem(0, 0, itemnum, detailnode, overlayimage, draw, None, None, |
| 3015 | if haspreview == True: |
| 3016 | numframes=secondsToFrames(menulength) |
| 3017 | |
| 3018 | #numframes should be the number of preview images that have been created |
| 3019 | |
| 3020 | write( "Generation the detail images" ) |
| 3021 | framenum = 0 |
| 3022 | while framenum < numframes: |
| 3023 | if previewx != 9999: |
| 3024 | previewpath = os.path.join(getItemTempPath(itemnum), "preview") |
| 3025 | previewfile = "preview-i%d-f%06d.png" % (1, framenum) |
| 3026 | imagefile = os.path.join(previewpath, previewfile) |
| 3027 | |
| 3028 | if doesFileExist(imagefile): |
| 3029 | picture = Image.open(imagefile, "r") |
| 3030 | picture = picture.convert("RGBA") |
| 3031 | imagemaskfile = os.path.join(previewpath, "mask-i%d.png" % 1) |
| 3032 | if previewmask != None: |
| 3033 | bgimage.paste(picture, (previewx, previewy), previewmask) |
| 3034 | else: |
| 3035 | bgimage.paste(picture, (previewx, previewy)) |
| 3036 | del picture |
| 3037 | bgimage.save(os.path.join(getTempPath(),"details-%s-f%06d.jpg" % (itemnum, framenum)),"JPEG",dpi=screendpi) |
| 3038 | framenum+=1 |
| 3039 | |
| 3040 | |
2732 | | encodeMenu(os.path.join(getTempPath(),"details-%s.png" % itemnum), |
2733 | | os.path.join(getTempPath(),"temp.m2v"), |
2734 | | getThemeFile(themeName,menumusic), |
2735 | | menulength, |
2736 | | os.path.join(getTempPath(),"temp.mpg"), |
2737 | | "", |
2738 | | os.path.join(getTempPath(),"details-%s.mpg" % itemnum), |
2739 | | aspect_ratio) |
| 3054 | if haspreview == True: |
| 3055 | encodeMenu(os.path.join(getTempPath(),"details-%s-f%%06d.jpg" % itemnum), |
| 3056 | os.path.join(getTempPath(),"temp.m2v"), |
| 3057 | getThemeFile(themeName,menumusic), |
| 3058 | menulength, |
| 3059 | os.path.join(getTempPath(),"temp.mpg"), |
| 3060 | "", |
| 3061 | os.path.join(getTempPath(),"details-%s.mpg" % itemnum), |
| 3062 | aspect_ratio, |
| 3063 | True) |
| 3064 | else: |
| 3065 | encodeMenu(os.path.join(getTempPath(),"details-%s.png" % itemnum), |
| 3066 | os.path.join(getTempPath(),"temp.m2v"), |
| 3067 | getThemeFile(themeName,menumusic), |
| 3068 | menulength, |
| 3069 | os.path.join(getTempPath(),"temp.mpg"), |
| 3070 | "", |
| 3071 | os.path.join(getTempPath(),"details-%s.mpg" % itemnum), |
| 3072 | aspect_ratio, |
| 3073 | False) |