# CodecPy 📊

A professional Python library for processing and normalizing media codec strings to human-readable formats. CodecPy handles a wide range of audio and video codecs with comprehensive mapping and pattern recognition.
[](https://pypi.org/project/codecpy/)
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
[](https://github.com/psf/black)
## Features
- Normalize complex codec strings into human-readable formats
- Identify and classify audio, video, text, and image codecs
- Extract profile, level, and color information from codec strings
- Parse and create MIME types with codec parameters
- Determine codec compatibility with various container formats
- Suggest optimal containers for codec combinations
## Installation
```bash
pip install codecpy
```
## Quick Start
```python
from codecpy import CodecPy
# Basic codec normalization
codec_info = CodecPy.normalize_codec("avc1.640028")
print(f"Normalized codec: {codec_info.normalized}") # Output: Normalized codec: H264
# Process MIME type with codecs
mime_str = 'video/mp4; codecs="avc1.640028, mp4a.40.2"'
codec_stream = CodecPy.decode_codec_string("avc1.640028, mp4a.40.2")
print(f"Video codec: {codec_stream.video_codec}") # Output: Video codec: H264
print(f"Audio codec: {codec_stream.audio_codec}") # Output: Audio codec: AAC_LC
```
## Documentation
### Core Classes
- `CodecInfo`: Normalized codec information
- `ProfileInfo`: Codec profile and level details
- `ColorInfo`: Video color space information
- `CodecDetails`: Comprehensive codec details
- `ContainerInfo`: Container format information
- `CodecStreamInfo`: Multi-codec stream information
- `MimeTypeInfo`: MIME type parsing results
### Basic Usage
#### Normalize a Codec
```python
from codecpy import CodecPy
# Normalize a video codec
codec_info = CodecPy.normalize_codec("avc1.640028")
print(f"Original: {codec_info.original}")
print(f"Normalized: {codec_info.normalized}")
print(f"Type: {codec_info.type.to_string()}")
print(f"Technical ID: {codec_info.technical_id}")
print(f"Family: {codec_info.family}")
```
Output:
```
Original: avc1.640028
Normalized: H264
Type: video
Technical ID: avc1
Family: H264
```
#### Parse audio channels
```python
# Basic audio codec identification
aac_info = codex.normalize_codec("mp4a.40.2", "audio")
print(f"Codec: {aac_info.normalized}") # Outputs: "Codec: AAC_LC"
# Detailed audio codec information with channels
ac3_details = codex.get_audio_codec_details("ac-3", "A000", 48000, 16)
print(f"Audio: {ac3_details.normalized} {ac3_details.channels}") # Outputs: "Audio: AC3 5.1"
# Process from string representation
atmos_details = codex.get_audio_codec_details("ec-3", "15/JOC", 48000)
print(f"Format: {atmos_details.normalized} Atmos {atmos_details.channels}") # Outputs: "Format: EAC3 Atmos 16.0"
```
Output:
```
Codec: AAC_LC
Audio: AC3 5.1
Format: EAC3 Atmos 16.0
```
#### Get Detailed Codec Information
```python
# Get comprehensive codec details including profile information
details = CodecPy.get_codec_details("avc1.640028")
print(f"Codec: {details.normalized}")
if details.profiles and details.profiles.has_profile:
print(f"Profile: {details.profiles.profile}")
print(f"Level: {details.profiles.level}")
```
Output:
```
Codec: H264
Profile: High
Level: 4.0
```
#### Process Multiple Codecs in a Stream
```python
# Process a codec string with multiple codecs
codec_stream = CodecPy.decode_codec_string("avc1.640028, mp4a.40.2")
print(f"Has video: {codec_stream.has_video}")
print(f"Has audio: {codec_stream.has_audio}")
print(f"Video codec: {codec_stream.video_codec}")
print(f"Audio codec: {codec_stream.audio_codec}")
# Get individual codec details
for codec in codec_stream.codecs:
print(f"- {codec.type.to_string()}: {codec.normalized}")
```
Output:
```
Has video: True
Has audio: True
Video codec: H264
Audio codec: AAC_LC
- video: H264
- audio: AAC_LC
```
### MIME Type Handling
#### Parse a MIME Type
```python
from codecpy.mime import MimeTypeUtil
mime_str = 'video/mp4; codecs="avc1.640028, mp4a.40.2"'
mime_info = MimeTypeUtil.parse_mime_type(mime_str)
print(f"Full type: {mime_info.full_type}")
print(f"Main type: {mime_info.main_type}")
print(f"Sub type: {mime_info.sub_type}")
print(f"Codecs: {mime_info.codecs_parameter}")
```
Output:
```
Full type: video/mp4
Main type: video
Sub type: mp4
Codecs: ['avc1.640028', 'mp4a.40.2']
```
#### Process MIME Type with Codecs
```python
# Process MIME type with CodecPy
container, codecs = CodecPy.process_mime_type(mime_str)
print(f"Container: {container}")
for codec in codecs:
print(f"- {codec.type.to_string()}: {codec.normalized}")
```
Output:
```
Container: video/mp4
- video: H264
- audio: AAC_LC
```
#### Create MIME Type for Codec Combination
```python
# Create a MIME type string for a video/audio codec pair
mime_type = CodecPy.create_mime_type_for_codecs('mp4', 'avc1.640028', 'mp4a.40.2')
print(f"Generated MIME type: {mime_type}")
```
Output:
```
Generated MIME type: video/mp4; codecs="avc1, mp4a.40.2"
```
### Container Compatibility
#### Check Codec Compatibility
```python
# Check if a codec is compatible with a container
is_compatible = CodecPy.is_codec_compatible("avc1.640028", "mp4")
print(f"H.264 compatible with MP4: {is_compatible}")
is_compatible = CodecPy.is_codec_compatible("vp9", "mp4")
print(f"VP9 compatible with MP4: {is_compatible}")
```
Output:
```
H.264 compatible with MP4: True
VP9 compatible with MP4: True
```
#### Suggest Compatible Containers
```python
# Get container suggestions for codec combination
containers = CodecPy.suggest_container("h265", "aac")
print(f"Compatible containers for H.265 + AAC: {containers}")
```
Output:
```
Compatible containers for H.265 + AAC: ['mp4', 'mkv']
```
### Advanced Usage: Detailed Profile Information
```python
# Extract profile and level information from complex codec strings
test_codecs = [
"avc1.640028",
"hev1.1.6.L150.B0",
"vp9.2",
"mp4a.40.2",
"dts-hdma"
]
for codec in test_codecs:
result = CodecPy.get_codec_details(codec)
print(f"\nOriginal: {codec}")
print(f"Normalized: {result.normalized}")
print(f"Type: {result.type.to_string()}")
if result.profiles and result.profiles.has_profile:
print(f"Profile: {result.profiles.profile}")
if result.profiles.level:
print(f"Level: {result.profiles.level}")
```
Output:
```
Original: avc1.640028
Normalized: H264
Type: video
Profile: High
Level: 4.0
Original: hev1.1.6.L150.B0
Normalized: H265
Type: video
Profile: Profile 1
Tier: High
Level: 5.0
Original: vp9.2
Normalized: VP9_PROFILE_2
Type: video
Original: mp4a.40.2
Normalized: AAC_LC
Type: audio
Profile: AAC-LC
Original: dts-hdma
Normalized: DTS_HD_MA
Type: audio
Profile: HD Master Audio
```
## Batch Processing
```python
# Process multiple codec strings in one call
results = CodecPy.batch_process_codecs([
"avc1.640028",
"mp4a.40.2",
"vp9.2"
])
for result in results:
print(f"{result.original} → {result.normalized} ({result.type.to_string()})")
```
Output:
```
avc1.640028 → H264 (video)
mp4a.40.2 → AAC_LC (audio)
vp9.2 → VP9_PROFILE_2 (video)
```
## Debugging
Enable debug mode for detailed logging:
```python
codex = CodecPy(debug_mode=True)
# Now all operations will produce detailed logs
```
## Common Use Cases
### Media Player Development
```python
# Determine if a media file can be played based on codec support
video_codec = "avc1.640028"
audio_codec = "mp4a.40.2"
container = "mp4"
can_play_video = CodecPy.is_codec_compatible(video_codec, container)
can_play_audio = CodecPy.is_codec_compatible(audio_codec, container)
if can_play_video and can_play_audio:
print("Media file can be played")
else:
print("Unsupported format")
```
### Streaming Media Server
```python
# Generate compatible MIME types for adaptive streaming manifests
video_codec = "avc1.640028"
audio_codec = "mp4a.40.2"
mime_type = CodecPy.create_mime_type_for_codecs('mp4', video_codec, audio_codec)
print(f"DASH/HLS MIME type: {mime_type}")
```
### Media Analytics
```python
# Parse codec information from media files for analytics
media_files = [
"video1.mp4;avc1.640028,mp4a.40.2",
"video2.webm;vp9,opus",
"audio1.m4a;mp4a.40.2"
]
for file_info in media_files:
container, codec_str = file_info.split(';')
ext = container.split('.')[-1]
codec_stream = CodecPy.decode_codec_string(codec_str)
print(f"\nAnalyzing: {container}")
print(f"Container: {CodecPy.identify_container(ext).format}")
if codec_stream.has_video:
print(f"Video codec: {codec_stream.video_codec}")
if codec_stream.has_audio:
print(f"Audio codec: {codec_stream.audio_codec}")
```
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add some amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request
## License
This project is licensed under the MIT License - see the LICENSE file for details.
## Acknowledgements
- [FFmpeg](https://ffmpeg.org/) - For reference codec implementation details
- [W3C Media Source Extensions](https://w3c.github.io/media-source/) - For codec string format specifications
---
Made with ❤️ for media developers
Raw data
{
"_id": null,
"home_page": "https://github.com/ReiDoBrega/codecpy",
"name": "codecpy",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "codec, media, video, audio, format, container, mime-type, h264, h265, aac, mp4, webm, matroska, mkv, hls, dash",
"author": "ReiDoBrega",
"author_email": "pedro94782079@gmail.com",
"download_url": null,
"platform": null,
"description": "# CodecPy \ud83d\udcca\r\n\r\n\r\n\r\nA professional Python library for processing and normalizing media codec strings to human-readable formats. CodecPy handles a wide range of audio and video codecs with comprehensive mapping and pattern recognition.\r\n\r\n[](https://pypi.org/project/codecpy/)\r\n[](https://www.python.org/downloads/)\r\n[](https://opensource.org/licenses/MIT)\r\n[](https://github.com/psf/black)\r\n\r\n## Features\r\n\r\n- Normalize complex codec strings into human-readable formats\r\n- Identify and classify audio, video, text, and image codecs\r\n- Extract profile, level, and color information from codec strings\r\n- Parse and create MIME types with codec parameters\r\n- Determine codec compatibility with various container formats\r\n- Suggest optimal containers for codec combinations\r\n\r\n## Installation\r\n\r\n```bash\r\npip install codecpy\r\n```\r\n\r\n## Quick Start\r\n\r\n```python\r\nfrom codecpy import CodecPy\r\n\r\n# Basic codec normalization\r\ncodec_info = CodecPy.normalize_codec(\"avc1.640028\")\r\nprint(f\"Normalized codec: {codec_info.normalized}\") # Output: Normalized codec: H264\r\n\r\n# Process MIME type with codecs\r\nmime_str = 'video/mp4; codecs=\"avc1.640028, mp4a.40.2\"'\r\ncodec_stream = CodecPy.decode_codec_string(\"avc1.640028, mp4a.40.2\")\r\nprint(f\"Video codec: {codec_stream.video_codec}\") # Output: Video codec: H264\r\nprint(f\"Audio codec: {codec_stream.audio_codec}\") # Output: Audio codec: AAC_LC\r\n```\r\n\r\n## Documentation\r\n\r\n### Core Classes\r\n\r\n- `CodecInfo`: Normalized codec information\r\n- `ProfileInfo`: Codec profile and level details\r\n- `ColorInfo`: Video color space information\r\n- `CodecDetails`: Comprehensive codec details\r\n- `ContainerInfo`: Container format information\r\n- `CodecStreamInfo`: Multi-codec stream information\r\n- `MimeTypeInfo`: MIME type parsing results\r\n\r\n### Basic Usage\r\n\r\n#### Normalize a Codec\r\n\r\n```python\r\nfrom codecpy import CodecPy\r\n\r\n# Normalize a video codec\r\ncodec_info = CodecPy.normalize_codec(\"avc1.640028\")\r\nprint(f\"Original: {codec_info.original}\")\r\nprint(f\"Normalized: {codec_info.normalized}\")\r\nprint(f\"Type: {codec_info.type.to_string()}\")\r\nprint(f\"Technical ID: {codec_info.technical_id}\")\r\nprint(f\"Family: {codec_info.family}\")\r\n```\r\n\r\nOutput:\r\n```\r\nOriginal: avc1.640028\r\nNormalized: H264\r\nType: video\r\nTechnical ID: avc1\r\nFamily: H264\r\n```\r\n\r\n#### Parse audio channels \r\n\r\n```python\r\n# Basic audio codec identification\r\naac_info = codex.normalize_codec(\"mp4a.40.2\", \"audio\")\r\nprint(f\"Codec: {aac_info.normalized}\") # Outputs: \"Codec: AAC_LC\"\r\n\r\n# Detailed audio codec information with channels\r\nac3_details = codex.get_audio_codec_details(\"ac-3\", \"A000\", 48000, 16)\r\nprint(f\"Audio: {ac3_details.normalized} {ac3_details.channels}\") # Outputs: \"Audio: AC3 5.1\"\r\n\r\n# Process from string representation\r\natmos_details = codex.get_audio_codec_details(\"ec-3\", \"15/JOC\", 48000)\r\nprint(f\"Format: {atmos_details.normalized} Atmos {atmos_details.channels}\") # Outputs: \"Format: EAC3 Atmos 16.0\"\r\n\r\n```\r\n\r\nOutput:\r\n```\r\nCodec: AAC_LC\r\nAudio: AC3 5.1\r\nFormat: EAC3 Atmos 16.0\r\n```\r\n\r\n#### Get Detailed Codec Information\r\n\r\n```python\r\n# Get comprehensive codec details including profile information\r\ndetails = CodecPy.get_codec_details(\"avc1.640028\")\r\nprint(f\"Codec: {details.normalized}\")\r\nif details.profiles and details.profiles.has_profile:\r\n print(f\"Profile: {details.profiles.profile}\")\r\n print(f\"Level: {details.profiles.level}\")\r\n```\r\n\r\nOutput:\r\n```\r\nCodec: H264\r\nProfile: High\r\nLevel: 4.0\r\n```\r\n\r\n#### Process Multiple Codecs in a Stream\r\n\r\n```python\r\n# Process a codec string with multiple codecs\r\ncodec_stream = CodecPy.decode_codec_string(\"avc1.640028, mp4a.40.2\")\r\nprint(f\"Has video: {codec_stream.has_video}\")\r\nprint(f\"Has audio: {codec_stream.has_audio}\")\r\nprint(f\"Video codec: {codec_stream.video_codec}\")\r\nprint(f\"Audio codec: {codec_stream.audio_codec}\")\r\n\r\n# Get individual codec details\r\nfor codec in codec_stream.codecs:\r\n print(f\"- {codec.type.to_string()}: {codec.normalized}\")\r\n```\r\n\r\nOutput:\r\n```\r\nHas video: True\r\nHas audio: True\r\nVideo codec: H264\r\nAudio codec: AAC_LC\r\n- video: H264\r\n- audio: AAC_LC\r\n```\r\n\r\n### MIME Type Handling\r\n\r\n#### Parse a MIME Type\r\n\r\n```python\r\nfrom codecpy.mime import MimeTypeUtil\r\n\r\nmime_str = 'video/mp4; codecs=\"avc1.640028, mp4a.40.2\"'\r\nmime_info = MimeTypeUtil.parse_mime_type(mime_str)\r\n\r\nprint(f\"Full type: {mime_info.full_type}\")\r\nprint(f\"Main type: {mime_info.main_type}\")\r\nprint(f\"Sub type: {mime_info.sub_type}\")\r\nprint(f\"Codecs: {mime_info.codecs_parameter}\")\r\n```\r\n\r\nOutput:\r\n```\r\nFull type: video/mp4\r\nMain type: video\r\nSub type: mp4\r\nCodecs: ['avc1.640028', 'mp4a.40.2']\r\n```\r\n\r\n#### Process MIME Type with Codecs\r\n\r\n```python\r\n# Process MIME type with CodecPy\r\ncontainer, codecs = CodecPy.process_mime_type(mime_str)\r\nprint(f\"Container: {container}\")\r\nfor codec in codecs:\r\n print(f\"- {codec.type.to_string()}: {codec.normalized}\")\r\n```\r\n\r\nOutput:\r\n```\r\nContainer: video/mp4\r\n- video: H264\r\n- audio: AAC_LC\r\n```\r\n\r\n#### Create MIME Type for Codec Combination\r\n\r\n```python\r\n# Create a MIME type string for a video/audio codec pair\r\nmime_type = CodecPy.create_mime_type_for_codecs('mp4', 'avc1.640028', 'mp4a.40.2')\r\nprint(f\"Generated MIME type: {mime_type}\")\r\n```\r\n\r\nOutput:\r\n```\r\nGenerated MIME type: video/mp4; codecs=\"avc1, mp4a.40.2\"\r\n```\r\n\r\n### Container Compatibility\r\n\r\n#### Check Codec Compatibility\r\n\r\n```python\r\n# Check if a codec is compatible with a container\r\nis_compatible = CodecPy.is_codec_compatible(\"avc1.640028\", \"mp4\")\r\nprint(f\"H.264 compatible with MP4: {is_compatible}\")\r\n\r\nis_compatible = CodecPy.is_codec_compatible(\"vp9\", \"mp4\")\r\nprint(f\"VP9 compatible with MP4: {is_compatible}\")\r\n```\r\n\r\nOutput:\r\n```\r\nH.264 compatible with MP4: True\r\nVP9 compatible with MP4: True\r\n```\r\n\r\n#### Suggest Compatible Containers\r\n\r\n```python\r\n# Get container suggestions for codec combination\r\ncontainers = CodecPy.suggest_container(\"h265\", \"aac\")\r\nprint(f\"Compatible containers for H.265 + AAC: {containers}\")\r\n```\r\n\r\nOutput:\r\n```\r\nCompatible containers for H.265 + AAC: ['mp4', 'mkv']\r\n```\r\n\r\n### Advanced Usage: Detailed Profile Information\r\n\r\n```python\r\n# Extract profile and level information from complex codec strings\r\ntest_codecs = [\r\n \"avc1.640028\",\r\n \"hev1.1.6.L150.B0\",\r\n \"vp9.2\",\r\n \"mp4a.40.2\",\r\n \"dts-hdma\"\r\n]\r\n\r\nfor codec in test_codecs:\r\n result = CodecPy.get_codec_details(codec)\r\n print(f\"\\nOriginal: {codec}\")\r\n print(f\"Normalized: {result.normalized}\")\r\n print(f\"Type: {result.type.to_string()}\")\r\n if result.profiles and result.profiles.has_profile:\r\n print(f\"Profile: {result.profiles.profile}\")\r\n if result.profiles.level:\r\n print(f\"Level: {result.profiles.level}\")\r\n```\r\n\r\nOutput:\r\n```\r\nOriginal: avc1.640028\r\nNormalized: H264\r\nType: video\r\nProfile: High\r\nLevel: 4.0\r\n\r\nOriginal: hev1.1.6.L150.B0\r\nNormalized: H265\r\nType: video\r\nProfile: Profile 1\r\nTier: High\r\nLevel: 5.0\r\n\r\nOriginal: vp9.2\r\nNormalized: VP9_PROFILE_2\r\nType: video\r\n\r\nOriginal: mp4a.40.2\r\nNormalized: AAC_LC\r\nType: audio\r\nProfile: AAC-LC\r\n\r\nOriginal: dts-hdma\r\nNormalized: DTS_HD_MA\r\nType: audio\r\nProfile: HD Master Audio\r\n```\r\n\r\n## Batch Processing\r\n\r\n```python\r\n# Process multiple codec strings in one call\r\nresults = CodecPy.batch_process_codecs([\r\n \"avc1.640028\",\r\n \"mp4a.40.2\",\r\n \"vp9.2\"\r\n])\r\n\r\nfor result in results:\r\n print(f\"{result.original} \u2192 {result.normalized} ({result.type.to_string()})\")\r\n```\r\n\r\nOutput:\r\n```\r\navc1.640028 \u2192 H264 (video)\r\nmp4a.40.2 \u2192 AAC_LC (audio)\r\nvp9.2 \u2192 VP9_PROFILE_2 (video)\r\n```\r\n\r\n## Debugging\r\n\r\nEnable debug mode for detailed logging:\r\n\r\n```python\r\ncodex = CodecPy(debug_mode=True)\r\n# Now all operations will produce detailed logs\r\n```\r\n\r\n## Common Use Cases\r\n\r\n### Media Player Development\r\n\r\n```python\r\n# Determine if a media file can be played based on codec support\r\nvideo_codec = \"avc1.640028\"\r\naudio_codec = \"mp4a.40.2\"\r\ncontainer = \"mp4\"\r\n\r\ncan_play_video = CodecPy.is_codec_compatible(video_codec, container)\r\ncan_play_audio = CodecPy.is_codec_compatible(audio_codec, container)\r\n\r\nif can_play_video and can_play_audio:\r\n print(\"Media file can be played\")\r\nelse:\r\n print(\"Unsupported format\")\r\n```\r\n\r\n### Streaming Media Server\r\n\r\n```python\r\n# Generate compatible MIME types for adaptive streaming manifests\r\nvideo_codec = \"avc1.640028\"\r\naudio_codec = \"mp4a.40.2\"\r\n\r\nmime_type = CodecPy.create_mime_type_for_codecs('mp4', video_codec, audio_codec)\r\nprint(f\"DASH/HLS MIME type: {mime_type}\")\r\n```\r\n\r\n### Media Analytics\r\n\r\n```python\r\n# Parse codec information from media files for analytics\r\nmedia_files = [\r\n \"video1.mp4;avc1.640028,mp4a.40.2\",\r\n \"video2.webm;vp9,opus\",\r\n \"audio1.m4a;mp4a.40.2\"\r\n]\r\n\r\nfor file_info in media_files:\r\n container, codec_str = file_info.split(';')\r\n ext = container.split('.')[-1]\r\n codec_stream = CodecPy.decode_codec_string(codec_str)\r\n \r\n print(f\"\\nAnalyzing: {container}\")\r\n print(f\"Container: {CodecPy.identify_container(ext).format}\")\r\n \r\n if codec_stream.has_video:\r\n print(f\"Video codec: {codec_stream.video_codec}\")\r\n if codec_stream.has_audio:\r\n print(f\"Audio codec: {codec_stream.audio_codec}\")\r\n```\r\n\r\n## Contributing\r\n\r\nContributions are welcome! Please feel free to submit a Pull Request.\r\n\r\n1. Fork the repository\r\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\r\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\r\n4. Push to the branch (`git push origin feature/amazing-feature`)\r\n5. Open a Pull Request\r\n\r\n## License\r\n\r\nThis project is licensed under the MIT License - see the LICENSE file for details.\r\n\r\n## Acknowledgements\r\n\r\n- [FFmpeg](https://ffmpeg.org/) - For reference codec implementation details\r\n- [W3C Media Source Extensions](https://w3c.github.io/media-source/) - For codec string format specifications\r\n\r\n---\r\n\r\nMade with \u2764\ufe0f for media developers\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A comprehensive Python library for codec identification, normalization and media format analysis",
"version": "0.1.1",
"project_urls": {
"Bug Tracker": "https://github.com/ReiDoBrega/codecpy/issues",
"Homepage": "https://github.com/ReiDoBrega/codecpy",
"Repository": "https://github.com/ReiDoBrega/codecpy"
},
"split_keywords": [
"codec",
" media",
" video",
" audio",
" format",
" container",
" mime-type",
" h264",
" h265",
" aac",
" mp4",
" webm",
" matroska",
" mkv",
" hls",
" dash"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "3cc8518608c4589bd52dbb942010fe5a652a6dbcc59fdb956f8288cf73daf8ef",
"md5": "9b9fc0bbc6cf30df5accf15285274685",
"sha256": "e5bc3c562cc67db97fe7743b265c8f4e8d1c50ecd5f2d701d1d52ae8211bd25e"
},
"downloads": -1,
"filename": "codecpy-0.1.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9b9fc0bbc6cf30df5accf15285274685",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 16087,
"upload_time": "2025-02-20T02:09:27",
"upload_time_iso_8601": "2025-02-20T02:09:27.548608Z",
"url": "https://files.pythonhosted.org/packages/3c/c8/518608c4589bd52dbb942010fe5a652a6dbcc59fdb956f8288cf73daf8ef/codecpy-0.1.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-02-20 02:09:27",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ReiDoBrega",
"github_project": "codecpy",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "codecpy"
}