The longstanding scripts-in-actions bug

In case it is true that with the announcement of the new version the beta testers are relieved of the non-disclosure-agreement (as I think I read somewhere):
Can anybody tell yet if Scripts in Actions will finally be maintained after restarting the appplication in Illustrator CS6?

I can’t remember for sure if I filed a report, but I have added my support and started a thread in the Feature Request section.
http://forums.adobe.com/thread/729118?tstart=30
http://forums.adobe.com/message/3872075#3872075
The Adobe team should have been aware of this for a looong time now in any case, because the issue has persisted at least since CS, if I remember correctly.

Similar Messages

  • Vanishing scripts in actions bug continued

    When did this first raise its ugly head? Was it CS3?
    Use 'insert menu item' to add a script to an action. Quit and relaunch Illustrator. The action is still there but the script item isn't.
    Still not fixed in CS5.
    MHP

    As far as I know, it's always been like this, despite repeated pleas to fix this in the Feature Request forum.
    What I want to know, but have been too busy to ask, is whether the Layer Action bug which just appeared in CS4 has been fixed in CS5. Actions which have any Layer steps used to work fine, but in CS4 they too are lost after every relaunch. I'm long since sick and tired of having to delete and re-load my master Action set every time Illustrator crashes.
    Mike D.

  • How to find the JavaScript Script Actions?

    Where can I find the JavaScript Script Actions for being executed in the
    Correlation Engine Java VM process?
    sonfan
    sonfan's Profile: https://forums.netiq.com/member.php?userid=692
    View this thread: https://forums.netiq.com/showthread.php?t=42697

    -----BEGIN PGP SIGNED MESSAGE-----
    Hash: SHA1
    What do you mean? The action plugins are available for download from
    the regular Sentinel plug-in site:
    http://support.novell.com/products/s...elplugins.html
    The ability to access or manage plugins will depend on your product
    (Sentinel 6.1, 7.x, or Log Manager).
    What you want to do may also slightly affect how you access them so
    knowing that, and really knowing the entire story, would help.
    The SDK can also be used to build new ones, if you're interested.
    Good luck.
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v2.0.19 (GNU/Linux)
    Comment: Using GnuPG with Mozilla - http://www.enigmail.net/
    iQIcBAEBAgAGBQJQbyY5AAoJEF+XTK08PnB5KVEP/RuXqAbhsFWtt5iBVF8OHn2y
    dlhgNcYbBHvC5YCrO+AD3lOD4kBX2NMCHXmZQiyU/c8eohGzG6iJgOXwIj1MiUiF
    fBkbvSi8tvT85j7og0noAUKMyhp4cASa8EPl0C5JiSRYZGvH57 PXDRxd+J5TUdyK
    lS9nHhmLXKgOTVeUcmUoqatywF2wgHbtvJsj0Ys5Zb1ITcddRK khenb8pn9cZrx0
    GUgQip3Z/wSPJphgpluVRs74z3qJkRwmpNBZCpRouDWJUM6ca2nwUOECMSO rIAD4
    KI2zHiJKdYosLdUpkIIFQpwmOEJ/JW0pLSL9TZxeO3/yz4gSuK/YFFw9GFAWtq/D
    ddl/9+iUoelYIl43PowvPG4gG8M/JCRLjL2f1FQ0ZHTPeAEIFPSzY1+1pu0O2fcG
    mq9vJ7cV1nrw2WGh46zCWVprB8bT1IEBffm8vj/6/tSysZAEgfZH/+2hmWMxstP8
    kZL03QeIJZ2Ks0fbZ4YroqIfPEI4qQTVHcRgV4OsgsRL2N6PiL aEJOaVqLthSCPG
    srUbECkg9JidSfp2BWDYI9tzOeOTwf4NCM7Wvlu2B9eqp97uEA cU0amuJrGYWxBP
    cKVqjTD6SwlvCsEo0614Q/ohlH524l+1gi985E3RNWeWn32BFt4sNCvaau4R0VJu
    n1RTg5azY9RlS/zjVR41
    =kCL+
    -----END PGP SIGNATURE-----

  • CS6 scripting bug / Problème scripts d'action CS6

    Bonjour, suite à mon passage de la CS4 à la CS6, mes scripts d'action ne marchent plus.
    Ce script par exemple :
    Hi folks, going from CS4 to CS6 made my action scripts bug, especially those using pathfinder :
    divide / ungroup / default /  trim / ungroup / copy / paste in front
    Ces actions effectuées une à une donnent un résultat normal mais conduisent donnent une série de messages d'erreur une fois enregistrées dans un script :
    These actions do work normally when i perform them separetly but fail as soon as i record it in a script. Does anyone has an idea?
    C'est la même chose avec ou sans fond, avec ou sans contour. Ce même script fonctionne très bien sur CS4. Les raccourcis clavier sont les mêmes.
    HELLLLPPPPP!!!!!

    Bonjour, n'ayant jamais été confronté au problème, je suis allé regarder si la question avait été traitée en anglais.
    Mylenium a proposé une explication sur l'accès à certains ports du système.
    En fait pour lire une vidéo, Photoshop a besoin de créer un accès à ce fichier, en interne, si ces ports sont inaccessibles (bloqués par une appli tierce, antivirus, firewall (ou pare-feu) ou occupés par d'autres applications), cela peut échouer.

  • Record actions bug. does not execute the dont save action even though it acknowledges in action list

    i am using macbook pro running Lion
    so i am trying to save a series of actions that i want applied to a batch of images. i do all the actions correctly (i've done this before in earlier version of photoshop). stop recording my actions, and open the same image to make sure the automation process works properly and i get the same image through automation that i got when building my actions. one
    of the actions is cutting and pasting a portion of the image in a different location, yet during the automation it always ends up somewhere else, and not in the same place, which makes no sense. another issue is during the recording of my actions i close out of all the files b4 i stop recording and click dont save. so this should be automated, but when i run the automation it prompts me to click dont save which it shouldnt do. i cant sit at the cpu and click dont save for thousands of images. whts the point of automation if i have to actually do something. stupid program. and i can clearly see in the list of actions tht it recorded me clicking dont save yet it still prompts me every time. i really do hate cs6. i wld install my old photoshop but b/c i have lion it doesnt support it... of course.. *rolls eyes*

    @conroy - one of the actions means one task in an action (see screen shot).
    @noel - i am able to run my action properly when i "play selection", but when i try to run a batch of images through the "automate" function is when the issues begin to arise. at least most of the issues.
    i would insert an image to show what i did, but i cant seem to get that to work (on my pc or mac... weird).  i loaded it to my fbook page and u can view it by following the below link
    https://www.facebook.com/photo.php?fbid=750482081505&l=4d1bb044bd
    you can view an image of what i did here.
    so in detail what i am trying to do is:
    record an action of the edits i make to a raw image so i can then run that same action on a batch of thousands of images via "automate."  the specific tasks i am trying to complete during my action should be visble in the link i provided. to explain in detail what is occuring that is being recorded as an action:
    1)- i press begin record
    2)- I am open a raw image
    3)- there is a time stamp in the image and i select and copy the time stamp from the corner of the image
    4)- i then open a new document and past the time stamp into the new document
    5)- i then increase the size of the pasted time stamp by about 3x by changing the resolution
    6)- i then go back to original image
    7)- i crop the original image to exclude the time stamp and other superflous things on the edges of the image
    8)- i then rotate the original image 90 degrees CCW
    9)- i then go back to the new document w/ the time stamp and select the time stamp with the marquee tool, so I can copy the time stamp to the original image
    10)- i copy and paste the time stamp to the original image, i use the "move tool" and move the time stamp to the top of the original image.
    11)- i then flatten the original image (i thought when this was done this is essentially combining layers, so there should be no possibility of the edited time stamp moving around as it has been flattened onto the original image)
    12)- i then save the original image (that was flattened w/ the edited time stamp) as a .jpeg  As part of the save process i also select the resolution.
    ***issue***
    so i am now having an issue on this section as well.  as you can see in the link i provided i have told adobe to do all this, yet now at this section it prompts me to make a decision about the resolution (i.e. press "ok").
    13) -after this step i then select "close all" from the file menu which closes the original image that i just saved and prompts me if i want to save the new document i created for the time stamp i edited
    14) - i select "dont save"
    15) -i press stop record
    16) - i then go to the folder where i saved the file i just edited in photoshop and change the name.
    17) - i start the action process to see if i can replicate the manual actions i just completed through automation.  i have no issues replicating this when i manually start the action, except for my issue w/ the time stamp detailed below.
    ***issue*****
    when i do this the time stamp that i edited and pasted back into the image is not in the same place. i have only gotten it to be in the same place once, and the only thing i did differently was continually re-create the above action in the same manner.  each time i recreated the action the time stamp was in a different place and one time it was finally in the place i moved it to.
    18) - after checking that the action works, i then attempt to automate a batch of files
    19) - i select file -> automate -> batch
    20) - in batch i choose the folder with the original raw images that i now want to run the action on and also select the folder where to place the altered images
    21) - in the batch menu i do not have any of the boxes checked (i.e. suppress color profile warnings, etc.)
    22) - i select "ok" and the automation process starts
    this is where i run into issues.  originally i would get prompted @ step 14 (above) instead of the automation process just reading the task in the action that says select "dont save". somehow i do not get prompted there anymore. now i get prompted at step 12.  it saves its as jpeg, but instead of completing the save process, at the resolution screen it prompts me to select "ok" instead of reading the task in the action that says select "ok"
    i have created new actions for the images i collect since CS4 and CS5 and i have never run into any of the issues i have described above. i appreciate any and all help you can provide, as it currently stands i am pretty upset b/c i have wasted an entire day or productivity messing w/ what appears to be a buggy program.

  • Should/can the install script included in source=() list?

    Hi,
    It is a good thing that the sources needed to build a package are md5summed for integrity, but in most packages the install script is not. I was thinking why this might be - the PKGBUILD can be expected to modify the script?
      So to try, in one of my packages I added the install script to the source=() list. The package builds of course just fine. Then, however, if I want to upload it to AUR, I try to make a source-only package with "makepkg --source", which brakes with something like this:
    ln: creating symbolic link `/tmp/foo/srclinks.YjYgQ8XlE/foo/foo.install': File exists
    This is because makepkg tries to create a 2 symbolic links with the same filename: one link for the "foo.install" in the source=() list and also for the install=() list....
    Is this deliberate, or a bug? Looks more like a bug to me, but thought I better ask first....
    Cheers,
    Greg

    shining wrote:
    imrehg wrote:
    It might be completely internal to the pacman but defines actions taken on the system - thus whatever is in .install has effects just like the rest of the files, maybe even more: the other files are just copied, the .install is executed.
    And while it might never get installed on the system, it's internals are - how else one could define a "post_uninstall()" if it wasn't stored? Being pacman developer you know much more about this than I do, can you give a bit of info on that?
    Right it is installed to pacman database, but again, it is pacman doing all that.
    Fair enough.... The detail, however, that is not installed does not preempt checksumming. Eg. patches are also: 1) used for the package, 2) not installed, and 3) still in the checksum....
    shining wrote:
    All I'm trying to get to, is there any serious reason (technical, not philosophical) NOT to checksum the install script as well?  Because I'm yet to see any valid arguments against it, and there are loads for it....
    Taking your example from kernel26 :
    -i $startdir/kernel26.install
    -i ${pkgdir}/etc/mkinitcpio.d/${pkgname}.preset
    Note that the scriptlet edited is the original one in $startdir , because that's the only place where it needs to be, from the packager pov.
    While for the preset file, it needs to be copied to $pkgdir and it is edited there.
    If you had a checksum for the scriptlet, it would also mean that makepkg -g output could be altered after running makepkg. Very weird..
    Ok, this is indeed the case. But if you look at real packages, it seems that after the package is compiled, many times they update the PKGBUILD with the new md5sum values. Again: core/kernel26.
    That .install update section in the PKGBUILD is then relegated to a "helper function" role that keep the information in sync when there's a new release, but as the PKGBUILD is distributed, it won't change anything in the .install anymore...
    Thus, again, there's no real difference between the .install files and other files used as source.
    shining wrote:Btw the whole scriptlet file could be created entirely from the pkgbuild build function.
    Sure, and that's a great thing! I actually wondered why so many packages have separate .install when it can be done in the PKGBUILD. Thought it might be some convention, but probably just habit.... I prefer doing it in the PKGBUILD as well, whenever possible...
    shining wrote:There might be ways to fix that, though I don't even see any good ones. But why bother ? You said there are loads of valid arguments to have it , but you didn't even give one !
    On the other hand, I'm yet to find any of your rebuttals that are not rebutted here again...
    shining wrote:What are you worried about here ? Security ? If you think adding a checksum for the install file is going to give you any security, you are badly fooling yourself. If someone is distributing a malicious pkgbuild, it can contain the md5sum of the malicious scriptlet which is shipped with it.
    I think you misunderstood me. I'm not complaining, but inquiring. The PKGBUILD system is awesome, and it makes me search out programs that I use but not in the repo/AUR so that I can make a new package. But also, I'm interested in the "how" and "why", and hope to improve things if possible. Now, to me it seems theres an unreasonable distinction to checksum some files needed for a package but not all of them. And thus I set out to ask the elders here on the Forum to see whether someone can shed light on the reasons of the current state. Not trying to piss of anybody, but being interested.
    Of course the md5sum is not security, it's a help, nothing more.
    As an example: some time ago, there was a package in the community (thus managed by TUs) that had an update. I wanted to check out something in the package, got the PKGBUILD and tried to make it myself - md5sum says that the sources are incorrect.... Obviously something must have gone very bad, because the md5sum field was updated according to the SVN, the package is available on pacman thus it had to build, and the sources used in the package have not been changed for a while so that cannot be a problem....
    I've got a package from a trusted source and it is broken, the md5sum told me. So the breakage can be the very same way in the install script, why is the md5sum not allowed to tell me that?
    shining wrote:The only security for pkgbuilds is yourself. When you get one from a strange place, you MUST read the pkgbuild/install files.
    Of course, never argued against it. But there are different layers of verbosity....
    Anyway....

  • CS5 - Running Script with Action. Not saving problem

    I am trying to setup an action that runs a script using the "Insert menu item" command.
    It all works perfectly but when I quit Illustrator and re0open it, the action has disappeared.
    Is this a bug or am i doing something wrong?

    Additional info (no solution):
    Could have something to do with the order Illustrator registers available scripts as menu commands and checking validity of action 'menu commands'.
    Try this:
    - Look in the File/Scripts menu and note down a scriptname in there;
    - Exit Illustrator;
    - Start Illustrator
    - Create a new action
    - In the Action Panel flyout menu chose 'Insert Menu Item...' - a Find dialog should open
    - In the textbox enter the scriptname you dotted down and press Find
    It tells you 'No menu item matching that name was found.'
    - Press OK, then Cancel;
    - Goto File/Scripts but don't select a script, close the menu
    now again
    - Create a new action
    - In the Action Panel flyout menu chose 'Insert Menu Item...' - a Find dialog should open
    - In the textbox enter the scriptname you dotted down and press Find
    Now it could be found..
    So it seems that when Illustrator starts:
    Initializes without registering the available scripts as available menuitems
    When the actions are loaded and in it is a Menu Command, it checks if that command is actually available - if not it deletes the action item
    After accessing the scriptmenu the scripts are indeed registered as available menuitems..
    So now if they would only register the scriptnames before loading the actions when starting Illustrator it would be solved. Or of course disable checking action commands for validity.
    Sure hope they solve this soon as I can imagine it affects a lot of people.

  • How to delete the unix files automatically using the unix scripts

    Hi
    we have the ADF Project deployed on weblogic server running on top of Linux OS. But, our ADF running project is generating temporary files in weblogic server path below path
    /u01/oracle/product/Middleware/user_projects/domains/based_domain/servers/AdminServer/tmp.
    we are deleting the folders and files existed in TMP directory manually, when size is huge. but, our requirement is to delete the same automatially using the shell scripting based on the time interval say for every 10 hours or 2 days.
    Can anybody please provide us the solution.
    Regards
    Nagaraju Manchala

    Moderator Action:
    @ Nagaraju,
    Your duplicate post of this same exact question,
    that you had placed in the WebLogic Server - Clustering forum,
    has been deleted.
    For future reference, do not ever multi-post. Multi-posting is poor forum etiquette.
    Pick whichever forum you think is most appropriate and place your inquiry.
    You will get a response or you will not get a response.
    There is no obligation, in these free forums populated by end users just like yourself, that a post ever get a response.

  • Longstanding Exchange Calendar Sync Bug Persists in iOS 7 / 7.0.2

    For those who sync their iPhone / iPad / iPod touch to a Microsoft Exchange e-mail environment, you may be aware that there's a longstanding Exchange Calendar Sync bug (affecting iOS 4.x - 6.1.3).  An otherwise functional iDevice may suddenly remain warmer to the touch than normal, exhibit much shorter battery life, and start using cellular data at up to ten times the user's typical pattern.  I've taked with Apple Support several times, and was never able to get an answer.  The fix involves simply opening the Exchange account settings on the iDevice, shutting off calendar sync for thirty seconds, and turning it back on.  This is nothing new.
    Over the weekend, an executive’s iPhone 5 (on Verizon) and his iPad 2 (Wi-Fi only), both running iOS 7, began exhibiting runaway connections to my employer’s Microsoft Exchange ActiveSync server.  The user upgraded his iPhone 5 to iOS 7.0.2 over the weekend, but the problem persisted.  In one 24-hour period, his iPhone checked in with our server 45,009 times, while his iPad connected 55,547 times.  Normally we’d expect to see a single device connect a few hundred times per day rather than tens of thousands.
    I've written more about it here.

    This is still a problem in iOS 7.0.4 as well.  We just had runaway calendar sync behavior on a 4th generation iPad running iOS 7.0.4 (iPad3C4/1102.55400001), which connected 75,436 times in a single 24-hour day.

  • An unknown error occurred while executing the PowerShell script:

    Hello all,
    Not the most descriptive title, granted. I'm hoping this may prompt the next version toprovide additional valuable content.
    Kindly requesting any help on this problem. I'm running VMM 2012 R2 version 3.2.7668
    When I try to look at properties of an existing Private Cloud, I get this error, only if I "look" at certain attributes. If I stay away from the specific attributes, everything is hunky dory. For reasons unknown, after I get this error, I have
    to exit and go back into VMM in order to get anything else to run.
    The text in the error dialogue box is not entirely applicable because I was connected to the VMM server and will connect again, when I exit/relaunch.
    An unknown error occurred while executing the PowerShell script:
    The connection to the VMM management server scvmm2.mmmmmm.com was lost.
    Ensure that scvmm2.mmmmmm.com is online and that you can access the server remotely from your computer. Then connect to scvmm2.mmmmmm.com and try the command again using the new connection. Or, you can ensure that the Virtual Machine Manager service is started
    on scvmm2.mmmmmm.com. Then connect to scvmm2.mmmmmm.com and try the command again using the new connection. If the command fails again because of a connection failure, restart the Virtual Manager service and then try the operation again.
    Try the operation again. If the issue persists, contact Microsoft Help and Support.
    ID: 27235
    This is what I get in Events
    Warning 4/9/2015 3:27:04 PM PowerShell (Microsoft-Windows-PowerShell) 4100 Executing Pipeline
    Log Name:      Microsoft-Windows-PowerShell/Operational
    Source:        Microsoft-Windows-PowerShell
    Date:          4/9/2015 3:27:04 PM
    Event ID:      4100
    Task Category: Executing Pipeline
    Level:         Warning
    Keywords:      None
    User:          mmmmmm\paufra
    Computer:      tools-francis.mmmmmm.com
    Description:
    Error Message = The connection to the VMM management server scvmm2.mmmmmm.com was lost. (Error ID: 1610)
    Ensure that scvmm2.mmmmmm.com is online and that you can access the server remotely from your computer. Then connect to scvmm2.mmmmmm.com and try the command again using the new connection. Or, you can ensure that the Virtual Machine Manager service is started
    on scvmm2.mmmmmm.com. Then connect to scvmm2.mmmmmm.com and try the command again using the new connection. If the command fails again because of a connection failure, restart the Virtual Manager service and then try the operation again.
    Fully Qualified Error ID = 1610,Microsoft.SystemCenter.VirtualMachineManager.Cmdlets.GetSCReplicationGroupCmdlet
    Recommended Action = Ensure that scvmm2.mmmmmm.com is online and that you can access the server remotely from your computer. Then connect to scvmm2.mmmmmm.com and try the command again using the new connection. Or, you can ensure that the Virtual Machine Manager
    service is started on scvmm2.mmmmmm.com. Then connect to scvmm2.mmmmmm.com and try the command again using the new connection. If the command fails again because of a connection failure, restart the Virtual Manager service and then try the operation again.
    Context:
            Severity = Warning
            Host Name = Default Host
            Host Version = 4.0
            Host ID = 94963cd4-5979-4786-9da2-c8814de8c7c3
            Host Application = C:\Program Files\Microsoft System Center 2012 R2\Virtual Machine Manager\Bin\VmmAdminUI.exe
            Engine Version = 4.0
            Runspace ID = 359d7a46-3752-4929-8c09-0de4152d10e4
            Pipeline ID = 16
            Command Name = Get-SCReplicationGroup
            Command Type = Cmdlet
            Script Name =
            Command Path =
            Sequence Number = 91
            User = mmmmmm\paufra
            Shell ID = Microsoft.PowerShell
    User Data:
    Event Xml:
    <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
      <System>
        <Provider Name="Microsoft-Windows-PowerShell" Guid="{A0C1853B-5C40-4B15-8766-3CF1C58F985A}" />
        <EventID>4100</EventID>
        <Version>1</Version>
        <Level>3</Level>
        <Task>106</Task>
        <Opcode>19</Opcode>
        <Keywords>0x0</Keywords>
        <TimeCreated SystemTime="2015-04-09T22:27:04.993655700Z" />
        <EventRecordID>285</EventRecordID>
        <Correlation ActivityID="{48059811-1A63-41E1-9057-7498D0E4FC20}" />
        <Execution ProcessID="2344" ThreadID="4076" />
        <Channel>Microsoft-Windows-PowerShell/Operational</Channel>
        <Computer>tools-francis.mmmmmm.com</Computer>
        <Security UserID="S-1-5-21-4008432563-1984933819-4238309236-2721" />
      </System>
      <EventData>
        <Data Name="ContextInfo">        Severity = Warning
            Host Name = Default Host
            Host Version = 4.0
            Host ID = 94963cd4-5979-4786-9da2-c8814de8c7c3
            Host Application = C:\Program Files\Microsoft System Center 2012 R2\Virtual Machine Manager\Bin\VmmAdminUI.exe
            Engine Version = 4.0
            Runspace ID = 359d7a46-3752-4929-8c09-0de4152d10e4
            Pipeline ID = 16
            Command Name = Get-SCReplicationGroup
            Command Type = Cmdlet
            Script Name =
            Command Path =
            Sequence Number = 91
            User = mmmmmm\paufra
            Shell ID = Microsoft.PowerShell
    </Data>
        <Data Name="UserData">
        </Data>
        <Data Name="Payload">Error Message = The connection to the VMM management server scvmm2.mmmmmm.com was lost. (Error ID: 1610)
    Ensure that scvmm2.mmmmmm.com is online and that you can access the server remotely from your computer. Then connect to scvmm2.mmmmmm.com and try the command again using the new connection. Or, you can ensure that the Virtual Machine Manager service is started
    on scvmm2.mmmmmm.com. Then connect to scvmm2.mmmmmm.com and try the command again using the new connection. If the command fails again because of a connection failure, restart the Virtual Manager service and then try the operation again.
    Fully Qualified Error ID = 1610,Microsoft.SystemCenter.VirtualMachineManager.Cmdlets.GetSCReplicationGroupCmdlet
    Recommended Action = Ensure that scvmm2.mmmmmm.com is online and that you can access the server remotely from your computer. Then connect to scvmm2.mmmmmm.com and try the command again using the new connection. Or, you can ensure that the Virtual Machine Manager
    service is started on scvmm2.mmmmmm.com. Then connect to scvmm2.mmmmmm.com and try the command again using the new connection. If the command fails again because of a connection failure, restart the Virtual Manager service and then try the operation again.
    </Data>
      </EventData>
    </Event>

    Hi Sir,
    First , please try to run the VMM configuration analyzer on that computer :
    http://www.microsoft.com/en-us/download/details.aspx?id=41555
    In addition , please try to use "VMMTrace" mentioned in following article to collect trace log and find some useful information :
    http://blogs.technet.com/b/jonjor/archive/2011/01/07/vmmtrace-simplified-scvmm-tracing.aspx
    Best Regards,
    Elton Ji
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. If you have feedback for TechNet Subscriber Support, contact [email protected] .

  • Filling Activity fields from the Interactive Script WinClient

    Hi Experts,
    I am working with Interactive Scripting (CRMM_TM_SCRIPT) and I already defined my interactive script. I am also creating Activities after I finish with the Script in order to register a case. I am doing this by defining an Action Type CIC-AB which calls an Action Box in the Interaction Center WinClient. In the Action field I define the name of the Activity I want to call from the Action Box of the Interaction Center.
    When the Agent receives a call, he navigates in the Interactive Script in order to clasify the case he is treating. At the end of the Script, the case needs to be register following the clasification made by the Agent, and that’s why we are calling an Activity. The thing is that we don’t want the Agent to fill again the information he just defined in the Script in the Activiy, so we want to fill certain fields of the Activiy I am calling with Information of the Interactive Script I used before, in order to save time to the Agent that Register the Case.
    Can anyome shed some light on this issue?
    Thanks to everyone.

    Alberto
    You can create an activity.i.e., you can create an Order from the Interactive Script if you already created the Script structurethen follow the below steps
    I think it would be helpful
    Procedure: 
    T-Code:  EWFC0
    Path: SPRO&#61664;IMG&#61664;Customer Relationship Management&#61664;Customer Interaction Center&#61664;Visible Components&#61664;Action Box Settings&#61664;Define Configuration Profile for Action Box.
    1. Choose F4 help to select one of the Action Box profiles you have created and you want to adapt and choose change.
    2. Mark the Action box Configuration and create a new Action Box Group by choosing Create transaction group.
    Enter a group ID, description and icon for the new transaction group and choose Continue.
    3. Mark the new transaction group and create a new Action Box transaction by choosing Create transaction.
    4. Enter a transaction ID.
    5. Enter a Transaction Definition section, select Workspace.
    6. In the Transaction Definition section, select Workspace.
    Two additional fields will appear.
    7 Choose F4 in the Workspace field to select the Script.
    8. Choose F4 in the profile field to select the Interactive Scripting profile that you created in the previous steps above.
    9. Enter a Slot Name if desired.
    10. Choose Continue.
    You are automatically taken to the Maintain Data Flow screen .No data flow parameters need to be maintained for the Interactive Scripting workspace.
    11. Choose Back.
    12 Choose Save.
    Note:  Since Only Workspace of this type can be open at once, you will need to close the Automatically Created Interactive Scripting Workspace before launching the Interactive Scripting Action Box call.
    Regards
    Surendra

  • Scripting Illustrator actions, incorporating calls to Excel

    Hello all, I need some help...
    I am building a series of logos — based on word strings —  using Illustrator CS4 with a combination of Actions, but also retrieving the word string from an Excel file.
    Normally for one or two iterations of the process, I would not hassle with a script, but this is a mind-numbing repetitive task, and I have to make 6,000 logos!! Seems the ideal use for a script.
    We have tried to work with ExtendScript Toolkit (ESTK) but we can't get our heads around how to make it do certain things, and I can't find anyone who really knows how to use ESTK correctly.
    I have a MAC, so the script has to be written in Java Script or Apple Script.
    Here's what I need to do:
    Execute Action: Open a Master Illustrator doc. This doc is already configured with art board, pre-defined type box (Area Type Optioned), Charater Styles, Drop Shadow parameters set. <pause Action>
    Run Script: Retrieve the word string from a cell in Excel worksheet (or CSV??). Some are single words, first letter capped. Some are two to four words Camel Cased. Example: "DinnerPartiestm". There are two additional charaters "tm" at the end of the word string that will be acted upon (remember these two characters for item 7 below)
    Run Script: Place this WordString into the predefined type box in the Illustrator Master doc. That is, in Illustrator, "select" the type box so the cursor is at first position and place the word string — copy from Excel & paste into Illustrator? <pause Script>
    Execute Action: Apply character style 1— font with point size, letter spacing, stroke and colour (It just happens to be red). Example: DinnerPartiestm  <pause Action>
    Run Script: Select all caps in word string. Example: DinnerPartiestm <pause Script>
    Execute Action: Apply character style 2 — Caps Only (selected) — New point size, baseline offset. Example: DinnerPartiestm <pause Action>
    Run Script: Select last two letters of word string. Example: DinnerPartiestm <pause Script>
    Execute Action: Apply character style 3 — last two letters only (selected) — New point size, change colour, baseline offset. Example: DinnerPartiestm <pause Action>
    Run Script: Select text box. <pause Script>
    Execute Action: Apply Stylize > Drop Shadow — On contents of text box, preset DS parameters in either Appearence panel or Effect menu.
    Execute Action: File > Save As .ai document. <at Save As dialog, pause action>
    Run Script: Retrieve file name from Excel and place in Save As dialog (copy & paste?). In next column in Excel doc, same row, is a SEO-friendly file name. Example: word string is "DinnerParties"; file name (next column) is "logo-dinner-parties"
    Run Script: Select folder to save the .ai doc into. Example: Folder is "Logos AI". <pause Script>
    Execute Action: Complete Save As. Example: in Folder "Logos AI" now we have the file "logo-dinner-parties.ai"
    Execute Action [assumes that the Saved As document — logo-dinner-parties.ai — is now the active one in Illustrator]: Save for Web & Devices. Preset to PNG24/Transparent. Correct file name will NOT be in Save field. <at Save dialog, pause action>
    Run Script: Repeat retrieval process to get same file name from Excel.
    Run Script: Select new folder to save the .png doc into. Example: Folder  is "Logos PNG". <pause Script>
    Execute Action: Complete Save for Web. Example: in Folder "Logos PNG" now  we have the file "logo-dinner-parties.png"
    Execute Action: Close
    Repeat steps 1 though 19 until all word strings processed: Script has to know to go to next word string (next row) in Excel doc.
    This is a tricky one, but there's got to be a way to automate the process... otherwise I'll go crazy doing this manually!!
    IS THERE ANYBODY OUT THERE WHO CAN HELP?
    Thanking you in advance for any assistance.
    All the best.

    IS THERE ANYBODY OUT THERE WHO CAN HELP?
    Depends on what you mean by "help." Are you asking someone to do the whole thing for you (would require more detail), or do you intend to do it yourself, but are stuck on something? (You say you "tried to work with ESTK" and "can't find anyone who really knows how to use ESTK correctly"; but you don't say specifically what you're struggling with in ESTK.)
    ...doc is already configured with art board, pre-defined type box (Area Type Optioned), Charater Styles, Drop Shadow parameters set.
    Much of what can be done with any approach depends largely upon what Appearances and/or Effects are involved, and where. You imply that you want all of the "logo" to be contained in a single textFrame object. But Drop Shadow Effect cannot be applied at the character level, so it can't be included in a Character Style.
    So if you don't want all the text to have the same drop shadow, you will be involving multiple textFrame objects. That will lead to the complication of having to position the two textFrames relative to each other, depending on their dimensions after the varying text is inserted.
    Retrieve the word string from a cell in Excel worksheet (or CSV??)
    With scripting, it would be inefficient and unnecssary to go back-and-forth to the spreadsheet to extract values one at a time. Typically, you would create an array containing the full set of values, and then iterate through the elements of the array.
    Some are single words, first letter capped. Some are two to four words Camel Cased. Example: "DinnerPartiestm".
    So you're going to need a sub-routine of some kind (in Javascript, a function) to find capital letters.
    There are two additional charaters "tm" at the end of the word string that will be acted upon...
    If this is the same in each instance, and if you are going to script this, there is no need to include it in the data.  Insert the "tm" programmatically.
    That is, in Illustrator, "select" the type box so the cursor is at first position and place the word string — copy from Excel & paste into Illustrator?
    Using script, you don't have to select the textFrame, copy, or paste in order to insert content. You would declare a variable, assign its value (from the above-mentioned array), add the variable's value as text to textFrame's content.
    Apply character style 1— font with point size, letter spacing, stroke and colour (It just happens to be red). Example: DinnerPartiestm
    Here you will run into a difficulty inherent in Illustrator's poor implementation of stroked text. You can apply a Stroke at the Character level and include that Appearance in a Character Style. But Illustrator always positions such strokes in front of the fill--something you almost never want, because it "chokes" the fills, wrecking the shape of the characters. The workaround is to Add New Stroke and position that below the Characters listing in the Appearance Palette. But script provides no access to added strokes or fills and Added Strokes cannot be applied at the character level.
    Select all caps in word string. Example: DinnerPartiestm
    Illustrator cannot select discontiguous text strings. Again, script does not have to select objects in order to change their properties.
    Apply character style 2 — Caps Only (selected) — New point size, baseline offset. Example: DinnerPartiestm
    Apply character style 3 — last two letters only (selected) — New point size, change colour, baseline offset. Example: DinnerPartiestm
    The applyTo method of the CharacterStyle object. Or, just set the size and baselineShift properties of the characterAttributes property of the textRange directly.
    Apply Stylize > Drop Shadow — On contents of text box
    Drop Shadow Effect cannot be applied to the contents (character level) of a textFrame--only to the textFrame object itself.
    My very limited understanding of ESTK is that it is a scripting tool for  use in Illustrator.
    It's a script text editor included with the Creative Suite. You can use it to build scripts for any of the CS products (or entirely other purposes, for that matter). Or, you can choose to not use it at all. A Javascript is just a text file. Tools like ESTK add conveniences, references, etc., geared toward scripting.
    So, I'm only acting on the word string....
    But I am also not a coder...
    Which is why I would look into simpler already-built methods before jumping into a tedious solution scripted for Illustrator. For example: Many, if not most, AI users are familiar with InDesign. InDesign provides a proper dataMerge feature that can handle ordinary tab-delimited text. It's handling of strokes on text is correct, unlike Illustrator. If you set it up accordingly, it can create all the separate pages for you.
    You would:
    1. Draw the fixed graphic in Illustrator.
    2. Place the Illustrator graphic on InD's master page.
    3. Set and style the text objects. Insert DataMerge tags.
    4. Import the data and run the Merge function.
    InD builds individual pages for each row of the data. You're done. Export to PDF. InD and Acrobat also have their own scripting models. Either one can handle the specific naming convention, if really needed.
    Again, it depends on what exactly is "special" about the text object(s) you are manipulating with variable content. For example, if you're using an AI-specific Warp effect, you'd be back to Illustrator.
    Anyway, you want a paying gig?
    I do some freelance work as time permits and interest strikes, but I'm not cheap, and that's not why I frequent these forums.
    Scripting your solution entirely in AI may very well be possible, but whoever does it will need to see the specific objects, styles, etc., involved to avoid unnecessary guessing and time-consuming round-tripping. Why don't you post an image and/or an AI file?
    JET

  • Adding scripts to Actions

    I am involved in a lot of works of handling thousands of photos (digital/scanned, B/W as well as color, of different ages: I have to treat images from '30s) and in my workflow (Bridge-Camera Raw-PSHP) I have a lot of repetitive actions to take.
    One very delicate action is saving, in different moments of the workflow, images with different filenames extensions (having the same root of the initial image filename) in different directories; most of the times, this occurs at the end of an Action that I have recorded for specific job.
    I would like to have a "script" that automates the renaming of the image file and writes it in the right directory, instead of typing the right extension and selecting the right directory by hand: beyond the waste of time, the real problem is that an error will have devastating effects.
    I have tried to accomplish this with the standard PSHP Action facilities, but I haven't been able to.
    I have an acceptable knowledge of Visual Basic, while I don't know anything about Scripting, and therefore the best thing would be writing imyself in VBA a function that handles the different situations for saving images with the right filename extensions in the right directory, producing a .exe that I would activate (it should be possible, but how ?) at the end of diffrent Actions: where do I get the filename of the image and the directory where it comes from ?
    BTW, I have the Design Premium Creative Suite 3 in an XP SP3 always updated.
    Great thanks to the ones that can help me: I need it.
    Mauro (Italy)

    As a start could you please try this script.
    Open  "Adobe ExtendScript Toolkit 2" (This is installed with Photoshop) and should be available in Start Programs.
    Copy and paste this code into an ExtendScript window.
    Then File- Save to C:/Program Files/Adobe/Adobe Photoshop CS3/Presets/Scripts folder
    Close Photoshop if open then re-open Photoshop
    Load a test picture for Definitive then run the script and see if it does what you require.
    To run the script File - Scripts and select the script.
    If it does you can add the script to the end of your action by selecting  "Inset Ment Item" in the action palette and File - Scripts and select the script.
    #target photoshop
    function main(){
    if(!documents.length){
    alert("You do not have a document open!");
    return;
    var newPath = Folder(decodeURI(activeDocument.path) +"/" +"Definitive"); //This is the target folder
    if(!newPath.exists){
    var result = Window.confirm (decodeURI(newPath) +"\nDoes Not Exist\nWould you like me to create it?", true, "Folder does Not Exist");
    if(!result) return;
    newPath.create();
    var newName = decodeURI(activeDocument.name).match(/(.*)\.[^\.]+$/)[1];
    newName = newName +"-DEF.tif"; //The suffix with tiff format
    var saveFile = File(decodeURI(newPath)+"/"+newName);
    if(saveFile.exists){
    var result = Window.confirm("This File Exits!\nWould You Like It Overwritten?", true, "File Exists");
    if(!result) return;
    saveFile.remove();
    SaveTIFF(saveFile);
    main();
    function SaveTIFF(saveFile){
    tiffSaveOptions = new TiffSaveOptions();
    tiffSaveOptions.embedColorProfile = true;
    tiffSaveOptions.alphaChannels = true;
    tiffSaveOptions.imageCompression = TIFFEncoding.TIFFLZW;
    activeDocument.saveAs(saveFile, tiffSaveOptions, true, Extension.LOWERCASE);

  • I am getting some errors while distilling the post script file.

    I am getting some errors while distilling the post script file. please check and suggest me, how to control this?
    <PDFX ISO="15930-1:2001" COMPLIANT="true">
    PDF/X Compliance Report
    1.  Summary
       Warnings: The total found in this document was 0.
       Violations: The total found in this document was 0.
       No problems were found in the document.
       This document passes PDF/X-1a:2001 compliance checks.
    </PDFX>
    Regards,
    Jack

    @Jack – you were using a joboptions file by Distiller to convert a PostScript file to a PDF/X-1a.
    What you get is no error message, just a report, that everything went ok. And in this case I cannot see any advantage using PDF Export for printing to PostScript/distilling to PDF. Ok, maybe one, CS5 and above would export in a background process.
    To prevent InDesign flattening transparency, you could use PDF/X-4 as your export setting. You cannot use writing to PostScript for that task.
    Check including tags for tagged export to prevent misalignment of text because of a strange bug with PDF Export when you are using 9pt text on 12pt leading or text with a ratio of 9/12 for point size and leading in multicolumn text frames.
    Uwe

  • [python] setting a variable in a loaded module from the main script

    Hi,
    I have have two python scripts, one generally controlling my desktop wallpaper, the other downloads the APOD picture from the net and sets it as my wallpaper.
    At the moment I can get the wallpaper script to load the apod script as a module to use its functionality.
    The problem comes when I try to get the module to recognise variables set from the parent script:
    I have both scripts using the variable  'verbose' to control how much output is printed, (which can be set from the command line options).
    How do I get the 'verbose' variable in the imported module to be the same as the variable set by the script?
    I can get it into an imported function using a keyword assignment when called, 'download(verbose=options.verbose)', but this is forgotten when other functions are called.
    I have also tried making it a global variable.
    I assume it is because I am importing the module and setting the default value before the main script sets its value, but I cant see a way round this.
    Any ideas?
    Many thanks,
    Drew

    simplicity:
    test1.py
    #!/usr/bin/python3
    __version__ = 1
    from optparse import OptionParser, OptionGroup, SUPPRESS_HELP
    import test2
    def_msg = 3
    def function1(msg=def_msg):
    print('1 message level here is {0}' .format(msg))
    def function2():
    print('2 message level here is {0}' .format(msg))
    def function3(msg=def_msg):
    msg = def_msg
    print('3 message level here is {0}' .format(msg))
    def function4():
    print('4 message level here is {0}' .format(msg))
    def main(msg=def_msg):
    print('m message level here is {0}' .format(msg))
    function1(msg=msg)
    function2()
    function3()
    function4()
    test2.main(msg=msg)
    function2()
    if __name__ == "__main__":
    parser = OptionParser(usage = "usage: %prog [options] command", version="%prog {0}" .format(__version__),
    description = "Test script 1.")
    parser.set_defaults()
    standard = OptionGroup(parser, "Standard Options")
    ## Standard Options
    standard.add_option("-q", "--quiet",
    action="store_true", dest="quiet", default=False, #help=SUPPRESS_HELP)
    help="only display warnings and errors")
    standard.add_option("-v", "--verbose",
    action="store_true", dest="verbose", default=False, #help=SUPPRESS_HELP)
    help="display all output")
    standard.add_option("--debug",
    action="store_true", dest="debug", default=False, #help=SUPPRESS_HELP)
    help="debug mode: detailed output of commands")
    standard.add_option("--really-quiet",
    action="store_true", dest="reallyquiet", default=False, help=SUPPRESS_HELP)
    #help="only display errors")
    standard.add_option("--silent",
    action="store_true", dest="silent", default=False, help=SUPPRESS_HELP)
    #help="don't display any output")
    parser.add_option_group(standard)
    (options, args) = parser.parse_args()
    ## message level
    if options.debug == True:
    msg = 5
    elif options.verbose == True:
    msg = 4
    elif options.quiet == True:
    msg = 2
    elif options.reallyquiet == True:
    msg = 1
    elif options.silent == True:
    msg = 0
    else:
    msg = 3
    main(msg=msg)
    test2.py
    #!/usr/bin/python3
    __version__ = 1
    from optparse import OptionParser, OptionGroup, SUPPRESS_HELP
    #from test1 import msg
    def_msg = 3
    #msg = 3
    def function1(msg=def_msg):
    print('1 message level here is {0}' .format(msg))
    def function2(msg=def_msg):
    print('2 message level here is {0}' .format(msg))
    def function3():
    print('3 message level here is {0}' .format(msg))
    def main(msg=def_msg):
    #from test1 import msg
    #import test1
    #msg = test1.msg
    print('m message level here is {0}' .format(msg))
    function1(msg=msg)
    function2()
    function3()
    if __name__ == "__main__":
    parser = OptionParser(usage = "usage: %prog [options] command", version="%prog {0}" .format(__version__),
    description = "Test script 2.")
    parser.set_defaults()
    standard = OptionGroup(parser, "Standard Options")
    ## Standard Options
    standard.add_option("-q", "--quiet",
    action="store_true", dest="quiet", default=False, #help=SUPPRESS_HELP)
    help="only display warnings and errors")
    standard.add_option("-v", "--verbose",
    action="store_true", dest="verbose", default=False, #help=SUPPRESS_HELP)
    help="display all output")
    standard.add_option("--debug",
    action="store_true", dest="debug", default=False, #help=SUPPRESS_HELP)
    help="debug mode: detailed output of commands")
    standard.add_option("--really-quiet",
    action="store_true", dest="reallyquiet", default=False, help=SUPPRESS_HELP)
    #help="only display errors")
    standard.add_option("--silent",
    action="store_true", dest="silent", default=False, help=SUPPRESS_HELP)
    #help="don't display any output")
    parser.add_option_group(standard)
    (options, args) = parser.parse_args()
    ## message level
    if options.debug == True:
    msg = 5
    elif options.verbose == True:
    msg = 4
    elif options.quiet == True:
    msg = 2
    elif options.reallyquiet == True:
    msg = 1
    elif options.silent == True:
    msg = 0
    else:
    msg = 3
    main(msg=msg)
    else:
    msg = def_msg
    I think I understand why it gives the results it does when run as 'test1.py -v'
    I was just wondering if there was an easier way to get the second script to take and remember the variable without having to write variable=value into the function call every single time? However this is the only way I have found so far.
    The actual code:
    wallpaper.py:
    #!/usr/bin/python3
    #Filename: wallpaper.py
    __version__ = '6.2.0'
    import os, sys
    from optparse import OptionParser, OptionGroup, SUPPRESS_HELP
    #import warnings
    import random
    #import apod
    ##### CONFIG #####
    ## Global Variables
    root = '/home/wallpaper'
    feh_wallpaper_file = os.path.expanduser('~/.fehbg')
    filter_file = os.path.expanduser('~/.config/openbox/wallpaper/mask')
    config_path = os.path.expanduser('~/.config/openbox/wallpaper')
    list_default = 'default-list'
    list_alt = 'alt-list'
    menu_default = 'menu-folders'
    menu_alt = 'alt-menu'
    lockfile='/tmp/wallpaper.lock'
    valid_list_list = 'alt-list', 'default-list'
    def_msg = 3
    ##### LOCK v2.2 #####
    def LockScript(fun, lock=lockfile, msg=def_msg):
    """Locks the script before starting a function."""
    if msg >= 5:
    print('Lock :: Locking Script')
    from os import O_CREAT, O_EXCL
    try:
    fd = os.open(lock, O_CREAT+O_EXCL)
    if msg >= 5:
    print('Lock :: created lock file')
    except OSError:
    if msg >= 1:
    print('Error :: Already running function {0}...' .format(fun))
    sys.exit(1)
    try:
    fun(msg=msg)
    finally:
    try:
    os.remove(lock)
    if msg >= 6:
    print('Lock :: Removed Lock File')
    except:
    if msg >= 1:
    print('Lock :: Error :: Lockfile missing')
    ##### CURRENT INFO #####
    def get_filter(msg=def_msg):
    """Retrieves the filter."""
    f = open(filter_file, 'r')
    i = f.read()
    f.close()
    if msg >= 6:
    print('Got Filter :: {0}' .format(i))
    return i
    def get_info(msg=def_msg):
    """Returns the path and name of the current wallpaper."""
    with open(feh_wallpaper_file, 'r') as f:
    a = f.read()
    b = a[15:-1]
    f.close()
    name = os.path.basename(b)
    try:
    import apod
    if name == 'apod':
    path = os.path.join(apod.archive_folder, apod.thisyear)
    w = os.listdir(path)
    w.sort()
    wnum = len(w) -1
    name = w[wnum]
    else:
    path = os.path.dirname(b)
    except:
    path = os.path.dirname(b)
    if msg >= 5:
    print('current wallpaper :: {0} {1}' .format(path, name))
    return path, name
    def get_next(c, z, msg=def_msg):
    """Gets the next number in the sequence of length z."""
    if c == (len(z) - 1):
    n = 0
    else:
    n = c + 1
    if msg >= 6:
    print('next number is {0}' .format(n))
    return n
    def get_prev(c, z, msg=def_msg):
    """Gets the previous number in the sequence of length z."""
    if c == 0:
    p = (len(z) - 1)
    else:
    p = c - 1
    if msg >= 6:
    print('previous number is {0}' .format(p))
    return p
    def current_wallpaper_info(msg=def_msg):
    """Print the details of the current wallpaper."""
    name = get_info(msg=msg)[1]
    path = get_info(msg=msg)[0]
    folder = os.path.basename(path)
    mask = get_filter(msg=msg)
    try:
    import apod
    if path.startswith(apod.archive_folder) or name.startswith('APOD'):
    title = apod.get_name(fname=name, msg=msg)
    print('currently the wallpaper is "{0}", {1}' .format(title, name))
    elif not mask == '':
    print('currently the wallpaper is {0} from folder {1} using mask {2}' .format(name, folder, mask))
    else:
    print('currently the wallpaper is {0} from folder {1}' .format(name, folder))
    except:
    print('currently the wallpaper is {0} from folder {1}' .format(name, folder))
    ##### SET WALLPAPER FUNCTIONS #####
    def set_filter(i=None, msg=def_msg, mask_file=filter_file):
    """Sets the filter."""
    if test:
    f = open(mask_file, 'r')
    else:
    f = open(mask_file, 'w')
    if i == None:
    if msg >= 5:
    print('clearing filter')
    if test:
    print('exec :: Clear filter')
    else:
    f.write('')
    else:
    if msg >= 4:
    print('Setting filter as "{0}"' .format(i))
    if test:
    print('exec :: Writing filter as :: "{0}"' .format(i))
    else:
    f.write(i)
    f.close()
    def set_wallpaper(name, path_in=get_info()[0], msg=def_msg):
    """Set the wallpaper."""
    spath = path_in.split(':')
    path = spath[0]
    try:
    mask = spath[1]
    set_filter(mask, msg=msg)
    except:
    pass
    full = os.path.join(path, name)
    if msg >= 4:
    print("setting {0} as wallpaper" .format(name))
    if test:
    print("exec :: feh --bg-scale {0}" .format(full))
    else:
    os.system("feh --bg-scale {0}" .format(full))
    #def set_default(d=default_file):
    # """Sets the default walllpaper."""
    # set_wallpaper(d[1], d[0])
    def set_wallpaper_last(msg=def_msg):
    """Set the wallpaper as the last image."""
    ## alternativly use "eval `cat ~/.fehbg`"
    full = os.path.join(get_info()[0], get_info()[1])
    if msg >= 4:
    print("setting {0} as wallpaper" .format(full))
    if test:
    print("exec :: feh --bg-scale {0}" .format(full))
    else:
    os.system("feh --bg-scale {0}" .format(full))
    def change_folder(folder0, mask=None, msg=def_msg):
    """Change Wallpaper folder (optional filter) relative from root dir."""
    folder_split = folder0.split(':')
    folder = folder_split[0]
    path = os.path.join(root, folder)
    if not os.path.exists(path): # Path does not exist
    if msg >= 1:
    print('Fatal Error :: path does not exist')
    print('avaliable folders are {0}' .format(avaliable_folders()))
    sys.exit()
    if msg >= 4:
    print('changing folder to {0}' .format(folder))
    f1 = os.listdir(path)
    try:
    if folder_split[1]:
    mask = folder_split[1]
    f2 = []
    for i in f1:
    if i.find(mask) > -1:
    f2.append(i)
    f = f2
    if len(f) == 0:
    if msg >= 2:
    print('Warning :: invalid filter')
    raise
    set_filter(mask, msg=msg)
    else: # print('null mask')
    if msg >= 2:
    print('Warning :: null filter')
    raise
    except:
    if msg >= 5:
    print('No filter used, clearing')
    set_filter(msg=msg)
    f = f1
    if len(f) == 0:
    if msg >= 1:
    print('Fatal Error :: no files in path')
    sys.exit()
    r = random.randrange(0,len(f))
    if msg >= 5:
    print('chosing random number:: {0}' .format(r))
    set_wallpaper(f[r], path, msg=msg)
    def avaliable_folders(r=root, msg=def_msg):
    """Returns a list of avaliable folders in the root wallpaper directory."""
    allfolders = os.listdir(r)
    folders = []
    for f in allfolders:
    if not f.startswith("."):
    folders.append(f)
    return folders
    ##### DEFAULT / ALT SEQUENCE LISTS #####
    def strip_opt(p):
    #q1 = p.replace(' ','')
    #q2 = q1.replace('\t','')
    #q3 = q2.replace('\n','')
    q = p.replace(' ','').replace('\t','').replace('\n','')
    return q
    def check_list(l, path=config_path, dl=list_default, al=list_alt, msg=def_msg, returnF=False):
    """Checks to see (and returns) valid path to list."""
    if l == 'default' or l == 'def' or l == None :
    if msg >= 4:
    print('using default list')
    return os.path.join(path, dl)
    elif l == 'alt':
    if msg >= 4:
    print('using alternative list')
    return os.path.join(path, al)
    else:
    try:
    if not os.path.exists(os.path.join(path, l)):
    if msg >= 1:
    print('Error :: list does not exist')
    raise
    elif not os.path.isfile(os.path.join(path, l)):
    if msg >= 1:
    print('Error :: list not a file')
    raise
    else:
    try:
    c = valid_list_list.index(l)
    if msg >= 6:
    print('list name has been validated')
    except:
    if msg >= 2:
    print('Warnimg :: list used has not been vaildated by script')
    print('Warnimg :: if valid; add to the list of valid lists')
    if msg >= 5:
    print('path exists')
    return os.path.join(path, l)
    except:
    if returnF == True:
    return False
    else:
    if msg >= 2:
    print('Warning :: using default list')
    return os.path.join(config_path, dl)
    def get_seq(msg=def_msg):
    """Returns the sequence of current wallpaper and curr position."""
    mask = get_filter(msg=msg)
    path = get_info(msg=msg)[0]
    name = get_info(msg=msg)[1]
    list1 = os.listdir(path)
    if mask == '':
    list0 = list1
    else:
    list2 = []
    for i in list1:
    if i.find(mask) > -1:
    list2.append(i)
    try: # check the filter is currently being used
    num = list2.index(name)
    #print('wallpaper in filtered list')
    list0 = list2
    except: # filter is out of date
    if msg >= 5:
    print('wallpaper not in filtered list... clearing')
    list0 = list1
    set_filter(msg=msg) # clear filter
    list0.sort()
    try: # needed if current wallpaper has been removed
    num = list0.index(name)
    if msg >= 5:
    print('current wallpaper info ::')
    print('name : {0}, number : {1}' .format(name, num))
    return num, list0
    except:
    if msg >= 1:
    print('Error :: get_seq :: Current wallpaper file missing :: name : {0}' .format(name))
    return 0, list0
    def list_sequence(com='next', seq=None, msg=def_msg):
    cname = get_info(msg=msg)[1]
    if seq == None:
    list_dir = get_info(msg=msg)[0]
    list_file = get_seq(msg=msg)[1]
    if msg >= 4:
    print('Changing wallpaper in sequence using current folder:mask')
    else:
    ## Build a list.
    a = check_list(seq, msg=msg)
    list_dir = []
    list_file = []
    with open(a, 'r') as f:
    for line in f:
    i = line.split(',')
    list_dir.append(os.path.join(root, strip_opt(i[0])))
    list_file.append(strip_opt(i[1]))
    set_filter(msg=msg) # flush mask if using a list
    if msg >= 4:
    print('Changing wallpaper in sequence using list file')
    try:
    c = list_file.index(cname)
    if msg >= 5:
    print('found current wallpaper in list at position {0}' .format(c))
    if com == 'random':
    n = random.randrange(0, len(list_file))
    if msg >= 4:
    print('setting random wallpaper from sequence')
    elif com == 'prev':
    n = get_prev(c, list_file)
    if msg >= 4:
    print('setting previous wallpaper in sequence')
    elif com == 'next':
    n = get_next(c, list_file)
    if msg >= 4:
    print('setting next wallpaper in sequence')
    elif com == 'first':
    if msg >= 4:
    print('setting first wallpaper in sequence')
    n = 0
    else:
    if msg >= 2:
    print('Warning :: Unknown commmand')
    n = 0
    except:
    if msg >= 4:
    print('Warning :: not found current wallpaper in list / folder')
    print('using first file in list / folder')
    n = 0
    if seq == None:
    set_wallpaper(list_file[n], list_dir, msg=msg)
    else:
    set_wallpaper(list_file[n], list_dir[n], msg=msg)
    def toggle_list(d='default', com='toggle', msg=def_msg):
    """Removes the current file from the list."""
    a = check_list(d, msg=msg)
    file_list = []
    mod_file = []
    cname = get_info(msg=msg)[1]
    cpath = get_info(msg=msg)[0]
    if os.path.dirname(cpath) == root:
    cdir = os.path.basename(cpath)
    elif os.path.dirname(os.path.dirname(cpath)) == root:
    cdir = os.path.join(os.path.basename(os.path.dirname(cpath)), os.path.basename(cpath))
    else:
    print('error')
    sys.exit()
    cmask = get_filter(msg=msg)
    if cmask == '':
    cdmask = cdir
    else:
    cdmask = '{0}:{1}' .format(cdir, cmask)
    in_list = False
    with open(a) as f:
    for line in f:
    i = line.split(',')
    if cname == strip_opt(i[1]):
    if msg >= 6:
    print('file in list')
    in_list = True
    else:
    if msg >= 6:
    print('file not in list')
    file_list.append(strip_opt(i[1]))
    mod_file.append('{0} , {1} \n' .format(strip_opt(i[0]), strip_opt(i[1])))
    if in_list and com != 'rmfile' :
    if msg >= 3:
    print('Removed file from list')
    if test:
    for j in mod_file:
    print('writing newline: {0}' .format(j))
    else:
    with open(a, 'w') as newf:
    for j in mod_file:
    newf.writelines(j)
    elif not in_list and com != 'addfile':
    mod_file.append('{0} , {1} \n' .format(cdmask, cname))
    if msg >= 3:
    print('Added wallpaper to list')
    if test:
    for j in mod_file:
    print('writing newline: {0}' .format(j))
    else:
    with open(a, 'w') as newf:
    for j in mod_file:
    newf.writelines(j)
    else:
    if com == 'addfile':
    if msg >= 2:
    print('Warning :: File already in list')
    elif com == 'rmfile':
    if msg >= 2:
    print('Warning :: File not in list')
    else:
    if msg >= 1:
    print('Error :: UNKNOWN :: TOG LIST FUNCTION')
    ##### OPENBOX MENU #####
    def gen_obmenu():
    import oblib
    for i in avaliable_folders():
    oblib.item(i, 'wallpaper.py --silent --change {0}' .format(i))
    def gen_obmenu_simple(name=None, i=None):
    import oblib
    if name == None:
    oblib.pipe_start()
    else:
    oblib.menu_start(name, i)
    oblib.item('Deafult', 'wallpaper.py --silent --default')
    oblib.sep()
    oblib.item('APOD', 'wallpaper.py --silent --apod')
    oblib.item('APOD Save', 'wallpaper.py --silent --apod-save')
    oblib.item('Random', 'wallpaper.py --silent --random')
    if name == None:
    oblib.pipe_end()
    else:
    oblib.menu_end()
    def gen_obmenu_standard():
    import oblib
    oblib.pipe_start()
    oblib.item('Deafult', 'wallpaper.py --silent --default')
    oblib.sep()
    oblib.item('APOD', 'wallpaper.py --silent --apod')
    oblib.item('APOD Save', 'wallpaper.py --silent --apod-save')
    oblib.sep()
    oblib.menu_start('Change Set')
    obmenu_change_set()
    oblib.menu_end()
    apod.obmenu_archive_folders(t='menu')
    oblib.item('Toggle List', 'wallpaper.py --silent --toggle')
    oblib.item('Random', 'wallpaper.py --silent --random')
    oblib.pipe_end()
    def gen_obmenu_alt():
    import oblib
    oblib.pipe_start()
    oblib.sep('Alt Menu')
    obmenu_change_set('alt')
    oblib.pipe_end()
    def obmenu_change_set(a='default', dl=menu_default, al=menu_alt):
    import oblib
    menu = check_list(a, dl=dl, al=al, returnF=True)
    if menu != False:
    f = open(menu, 'r')
    for line in f:
    i = line.split(',')
    oblib.item(strip_opt(i[0]), 'wallpaper.py --change {0}' .format(strip_opt(i[1])))
    f.close()
    else:
    for i in avaliable_folders():
    oblib.item(i, 'wallpaper.py --change {0}' .format(i))
    ##### TEST FUNCTIONS #####
    def parser_options():
    print('Options are: {0}' .format(options))
    print('Args are : {0}' .format(args))
    print('Command is : {0}' .format(command))
    def meta_info():
    if options.meta_source == None:
    print('No source specifieed')
    else:
    print('Script launched from source :: {0}' .format(options.meta_source))
    def test_module():
    #pass
    #print(check_list(args[0]))
    new_mod()
    def new_mod():
    #if path == None:
    # print('No path specified, using pwd')
    # path = os.curdir
    #need_new_name = False
    #print('Checking filenames in {0}' .format(path))
    #for name in os.listdir(path):
    # if name.find(" ") > -1:
    # print("Warning :: > < in {0}" .format(name))
    # need_new_name = True
    # if name.find("'") > -1:
    # print("Warning :: >'< in {0}" .format(name))
    # need_new_name = True
    # if name.find("&") > -1:
    # print("Warning :: >&< in {0}" .format(name))
    # need_new_name = True
    # if name.find('"') > -1:
    # print('Warning :: >"< in {0}' .format(name))
    # need_new_name = True
    # if need_new_name:
    # new_name = name.replace('"', "").replace(" ", "_").replace("&", "and").replace("'", "")
    # if re_name:
    # print("Renaming to new name:: {0}" .format(new_name))
    # os.rename(os.path.join(path, name), os.path.join(path, new_name))
    # else:
    # print("Suggested new name:: {0}" .format(new_name))
    # need_new_name = False
    pass
    ##### SANITISE WALLPAPER FILE NAMES #####
    def sane_names(path=None, re_name=False, msg=def_msg):
    """Check file names in a path."""
    if path == None:
    print('No path specified, using pwd')
    path = os.curdir
    need_new_name = False
    print('Checking filenames in {0}' .format(path))
    for name in os.listdir(path):
    if name.find(" ") > -1:
    print("Warning :: > < in {0}" .format(name))
    need_new_name = True
    if name.find("'") > -1:
    print("Warning :: >'< in {0}" .format(name))
    need_new_name = True
    if name.find("&") > -1:
    print("Warning :: >&< in {0}" .format(name))
    need_new_name = True
    if name.find('"') > -1:
    print('Warning :: >"< in {0}' .format(name))
    need_new_name = True
    if need_new_name:
    new_name = name.replace('"', "").replace(" ", "_").replace("&", "and").replace("'", "")
    if re_name:
    print("Renaming to new name:: {0}" .format(new_name))
    os.rename(os.path.join(path, name), os.path.join(path, new_name))
    else:
    print("Suggested new name:: {0}" .format(new_name))
    need_new_name = False
    print('File name check complete')
    ##### MAIN FUNCTION #####
    def Main(msg=def_msg):
    """Chooses which command to run."""
    if options.direction != None: # a dircetion has been set
    list_sequence(com=options.direction, seq=options.whichlist, msg=msg)
    elif command == 'last':
    set_wallpaper_last(msg=msg)
    elif command == 'info':
    current_wallpaper_info(msg=msg)
    ## change folder
    elif options.newfolder != None:
    change_folder(options.newfolder, msg=msg)
    ## apod
    elif command == 'apod':
    #apod.download2(msg=msg, test=test)
    try:
    import apod
    apod.download2(msg=msg, test=test)
    except:
    pass
    elif command == 'apod-save':
    #apod.apod_save('today', msg=msg, test=test)
    try:
    import apod
    apod.apod_save('today', msg=msg, test=test)
    except:
    pass
    ## list management
    elif options.toggle != None:
    toggle_list(options.whichlist, com=options.toggle, msg=msg)
    ## openbox menu
    elif command == 'obmenu':
    gen_obmenu_standard()
    elif command == 'obmenu-simple':
    gen_obmenu_simple()
    elif command == 'obmenu-alt':
    gen_obmenu_alt()
    ## filename check
    elif command == 'sane-name':
    sane_names(path=options.sane_path, re_name=options.sane_rename, msg=msg)
    ## cycle
    elif command == 'cycle':
    print('ERROR :: function not implemented')
    elif command == 'testmod':
    test_module()
    elif options.whichlist != None: # a list but no direction specified
    list_sequence(seq=options.whichlist, msg=msg)
    elif command == "TestNone":
    print('Test mode null op[tion')
    elif command == None: ## no command specified
    pass
    else:
    print('Error :: no valid command found')
    ##### SCRIPT STARTUP #####
    if __name__ == "__main__":
    # def parse_change(option, opt_str, value, parser):
    # parser.values.command = 'change'
    # parser.values.newfolder = value
    # def parse_smask(option, opt_str, value, parser):
    # parser.values.command = 'set-mask'
    # parser.values.mask = value
    def parse_cycle(option, opt_str, value, parser):
    parser.values.command = 'cycle'
    parser.values.interval = value
    def parse_msglevel(option, opt_str, value, parser):
    parser.values.msg = value
    # def parse_addfile(option, opt_str, value, parser):
    # parser.values.command = 'addfile'
    # parser.values.whichlist = value
    # def parse_rmfile(option, opt_str, value, parser):
    # parser.values.command = 'rmfile'
    # parser.values.whichlist = value
    parser = OptionParser(usage = "usage: %prog [options] command", version="%prog {0}" .format(__version__),
    description = "Drews Script to the manage wallpapers using feh.")
    parser.set_defaults(command=None, whichlist=None, direction=None, toggle=None, newfolder=None)
    standard = OptionGroup(parser, "Standard Options")
    metaopt = OptionGroup(parser, "Meta Info Options", "Further datails about the script startup useful for debugging")
    gapod = OptionGroup(parser, "APOD Options", "Controls for the Astronomy Picture of the Day. ")
    obmenu = OptionGroup(parser, "Openbox Menu", "Support for openbox xml menu generation. ")
    #groupalt = OptionGroup(parser, "Alternative Wallpapers")
    gplist = OptionGroup(parser, "List Support")
    namecheck = OptionGroup(parser, "Filename Support")
    direction = OptionGroup(parser, "Direction Commands")
    ## Standard Options
    standard.add_option("-q", "--quiet",
    action="store_true", dest="quiet", default=False, #help=SUPPRESS_HELP)
    help="only display warnings and errors")
    standard.add_option("-v", "--verbose",
    action="store_true", dest="verbose", default=False, #help=SUPPRESS_HELP)
    help="display all output")
    standard.add_option("--debug",
    action="store_true", dest="debug", default=False, #help=SUPPRESS_HELP)
    help="debug mode: detailed output of commands")
    standard.add_option("--really-quiet",
    action="store_true", dest="reallyquiet", default=False, help=SUPPRESS_HELP)
    #help="only display errors")
    standard.add_option("--silent",
    action="store_true", dest="silent", default=False, help=SUPPRESS_HELP)
    #help="don't display any output")
    standard.add_option('-t', "--test",
    action="store_true", dest="test", default=False, #help=SUPPRESS_HELP)
    help="test mode :: only print output")
    standard.add_option("--test-mod",
    action="store_const", const="testmod", dest="command", #help=SUPPRESS_HELP)
    help="test mode :: use test function module")
    standard.add_option("--test-none",
    action="store_const", const="TestNone", dest="command", #help=SUPPRESS_HELP)
    help="test mode :: no command specified")
    parser.add_option("--info", '-i',
    action="store_const", const="info", dest="command",
    help="Displays information about the current wallpaper.")
    parser.add_option("--last", '-l',
    action="store_const", const="last", dest="command",
    help="Sets the wallpaper as the last picture")
    direction.add_option('-n', "--next",
    action="store_const", const="next", dest="direction",
    help="Sets the next wallpaper in the sequence")
    direction.add_option('-p', "--prev", '--previous',
    action="store_const", const="prev", dest="direction",
    help="Sets the previous wallpaper in the sequence")
    direction.add_option('-r', '--rand', "--random",
    action="store_const", const="random", dest="direction",
    help="Sets a random wallpaper from the sequence")
    direction.add_option('-1', '--first', "--safe",
    action="store_const", const="first", dest="direction",
    help="Sets the first wallpaer in the sequence")
    gplist.add_option('-d', "--default",
    action="store_const", const="default", dest="whichlist",
    help="Uses the wallpapers from the default file list")
    gplist.add_option("--alt",
    action="store_const", const="alt", dest="whichlist",
    help="Uses the wallpapers from the alternative list")
    parser.add_option("--change", '-c',
    metavar="Folder[:Filter]", dest="newfolder",
    help="Changes the wallpaper folder, optional filter.")
    gapod.add_option('-a', "--apod",
    action="store_const", const="apod", dest="command",
    help="downloads and sets the wallpaper as todays APOD picture")
    gapod.add_option("--apod-save",
    action="store_const", const="apod-save", dest="command",
    help="Saves todays APOD picture")
    # gapod.add_option("--apod-last",
    # action="store_const", const="apod-last", dest="command",
    # help="Sets the wallpaper as yesterdays APOD picture")
    # gapod.add_option("--apod-force",
    # action="store_const", const="apod-force", dest="command",
    # help="force the download of todays APOD picture")
    gplist.add_option("--add-to-list",
    action="store_const", const='rmfile', dest='toggle',
    help="Adds the current wallpaper to the list.")
    gplist.add_option("--remove-from-list",
    action="store_const", const='addfile', dest='toggle',
    help="Removes the current wallpaper from a list.")
    gplist.add_option("--toggle-list", '--toggle',
    action="store_const", const='toggle', dest='toggle',
    help="Adds/Removes the current wallpaper from a list.")
    gplist.add_option("--list",
    metavar="LIST", dest='whichlist',
    help="Sets which list to use.")
    obmenu.add_option("--obmenu",
    action="store_const", const="obmenu", dest="command",
    help="Prints the standard openbox menu.")
    obmenu.add_option("--obmenu-simple",
    action="store_const", const="obmenu-simple", dest="command",
    help="Prints the simple openbox menu.")
    obmenu.add_option("--obmenu-alt",
    action="store_const", const="obmenu-alt", dest="command", #help=SUPPRESS_HELP)
    help="Prints the alternative openbox menu.")
    namecheck.add_option("--name-check",
    action="store_const", const="sane-name", dest="command",
    help="Checks if wallpaper names are valid.")
    namecheck.add_option("--name-path",
    metavar="PATH", dest="sane_path", default=None,
    help="Which folder to check.")
    namecheck.add_option("--rename",
    action="store_true", dest="sane_rename", default=False,
    help="If to rename invalid files.")
    metaopt.add_option("--meta-from",
    metavar="Source", dest='meta_source', default=None,
    help="Details from where the script was launched from")
    parser.add_option_group(direction)
    parser.add_option_group(gplist)
    parser.add_option_group(gapod)
    parser.add_option_group(obmenu)
    #parser.add_option_group(standard)
    #parser.add_option_group(metaopt)
    #parser.add_option_group(namecheck)
    (options, args) = parser.parse_args()
    test = options.test
    #debug = options.debug
    #verbose = options.verbose
    #quiet = options.quiet
    ## message level
    if options.debug == True:
    msg = 5
    elif options.verbose == True:
    msg = 4
    elif options.quiet == True:
    msg = 2
    elif options.reallyquiet == True:
    msg = 1
    elif options.silent == True:
    msg = 0
    else:
    msg = 3
    #if options.command == None:
    # try: # try and find a command
    # command = args[0]
    # except:
    # pass
    #else:
    # command = options.command
    command = options.command
    if options.debug:
    parser_options()
    meta_info()
    LockScript(Main, msg=msg) # start the script
    else:
    pass
    apod.py
    #!/usr/bin/python3
    #Filename: apod.py
    __version__ = '3.2.0'
    import os, sys
    from optparse import OptionParser, OptionGroup, SUPPRESS_HELP
    import shutil
    from datetime import date
    #print('loaded apod')
    ##### VARIABLES #####
    ## Files and Paths
    #apod_archive_folder = '/home/wallpaper/apod_archive'
    archive_folder = '/home/wallpaper/apod_archive'
    save_folder = '/home/wallpaper/Space'
    tmpdir = '/tmp/wallpaper/apod'
    html_file = os.path.join(tmpdir, 'apod-html')
    img_file = os.path.join(tmpdir, 'apod-img')
    index_file = os.path.join(tmpdir, 'apod-index')
    work = os.path.expanduser('~/.config/openbox/apod')
    date_file = os.path.join(work, 'apod-date')
    apodfile = os.path.join(work, 'apod')
    apodlast = os.path.join(work, 'apod-last')
    namefile = os.path.join(work, 'apod-names')
    video_dir = os.path.join(work, 'apod-videos')
    errs = os.path.join(work, 'archive-errors')
    dtoday = str(date.today()) # todays date
    thisyear = dtoday[:4]
    saveprefix = 'APOD-'
    ## Defaults
    def_test = False
    def_msg = 3
    def_command = None
    def_apodset = True
    def_archive_apod = True # Keep all APOD pictures
    def_clear_apod = False
    def_force_apod = False
    def_cutoff = None
    store_file_list = ''
    ##### LOCK v2 #####
    ## Lock v2
    def LockScript(fun, lock='/tmp/apod.lock', msg=def_msg):
    """Locks the script before starting a function."""
    from os import O_CREAT, O_EXCL
    try: # lock the function
    fd = os.open(lock, O_CREAT+O_EXCL)
    #print('created lock file')
    except OSError:
    print('Already running function {0}...' .format(fun))
    sys.exit(1)
    try:
    fun(msg)
    finally:
    try: # release lock
    os.remove(lock)
    except:
    print('Error :: Lockfile missing !!!')
    ##### DEFINITIONS #####
    def get_date(dfile=date_file):
    check_file(dfile, create=True, msg=1)
    f = open(dfile)
    return f.read()
    def check_dir(d, create=False, msg=def_msg):
    """Check if path exists."""
    if not os.path.exists(d):
    if msg > 3:
    print('Error : folder missing...')
    if create:
    try:
    os.makedirs(d)
    if msg > 3 :
    print('...created folder')
    return True
    except:
    print('Fatal Error :: could not create directory {0}' .format(d))
    sys.exit()
    else:
    return False
    elif not os.path.isdir(d):
    print('Fatal Error :: this is not a directory')
    sys.exit()
    else:
    return True
    def check_file(f, create=False, msg=def_msg):
    """Check if path exists."""
    if not os.path.exists(f):
    #if msg > 3:
    # print('Error : file missing...')
    if create:
    check_dir(os.path.dirname(f), create=create, msg=msg)
    if msg > 5:
    print('creating file {0}' .format(f))
    try:
    q = open(f, 'w')
    q.write('')
    q.close()
    return True
    except:
    if msg >= 1:
    print('Fatal Error :: could not create file {0}' .format(f))
    sys.exit()
    else:
    if msg >= 5:
    print('file {0} does not exist' .format(f))
    return False
    else:
    if msg >= 5:
    print('file {0} exists' .format(f))
    return True
    def copy_file(ffrom, fto, msg=def_msg, test=def_test):
    """Copy files, from to (with test option)."""
    if test:
    print('[[copy command: {0} to {1}]]' .format(ffrom, fto))
    else:
    try:
    shutil.copy(ffrom, fto)
    except:
    if not os.path.exists(ffrom):
    print('Warning: error copying file, does not exist')
    elif os.path.isdir(ffrom):
    print('Fatal Error :: file being copied is a directory!')
    sys.exit()
    else:
    print('Fatal Error :: UNKNOWN ERROR during copy')
    sys.exit()
    def download_files(hfile=html_file, ifile=img_file, datefile=date_file, msg=def_msg, test=def_test, apodset=def_apodset, day='today', archive_apod=def_archive_apod):
    """Download the APOD html and img."""
    import urllib.request
    import socket
    timeout = 10
    socket.setdefaulttimeout(timeout)
    if day == 'today':
    url = 'http://antwrp.gsfc.nasa.gov/apod/astropix.html'
    name = dtoday
    year = thisyear
    else:
    url = 'http://antwrp.gsfc.nasa.gov/apod/ap{0}.html' .format(day)
    name = day
    if day[:1] == '9' :
    name = '19{0}-{1}-{2}' .format(day[:2], day[2:4], day[4:])
    else:
    name = '20{0}-{1}-{2}' .format(day[:2], day[2:4], day[4:])
    year = name[:4]
    try:
    response = urllib.request.urlopen(url)
    html = response.read()
    if msg > 3:
    print('downloaded html data for {0}' .format(day))
    check_file(hfile, create=True, msg=msg)
    f = open(hfile, 'wb')
    f.write(html)
    f.close()
    except:
    if msg >= 1:
    print('ERROR :: page not found :: exiting.')
    sys.exit(1)
    if day == 'today':
    t = open(datefile, 'w')
    t.write(dtoday)
    t.close()
    if msg > 3:
    print('updated date file with todays date')
    if msg > 3:
    print('copying over yesterdays APOD image')
    copy_file(apodfile, apodlast, msg=msg, test=test)
    found_img = False
    with open(hfile, 'r', encoding='latin-1') as g:
    for line in g:
    if 'IMG SRC' in line:
    i = line.split('"')
    if msg > 4:
    print('found image : {0}' .format(i[1]))
    found_img = True
    try:
    img_responce = urllib.request.urlopen(os.path.join('http://antwrp.gsfc.nasa.gov/apod/', i[1]))
    img_data = img_responce.read()
    except:
    print('error in img download')
    check_dir(errs, create=True, msg=1)
    check_file(os.path.join(errs, name), create=True, msg=0)
    else:
    if msg >= 5:
    print('read img data')
    check_file(ifile, create=True, msg=0)
    if msg >= 5:
    print('created img file')
    with open(ifile, 'wb') as l:
    l.write(img_data)
    if msg >= 3:
    print('downloaded image for {0}' .format(day))
    if day == 'today':
    copy_file(ifile,apodfile, msg=msg, test=test)
    if archive_apod:
    apod_archive(msg=msg, test=test, dfile=ifile, year=year, name=name)
    if not found_img :
    if msg >= 3:
    print('video :: not found image line in file from {0}' .format(i))
    check_file(os.path.join(video_dir, name), create=True, msg=0)
    if day == 'today':
    print('Warning : no image line in html file')
    copy_file(apodlast,apodfile, msg=msg, test=test)
    os.remove(hfile)
    os.remove(ifile)
    def apod_archive(dfile=img_file, msg=def_msg, test=def_test, year=thisyear, name=dtoday):
    """Archive APOD picture."""
    arch_file = os.path.join(archive_folder, year, name)
    check_dir(os.path.join(archive_folder, year), msg=msg, create=True)
    if check_file(arch_file, create=False, msg=msg):
    if msg > 3:
    print('APOD picture already archived')
    else:
    if msg > 3:
    print('Archiving APOD picture')
    copy_file(dfile, arch_file, msg=msg, test=test)
    def apod_save(day='current', sfolder=save_folder, msg=def_msg, test=def_test, prefix=saveprefix):
    """Save APOD picture as best of APOD."""
    with open(os.path.expanduser('~/.fehbg'), 'r') as f:
    a = f.read()
    b = a[15:-1]
    f.close()
    if day == 'today' or b[-4:] == 'apod':
    source = apodfile
    sfile = prefix + dtoday
    elif day == 'current':
    if not (os.path.dirname(b) == archive_folder or os.path.dirname(os.path.dirname(b)) == archive_folder ):
    print('picture is not in the recognised apod archive folder')
    sys.exit()
    source = b
    sfile = prefix+ b[-10:]
    else:
    if msg >= 1:
    print('unknown file specified')
    sys.exit(1)
    if msg > 3:
    print('Saving APOD picture to Save folder')
    copy_file(source, os.path.join(sfolder, sfile), msg=msg, test=test)
    def set_apod(a=apodfile, msg=def_msg, test=def_test, apodset=def_apodset ):
    """Sets the APOD wallpaper."""
    if not apodset:
    if msg > 3:
    print('Skipping setting APOD picture')
    else:
    if msg > 3:
    print('Setting APOD picture')
    if test:
    print("exec :: feh --bg-scale {0}" .format(a))
    else:
    os.system("feh --bg-scale {0}" .format(a))
    def clear_date(msg=def_msg, test=False):
    """Clears the date file."""
    if msg > 3:
    print('reseting date')
    if not test:
    t = open(datefile, 'w')
    t.write('')
    t.close()
    ##### APOD NAMES #####
    def get_name(fname=None, names=namefile, msg=def_msg, rerun=True, prefix=saveprefix):
    """Returns the name of an APOD file."""
    name_index = []
    title_index = []
    with open(names, 'r') as f:
    for line in f:
    i = line.split(',', 3)
    name_index.append(i[0])
    title_index.append(i[3])
    if fname == None:
    if msg >= 4:
    print('getting todays date')
    date = get_date()
    elif fname.startswith(prefix):
    if msg >= 4:
    print('removing save prefix from name')
    date = fname[len(prefix):]
    else:
    date = fname
    try:
    c = name_index.index(date)
    return title_index[c][:-2]
    except:
    if rerun:
    if msg >= 2:
    print('Warning :: name not in index, recreating')
    download_apod_index(msg=msg)
    build_name_list(msg=msg)
    get_name(fname=fname, names=names, msg=msg, rerun=False)
    else:
    if msg >= 1:
    print('Error :: name not in index, please recreate')
    def regen_index(msg=def_msg, cutoff=None):
    download_apod_index(msg=msg)
    build_name_list(msg=msg, cutoff=cutoff)
    def file_status(date, msg=def_msg, cutoff=None):
    """Status of an APOD Picture."""
    downloaded_files = [] # files in main apod download folder
    archive_files = [] # files in sub folder
    archive_download = [] # files from archive download
    videolist = []
    for i in os.listdir(archive_folder):
    if os.path.isdir(os.path.join(archive_folder,i)):
    for j in os.listdir(os.path.join(archive_folder, i)):
    j1 = j[2:]
    j2 = j1.replace('-','')
    archive_files.append(j2)
    else:
    i1 = i[2:]
    i2 = i1.replace('-','')
    downloaded_files.append(i2)
    for i in os.listdir(video_dir):
    videolist.append(i)
    if date[:1] == '9' :
    tdate = '19{0}' .format(date)
    else:
    tdate = '20{0}' .format(date)
    if cutoff == None:
    cutoff = '1995' # apod started 1995 06 16
    if tdate <= cutoff:
    return 'cut-off'
    try:
    downloaded_files.index(date)
    if msg >= 5:
    print('picture has been downloaded')
    return 'downloaded' #print('picture from {0} has already been downloaded' .format(pagedate))
    except:
    pass
    try:
    archive_files.index(date)
    if msg >= 5:
    print('picture has been downloaded')
    return 'archived' #print('picture from {0} has already been downloaded' .format(pagedate))
    except:
    pass
    try:
    archive_download.index(date)
    if msg >= 5:
    print('picture has been downloaded by archive retrieval')
    return 'retrieved'
    except:
    pass
    try:
    videolist.index(date)
    if msg >= 5:
    print('picture is a video')
    return 'video file'
    except:
    if msg >= 5:
    print('picture is missing')
    return 'missing'
    def download_apod_index(msg=def_msg, index=index_file):
    """Downloads the apod index file."""
    import urllib.request
    try:
    response = urllib.request.urlopen('http://antwrp.gsfc.nasa.gov/apod/archivepix.html')
    html = response.read()
    if msg > 3:
    print('downloaded apod index')
    check_file(index, create=True, msg=msg)
    f = open(index, 'wb')
    f.write(html)
    f.close()
    except:
    if msg >= 1:
    print('Fatal Error :: index page not found')
    sys.exit()
    def build_name_list(msg=def_msg, index=index_file, names=namefile, cutoff=None):
    """Builds a name list."""
    check_file(names, create=True, msg=msg)
    data = []
    with open(index, 'r') as f:
    for line in f:
    if '<a href="ap' in line:
    i = line.split(':', 1)
    imgdate = i[1][13:19]
    imgname = i[1][26:-9]
    status = file_status(date=imgdate, msg=msg, cutoff=None)
    if imgdate[:1] == '9' :
    imgfile = '19{0}-{1}-{2}' .format(imgdate[:2], imgdate[2:4], imgdate[4:])
    else:
    imgfile = '20{0}-{1}-{2}' .format(imgdate[:2], imgdate[2:4], imgdate[4:])
    if msg >= 3:
    print('found file : date = {0} : status = {1} : filename = {2}' .format(imgdate, status, imgfile))
    data.append('{0},{1},{2},{3} \n' .format(imgfile, imgdate, status, imgname))
    if msg >= 4:
    print('finished parsing index file')
    with open(namefile, 'w') as newf:
    for j in data:
    newf.writelines(j)
    if msg >= 4:
    print('written new name list')
    ##### MACROS #####
    def download2(msg=def_msg, test=def_test, apodset=def_apodset, force_apod=def_force_apod, clear_apod=def_clear_apod, archive_apod=def_archive_apod):
    """Downloads and sets APOD picture."""
    if clear_apod:
    clear_date(msg=msg, test=test)
    if force_apod:
    if msg >= 3:
    print('download forced')
    if get_date() != dtoday or force_apod:
    download_files(msg=msg, test=test, archive_apod=archive_apod)
    else:
    if msg >= 2:
    print('apod has already been downloaded today')
    set_apod(msg=msg, test=test, apodset=apodset) # #set apod picture
    def archive_download(msg=def_msg, newindex=False, cutoff=None, test=def_test):
    """Search and download missing pictures from the APOD archive pages"""
    if newindex:
    regen_index(msg=msg, cutoff=cutoff)
    target_dates = []
    with open(namefile, 'r') as g:
    for line in g:
    i = line.split(',')
    if i[2] == 'missing':
    if file_status(date=i[1], msg=msg) == 'missing':
    target_dates.append(i[1])
    if msg >= 4:
    print('target list built')
    target_dates.sort()
    for j in target_dates:
    if msg >= 4:
    print('')
    download_files(msg=msg, test=test, day=j, archive_apod=True)
    ##### OPENBOX MENU #####
    def gen_obmenu_standard():
    import oblib
    oblib.pipe_start()
    oblib.item('APOD', 'apod.py --update')
    oblib.item('APOD Save', 'apod.py --save')
    oblib.item('APOD Force', 'apod.py --force')
    oblib.pipe_end()
    def obmenu_archive_folders(t='pipe'):
    import oblib
    years = []
    for i in os.listdir(archive_folder):
    if os.path.isdir(os.path.join(archive_folder,i)):
    years.append(i)
    years.sort()
    years.reverse()
    if t == 'pipe':
    oblib.pipe_start()
    else:
    oblib.menu_start('Apod Archive')
    for k in years:
    oblib.item('Apod: {0}' .format(k), 'wallpaper.py --change {0}/{1}' .format(archive_folder, k))
    if t == 'pipe':
    oblib.pipe_end()
    else:
    oblib.menu_end()
    ##### TEST FUNCTIONS #####
    def parser_options():
    print('Options are: {0}' .format(options))
    print('Args are : {0}' .format(args))
    print('Command is : {0}' .format(options.command))
    def meta_info():
    if options.meta_source == None:
    print('No source specifieed')
    else:
    print('Script launched from source :: {0}' .format(options.meta_source))
    def test_module(msg=def_msg):
    pass
    #gen_obmenu_arfolders()
    #unicode_test()
    #apod_archive_download(msg=msg)
    #print(check_list(args[0]))
    #regen_index(msg=msg)
    #print(get_name(fname=None, msg=msg))
    #print(len(saveprefix))
    ##### MAIN FUNCTION #####
    def Apod_Main(msg=def_msg):
    """Main functions."""
    command = options.command
    check_dir(work, create=True, msg=msg)
    if options.regen_index :
    regen_index(msg=msg, cutoff=options.cutoff)
    if command == None:
    command = 'pass'
    if command == "download":
    if msg > 3:
    print('Updating APOD')
    download2(msg=msg, test=options.test, apodset=options.apodset, force_apod=options.force, clear_apod=options.clear, archive_apod=options.archive)
    elif command == "download-only":
    if msg > 3:
    print('Downloading APOD picture only')
    download2(msg=msg, test=options.test, apodset=False, force_apod=options.force, clear_apod=options.clear, archive_apod=False)
    elif command == "last":
    if msg > 3:
    print('Setting last APOD')
    set_apod(apodlast, msg=msg, test=options.test, apodset=options.apodset)
    elif command == "save-today":
    apod_save('today', msg=msg, test=options.test)
    elif command == "save":
    apod_save('current', msg=msg, test=options.test)
    elif command == "set":
    if msg > 3:
    print('Setting APOD')
    set_apod(msg=msg, test=options.test, apodset=options.apodset)
    elif command == "restore":
    if msg > 3:
    print('Restoreing yesterdays APOD picture.')
    copy_file(apodlast, apodfile, msg=msg, test=options.test)
    set_apod(msg=msg, test=options.test, apodset=options.apodset)
    elif command == 'retrieve':
    archive_download(msg=msg, newindex=options.newindex, cutoff=options.cutoff)
    elif command == 'testmod':
    test_module(msg=msg)
    elif command == "TestNone":
    print('Test mode null op[tion')
    elif command == "pass":
    if msg >= 4:
    print('pass option has been called')
    elif not command == None:
    if msg >= 2:
    print('Warning :: Unrecognised command specified')
    #pass
    else:
    if msg >= 2:
    print('Warning :: no commands found, using default option')
    set_apod(msg=msg, test=options.test, apodset=options.apodset)
    ##### SCRIPT STARTUP #####
    if __name__ == "__main__":
    parser = OptionParser(usage = "usage: %prog [download options] [command]", version="%prog {0}" .format(__version__),
    description = "Script to manage APOD wallpapers.")
    parser.set_defaults(archive=def_archive_apod, apodset=def_apodset, command=None)
    standard = OptionGroup(parser, "Standard Options")
    doptions = OptionGroup(parser, "Download Options")
    aoptions = OptionGroup(parser, "Archive Options")
    metaopt = OptionGroup(parser, "Meta Info Options", "Further datails about the script startup useful for debugging")
    standard.add_option("-q", "--quiet",
    action="store_true", dest="quiet", default=False,
    help="only display warnings and errors")
    standard.add_option("-v", "--verbose",
    action="store_true", dest="verbose", default=False,
    help="display all output")
    standard.add_option("--debug",
    action="store_true", dest="debug", default=False,
    help="debug mode: detailed output of commands")
    standard.add_option("--really-quiet",
    action="store_true", dest="reallyquiet", default=False, help=SUPPRESS_HELP)
    #help="only display errors")
    standard.add_option("--silent",
    action="store_true", dest="silent", default=False, help=SUPPRESS_HELP)
    #help="don't display any output")
    standard.add_option('-t', "--test",
    action="store_true", dest="test", default=False, help=SUPPRESS_HELP)
    #help="test mode :: only print output")
    standard.add_option("--test-mod",
    action="store_const", const="testmod", dest="command", help=SUPPRESS_HELP)
    #help="test mode :: use test function module")
    standard.add_option("--test-none", "--pass",
    action="store_const", const="TestNone", dest="command", help=SUPPRESS_HELP)
    #help="test mode :: no command specified")
    parser.add_option('-a', '-u', '--update',
    action="store_const", const="download", dest="command",
    help="Downloads and sets the wallpaper as todays APOD picture")
    parser.add_option("--save",
    action="store_const", const="save", dest="command",
    help="Saves the curent APOD wallpaper")
    parser.add_option("--set",
    action="store_const", const="set", dest="command",
    help="Sets wallpaper as APOD")
    parser.add_option('--download-only',
    action="store_const", const="download-only", dest="command",
    help="Only downloads todays APOD picture")
    parser.add_option("--last",
    action="store_const", const="last", dest="command",
    help="Sets the wallpaper as yesterdays APOD picture")
    parser.add_option("--restore",
    action="store_const", const="restore", dest="command", help=SUPPRESS_HELP)
    #help="Restores yesterdays APOD picture as todays.")
    aoptions.add_option("--retrieve", '--populate',
    action="store_const", const="retrieve", dest="command",
    help="Retrives archive APOD images from the APOD archive")
    aoptions.add_option("--regen-index",
    action="store_true", dest="regen_index", default=False,
    help="Regenerates the APOD index file")
    aoptions.add_option("--no-index",
    action="store_false", dest="newindex", default=True, help=SUPPRESS_HELP)
    #help="Do not build a nex index")
    aoptions.add_option("--cut-off",
    metavar="Date", dest='cutoff', default=def_cutoff,
    help="Cut off date for downloading archive pictures")
    # parser.add_option("--get-name",
    # metavar="NAME", dest="getname", default=None,
    # help="Returns the name of a pictures name")
    doptions.add_option("--force",
    action="store_true", dest="force", default=def_force_apod,
    help="Force the download of todays APOD picture")
    doptions.add_option("--clear",
    action="store_true", dest="clear", default=def_clear_apod, help=SUPPRESS_HELP)
    #help="resets the date of last APOD download.")
    doptions.add_option("--archive",
    action="store_true", dest="archive",
    help="If to archive a picture after download")
    doptions.add_option("--no-archive",
    action="store_false", dest="archive",
    help="If to archive a picture after download")
    doptions.add_option("--force-set",
    action="store_true", dest="apodset", help=SUPPRESS_HELP)
    #help="If to set the wallpaper as APOD.")
    doptions.add_option("--no-set",
    action="store_false", dest="apodset", help=SUPPRESS_HELP)
    #help="Skips setting APOD as wallpaper")
    metaopt.add_option("--meta-from",
    metavar="Source", dest='meta_source', default=None,
    help="Details from where the script was launched from")
    parser.add_option_group(doptions)
    parser.add_option_group(aoptions)
    parser.add_option_group(standard)
    #parser.add_option_group(metaopt)
    (options, args) = parser.parse_args()
    ## message level
    if options.debug == True:
    msg = 5
    elif options.verbose == True:
    msg = 4
    elif options.quiet == True: # warnings
    msg = 2
    elif options.reallyquiet == True: # errors only
    msg = 1
    elif options.silent == True: # no output
    msg = 0
    else:
    msg = 3
    if options.debug:
    parser_options()
    meta_info()
    LockScript(Apod_Main, msg=msg)

Maybe you are looking for

  • Several things wrong with iPod Nano [1st gen]

    I have been trying to fix my friend's iPod nano but cant find the solution, several things seem to be wrong with it; every time you connect it to the computer it shows the do not disconnect sign ad then completely freezes adn you have to reset it aga

  • How to read a text delimited file using 2 dimentional array in java ??

    hi, I am new to java programming.. I have to do a task where in i have to read a text delimeted file in an array.. For example.. If the file is as follows Name place Value adi goa 20 shri mumbai 30 riya bangalr 45 I want it to be read in java so as t

  • User specific setting for SSM_CUST table

    Dear experts, i know it is not a right forum for post this thread but i am not able find to right forum for such problem My problem is that i disable favorites by adding parameter ALLOW_TCODE_START in SSM_CUST table and it disble all the user to add

  • Changing the Top Level navigation

    Hi, I have a situation where i need to change the Top level navigation i.e the look and feel should be like a website. I had seen some blogs like hovering etc.. but i cant understand the concept. Can any one explain it in a simple and detailed way. T

  • Procedure of mapping new UCCX script

    Hi Guys, Can you please tell me the procedure of correctly creating a trigger for a UCCX script? do I need to create a separate call control group all together or I can use existing one?