• 1 Post
  • 25 Comments
Joined 1 year ago
cake
Cake day: July 7th, 2023

help-circle







  • Personally I would recommend to use regex instead for parsing, which would also allow you to more easily test your expressions. You could then get the list as

    import re
    result = re.findall(r'[\w_]+|\S',  yourstring)  # This will preserve ULLONG_MAX as a single word if that's what you want
    

    As for what’s wrong with your expressions:

    First expression: Once you hit (, OneOrMore(Char(printables)) will take over and continue matching every printable char. Instead you should use OR (|) with the alphanumerical first for priority OneOrMore(word | Char(printables))

    Second expression. You’re running into the same issue with your use of +. Once string.punctuation takes over, it will continue matching until it encounters a char that is not a punctuation and then stop the matching. Instead you can write:

    parser = OneOrMore(Word(alphanums) | Word(string.punctuation))
    result = parser.parseString(yourstring)
    

    Do note that underscore is considered a punctutation so ULLONG_MAX will be split, not sure if that’s what you want or not.



  • I don’t have any experience with pipx and personally prefer to just skip the .toml and place the whole pyprojectsetup in setup.py.

    With that method, I would write inside setup()

    packages=find_packages()  # Include every python packages
    package_data={  # Specify additional data files
        'yourpackagename': [
            'config/*'
            etc...
        ]
    }
    

    This would however require you to have a package folder which all your package files/folders are inside, meaning the top level repo folder should not have any files or other folders that you want to distribute. Your MANIFEST.in looks fine.


  • UlrikHD@programming.devtoTechnology@lemmy.worldWindows 12 May Require a Subscription
    link
    fedilink
    English
    arrow-up
    166
    arrow-down
    2
    ·
    edit-2
    9 months ago

    I don’t believe for one bit that windows will move to a pure subscription based model. They are greedy, but not stupid.

    What’s more believable is that the base OS will be the same as usual, but if you want fancy AI assistants in your OS, you must subscribe, with the justification being that MS must pay for the servers running the models you’re using.


  • if Valve isn’t selling at a loss to poorer regions then they are simply extracting additional profit from higher-income regions on the assumption that those customers can afford it.

    Valve can’t sell for a loss the same way ebay can’t. Valve simply takes a percentage of the price everytime a game is bought, publishers are in complete control of the price they want to sell. Often, publishers will let Steam automatically set regional pricing based e.g. the American price though.

    The way these publishers operate, they will simply set the price at the highest possible value to extract as much as money ad they can from those willing to spend 60+$. Those unwilling or incapable of spending that amount of money, will just buy the game later on a sale. Price skimming has only become more and more prevalent in PC gaming with steam being the “innovator” of frequent sales.


  • Yes I did read it. I was pointing out that all this will do is screw over citizens of poorer EU countries. India vs USA was simply to make it obvious why the concept of geo blocking makes sense. Germans will on average have stronger buying power than someone in Latvia.

    Steam is a storefront, not a competitor to game publisher. It’s effectively no different than Lidl agreeing to run a regional rebate program for Samsung TVs in Latvia for whatever reason.

    The geo blocking enabled cheaper prices for certain countries, not higher. The only people who would have an issue with it is people from richer countries that for some reason are jealous of lower prices in some countries.



  • Valve won’t break the law for other publisher’s profits. Steam is just a store front, they were geo blocking on behalf of other publishers.

    Valve also doesn’t take a cut from steam key sales not bought directly through their storefront, so the geoblocking keys isn’t something that will impact them. More likely, this will result in citizens of poorer EU countries getting screwed over by having to pay higher prices for games, since they can’t stop EU citizens from taking advantage of buying the game from the poorest EU country.






  • As others have suggested, ffmpeg is a great cli tool. If you aren’t comfortable with the terminal you can do it via python like this:

    import os
    import sys
    import subprocess
    
    
    def crop_media(file_name: str, w: int, h: int, x: int, y: int, new_dir: str) -> None:
        try:
            subprocess.run(f'ffmpeg -i "{file_name}" -vf "crop={w}:{h}:{x}:{y}" temp.gif -y',
                               shell=True, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
            os.rename('temp.gif', os.path.join(new_dir, file_name))
        # Print the error and continue with other gifs, remove try block if you want a complete stop
        except subprocess.CalledProcessError as e:
            print(e)
        except KeyboardInterrupt:
            print('KeyboardInterrupt, cleaning up files...')
            os.remove('temp.gif')
            sys.exit(0)
    
    
    def crop_directory(directory: str, w: int, h: int, x: int, y: int, new_dir: str) -> None:
        for root, _, files in directory:
            for file in files:
                if not file.endswith('.gif'):
                    continue
                if os.path.isfile(os.path.join(new_dir, file)):
                    print(f'{file} already exists in {new_dir}, skipping...')
                    continue
    
                file_path = os.path.normpath(os.path.join(root, file))
                crop_media(file_path, w, h, x, y, new_dir)
    
    
    if __name__ == '__main__':
        width = 0
        height = 0
        x_offset = 0
        y_offset = 0
        gif_directory = ''
        new_directory = ''
        crop_directory(gif_directory, width, height, x_offset, y_offset, new_directory)
    

    This should go through every file in the directory and subdirectories and call the ffmpeg command on each .gif. With new_directory you can set a directory to store every cropped .gif. The ffmpeg command is based on johnpiers suggestion.

    The script assumes unique filenames for each gif and should work with spaces in the filenames. If they aren’t unique, you can just remove the new_directory part, but you will then lose the original gif that you cropped.