| 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) |