pycmx


Namepycmx JSON
Version 1.3.0 PyPI version JSON
download
home_pagehttps://github.com/iluvcapra/pycmx
SummaryPython CMX 3600 Edit Decision List Parser
upload_time2025-01-07 19:56:43
maintainerNone
docs_urlNone
authorJamie Hardt
requires_python<4.0,>=3.8
licenseMIT
keywords parser film broadcast
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [![Documentation Status](https://readthedocs.org/projects/pycmx/badge/?version=latest)](https://pycmx.readthedocs.io/en/latest/?badge=latest) ![](https://img.shields.io/github/license/iluvcapra/pycmx.svg) ![](https://img.shields.io/pypi/pyversions/pycmx.svg) [![](https://img.shields.io/pypi/v/pycmx.svg)](https://pypi.org/project/pycmx/) ![](https://img.shields.io/pypi/wheel/pycmx.svg)
![GitHub last commit](https://img.shields.io/github/last-commit/iluvcapra/pycmx)
[![Lint and Test](https://github.com/iluvcapra/pycmx/actions/workflows/python-package.yml/badge.svg)](https://github.com/iluvcapra/pycmx/actions/workflows/python-package.yml)


# pycmx

The `pycmx` package provides a basic interface for parsing a CMX 3600 EDL and 
its most most common variations.

## Features

* The major variations of the CMX 3600: the standard, "File32", "File128" and 
  long Adobe Premiere event numbers are automatically detected and properly
  read.
* Preserves relationship between events and individual edits/clips.
* Remark or comment fields with common recognized forms are read and 
  available to the client, including clip name and source file data.
* Symbolically decodes transitions and audio channels.
* Does not parse or validate timecodes, does not enforce framerates, does not
  parameterize timecode or framerates in any way. This makes the parser more
  tolerant of EDLs with mixed rates.
* Unrecognized lines are accessible on the `EditList` and `Event` classes
  along with the line numbers, to help the client diagnose problems with a
  list and give the client the ability to extend the package with their own
  parsing code.

## Usage

### Opening and Parsing EDL Files
```
>>> import pycmx
>>> with open("tests/edls/TEST.edl") as f
... 	edl = pycmx.parse_cmx3600(f)
...
>>> edl.title
'DC7 R1_v8.2'
```

### Reading Events and Edits

`EditList.events` is a generator...

```
>>> events = list( edl.events )  
>>> len(events)
120
>>> events[43].number 
'044'
```

...and events contain 1...n edits.

```
>>> events[43].edits[0].source_in 
'00:00:00:00'
>>> events[43].edits[0].transition.cut
True
>>> events[43].edits[0].record_out
'01:10:21:10'
```

### Acessing Transitions and Enabled Channels

```           
>>> events[41].edits[0].transition.dissolve
False
>>> events[41].edits[1].transition.dissolve
True
>>> events[41].edits[0].clip_name
'TC R1 V1.2 TEMP1 DX M.WAV'
>>> events[41].edits[1].clip_name
'TC R1 V6 TEMP2 M DX.WAV'
   
              # parsed channel maps are also
              # available to the client
>>> events[2].edits[0].channels.get_audio_channel(7)
True
>>> events[2].edits[0].channels.get_audio_channel(6)
False
>>> for c in events[2].edits[0].channels.channels:
...     print(f"Audio channel {c} is present")
... 
Audio channel 7 is present
>>> events[2].edits[0].channels.video
False
```


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/iluvcapra/pycmx",
    "name": "pycmx",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.8",
    "maintainer_email": null,
    "keywords": "parser, film, broadcast",
    "author": "Jamie Hardt",
    "author_email": "jamiehardt@me.com",
    "download_url": "https://files.pythonhosted.org/packages/f0/03/833436fe65501e4bf261b406b1fda1b030ff0314eb7ede1796b01a02624e/pycmx-1.3.0.tar.gz",
    "platform": null,
    "description": "[![Documentation Status](https://readthedocs.org/projects/pycmx/badge/?version=latest)](https://pycmx.readthedocs.io/en/latest/?badge=latest) ![](https://img.shields.io/github/license/iluvcapra/pycmx.svg) ![](https://img.shields.io/pypi/pyversions/pycmx.svg) [![](https://img.shields.io/pypi/v/pycmx.svg)](https://pypi.org/project/pycmx/) ![](https://img.shields.io/pypi/wheel/pycmx.svg)\n![GitHub last commit](https://img.shields.io/github/last-commit/iluvcapra/pycmx)\n[![Lint and Test](https://github.com/iluvcapra/pycmx/actions/workflows/python-package.yml/badge.svg)](https://github.com/iluvcapra/pycmx/actions/workflows/python-package.yml)\n\n\n# pycmx\n\nThe `pycmx` package provides a basic interface for parsing a CMX 3600 EDL and \nits most most common variations.\n\n## Features\n\n* The major variations of the CMX 3600: the standard, \"File32\", \"File128\" and \n  long Adobe Premiere event numbers are automatically detected and properly\n  read.\n* Preserves relationship between events and individual edits/clips.\n* Remark or comment fields with common recognized forms are read and \n  available to the client, including clip name and source file data.\n* Symbolically decodes transitions and audio channels.\n* Does not parse or validate timecodes, does not enforce framerates, does not\n  parameterize timecode or framerates in any way. This makes the parser more\n  tolerant of EDLs with mixed rates.\n* Unrecognized lines are accessible on the `EditList` and `Event` classes\n  along with the line numbers, to help the client diagnose problems with a\n  list and give the client the ability to extend the package with their own\n  parsing code.\n\n## Usage\n\n### Opening and Parsing EDL Files\n```\n>>> import pycmx\n>>> with open(\"tests/edls/TEST.edl\") as f\n... \tedl = pycmx.parse_cmx3600(f)\n...\n>>> edl.title\n'DC7 R1_v8.2'\n```\n\n### Reading Events and Edits\n\n`EditList.events` is a generator...\n\n```\n>>> events = list( edl.events )  \n>>> len(events)\n120\n>>> events[43].number \n'044'\n```\n\n...and events contain 1...n edits.\n\n```\n>>> events[43].edits[0].source_in \n'00:00:00:00'\n>>> events[43].edits[0].transition.cut\nTrue\n>>> events[43].edits[0].record_out\n'01:10:21:10'\n```\n\n### Acessing Transitions and Enabled Channels\n\n```           \n>>> events[41].edits[0].transition.dissolve\nFalse\n>>> events[41].edits[1].transition.dissolve\nTrue\n>>> events[41].edits[0].clip_name\n'TC R1 V1.2 TEMP1 DX M.WAV'\n>>> events[41].edits[1].clip_name\n'TC R1 V6 TEMP2 M DX.WAV'\n   \n              # parsed channel maps are also\n              # available to the client\n>>> events[2].edits[0].channels.get_audio_channel(7)\nTrue\n>>> events[2].edits[0].channels.get_audio_channel(6)\nFalse\n>>> for c in events[2].edits[0].channels.channels:\n...     print(f\"Audio channel {c} is present\")\n... \nAudio channel 7 is present\n>>> events[2].edits[0].channels.video\nFalse\n```\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python CMX 3600 Edit Decision List Parser",
    "version": "1.3.0",
    "project_urls": {
        "Documentation": "https://pycmx.readthedocs.io/",
        "Homepage": "https://github.com/iluvcapra/pycmx",
        "Repository": "https://github.com/iluvcapra/pycmx.git",
        "Tracker": "https://github.com/iluvcapra/pycmx/issues"
    },
    "split_keywords": [
        "parser",
        " film",
        " broadcast"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5e7e59eef3a46330d37516b7dd8c1cde5d79a84e7475b837dddd55f38ded7f7e",
                "md5": "658e02d38146f5e5e64bd082c7b2909d",
                "sha256": "ef775a440a4bca6846895208311be227da90da07278f48b6b09cbefb31dd4b47"
            },
            "downloads": -1,
            "filename": "pycmx-1.3.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "658e02d38146f5e5e64bd082c7b2909d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.8",
            "size": 11636,
            "upload_time": "2025-01-07T19:56:40",
            "upload_time_iso_8601": "2025-01-07T19:56:40.980402Z",
            "url": "https://files.pythonhosted.org/packages/5e/7e/59eef3a46330d37516b7dd8c1cde5d79a84e7475b837dddd55f38ded7f7e/pycmx-1.3.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f003833436fe65501e4bf261b406b1fda1b030ff0314eb7ede1796b01a02624e",
                "md5": "160377d0014d1c78c9f587ceac6f8773",
                "sha256": "74a407975577c9a2b65532102cc50c922edc3d583be20cc045f8f4959a7b4c03"
            },
            "downloads": -1,
            "filename": "pycmx-1.3.0.tar.gz",
            "has_sig": false,
            "md5_digest": "160377d0014d1c78c9f587ceac6f8773",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.8",
            "size": 9856,
            "upload_time": "2025-01-07T19:56:43",
            "upload_time_iso_8601": "2025-01-07T19:56:43.331372Z",
            "url": "https://files.pythonhosted.org/packages/f0/03/833436fe65501e4bf261b406b1fda1b030ff0314eb7ede1796b01a02624e/pycmx-1.3.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-01-07 19:56:43",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "iluvcapra",
    "github_project": "pycmx",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pycmx"
}
        
Elapsed time: 0.94011s