feat: add pytest configuration and implement tests for file and metadata extraction

This commit is contained in:
sHa
2025-12-25 03:42:47 +00:00
parent 305dd5f43e
commit 4e7cf94d58
9 changed files with 446 additions and 0 deletions

View File

@@ -9,6 +9,7 @@ dependencies = [
"textual>=6.11.0", "textual>=6.11.0",
"python-magic>=0.4.27", "python-magic>=0.4.27",
"pymediainfo>=6.0.0", "pymediainfo>=6.0.0",
"pytest>=7.0.0",
] ]
[project.scripts] [project.scripts]
@@ -16,3 +17,10 @@ renamer = "renamer.main:main"
[tool.uv] [tool.uv]
package = true package = true
[tool.pytest.ini_options]
addopts = "--strict-markers"
testpaths = ["renamer/test"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]

0
renamer/test/__init__.py Normal file
View File

15
renamer/test/conftest.py Normal file
View File

@@ -0,0 +1,15 @@
# conftest.py - pytest configuration
import os
import sys
# Force UTF-8 encoding for all I/O operations
os.environ['PYTHONIOENCODING'] = 'utf-8'
if hasattr(sys.stdout, 'reconfigure'):
sys.stdout.reconfigure(encoding='utf-8')
if hasattr(sys.stderr, 'reconfigure'):
sys.stderr.reconfigure(encoding='utf-8')
# Configure pytest to handle Unicode properly
def pytest_configure(config):
# Ensure UTF-8 encoding for test output
config.option.capture = 'no' # Don't capture output to avoid encoding issues

205
renamer/test/filenames.txt Normal file
View File

@@ -0,0 +1,205 @@
[01.1] Harry Potter and the Philosopher's Stone (2001) [Theatrical Cut] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv
[01.2] Harry Potter and the Sorcerer's Stone (2001) [Ultimate Extended Edition] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv
[02.1] Harry Potter and the Chamber of Secrets (2002) [Theatrical Cut] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv
[02.2] Harry Potter and the Chamber of Secrets (2002) [Ultimate Extended Edition] BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv
[03] Harry Potter and the Prisoner of Azkaban (2004) BDRip 1080p x265 [5xUKR_ENG] [Hurtom].mkv
[04] Harry Potter and the Goblet of Fire (2005) BDRip 1080p x265 [4xUKR_ENG] [Hurtom].mkv
[05] Harry Potter and the Order of the Phoenix (2007) BDRip 1080p x265 [3xUKR_ENG] [Hurtom].mkv
[06] Harry Potter and the Half-Blood Prince (2009) BDRip 1080p x265 [2xUKR_ENG] [Hurtom].mkv
[07] Harry Potter and the Deathly Hallows. Part 1 (2010) BDRip 1080p x265 [UKR_ENG] [Hurtom].mkv
[08] Harry Potter and the Deathly Hallows. Part 2 (2011) BDRip 1080p x265 [UKR_ENG] [Hurtom].mkv
12 стульев.(1971).[SD,rus].avi
A Mighty Heart.(2007).[SD,2ukr,eng].avi
An Ideal Husband (1999) [720p,ukr,eng].mkv
China Moon (1994) BDRip [SD,2ukr,eng].mkv
Cours Toujours (2010) [720p,und] [tmdbid-993291].mp4
Davolja Posla (1965) [SD,und] [tmdbid-665739].avi
Destiny (2012) [720p,und] [tmdbid-496051].mp4
Emma (1996) BDRip [720p,ukr,eng].mkv
I Come with the Rain.(2008).[720p,ukr].mkv
I Could Never Be Your Woman (2007) [SD,2ukr,eng].mkv
I Spy (2002) [720p,2ukr,eng].mkv
If I Stay (2014) [720p,ukr,eng].mkv
Il racconto dei racconti (Tale of Tales).(2015).[720p,ukr,eng].mkv
Imperium Nerone (2004) [SD,ukr].mkv
In Bruges (2008) [SD,ukr].mkv
Independence Day Resurgence.(2016).[720,ukr,eng].mkv
Inescapable (2012) [SD,ukr].mkv
Inside Llewyn Davis.(2013).[720p,ukr,eng].mkv
Into the Woods (2014) [720p,ukr,eng].mkv
Investigating Sex (2002) [SD,ukr].mkv
Jumper.(2008).[SD,ukr].mkv
Klątwa doliny węży (1988) [SD,rus].avi
Klątwa doliny węży (1988) DVDRip [SD,pol].mkv
Ladri di biciclette (1948).[720p,ukr].mp4
Larry Crowne.(2011).[720p,2ukr,eng].mkv
Le dernier chaperon rouge (1996) [SD,fre] [tmdbid-82143].mkv
Lets Be Cops.(2014).[720p,rus,ukr,4eng].mkv
Life After Beth.(2014).[720p,ukr,eng].mkv
Life Is a Miracle.(2004).[SD,ukr].avi
Life Is a Miracle.(2004).[SD,ukr].avi
Loosies.(2011).[SD,ukr,eng].avi
Love & Friendship.(2016).[720p,ukr,eng].mkv
Love Story.(1970).[SD,ukr,eng].mkv
Mac and Me.(1988).[720p,ukr,eng].mkv
Made of Honor.(2008).[SD,ukr].avi
Man on the Moon.(1999).[720p,ukr,eng].mkv
Martyrs.(2008).[720p,fre,sukr].mkv
Max Keeble's Big Move.(2001).[SD,ukr].avi
Me Before You.(2016).[720p,ukr,eng].mkv
Me, Myself & Irene.(2000).[720p,ukr,eng].mkv
Meet Dave.(2008).[SD,ukr].avi
Minority Report.(2002).[720p,ukr,eng].mkv
Misconduct (2016) BDRip [720p,ukr,eng].mkv
Mission to Mars.(2000).[720p,ukr,eng].mkv
Monster's Ball.(2001).[SD,eng].mkv
Mr. Nobody (2009) BDRip [SD,2ukr,eng].mkv
My Week with Marilyn.(2011).[720p,ukr,eng].mkv
Nathalie... (2003) [SD,ukr].mkv
New Year's Eve (2011) [720p,ukr,eng].mkv
Nightmare City 2035 (2008) [SD,ukr].mkv
Noah (2014) [720p,ukr,eng].mkv
Northmen - A Viking Saga (2014) [SD,ukr].mkv
One More Kiss (1999) DVDRip [SD,ukr].avi
Orbita 9 (2017) [SD,ukr,eng].mkv
Pay It Forward (2000) [SD,ukr].mkv
Pay It Forward (2000) [SD,ukr].mkv
Perfect Stranger (2007) [SD,ukr].mkv
Peter Pan (2003) [720p,ukr,eng].mkv
Prime (2005) [SD,ukr,eng].mkv
Prince of Persia. The Sands of Time (2010) [720p,ukr,eng].mkv
Prince Valiant (1997) [SD,ukr,eng].mkv
Raging Bull (1980) [720p,ukr,eng].mkv
Rebecca (2020) [720p,eng].mkv
Rekopis znaleziony w Saragossie (1965) WEB-DL [SD,ukr].mkv
River's Edge (1986) [SD,ukr,eng].mkv
Riverworld (2003) [480p,ukr,eng].mkv
Romeo Is Bleeding (1993) [SD,2ukr,eng].mkv
Ruthless People (1986) [720p,ukr,eng].mkv
Sahara (1983) [SD,ukr,eng].mkv
Savages (2012) [SD,ukr].mkv
Scoop (2024) WEB-DL [720p,ukr,eng].mkv
Se7en (1995) [720p,ukr,eng].mkv
See No Evil, Hear No Evil (1989) [720p,ukr,eng].mkv
Senseless (1998) [SD,ukr].mkv
Sex Tape (2014) [720p,ukr,eng].mkv
Shutter Island (2010) [720p,ukr,eng].mkv
St. Trinian's (2007) [720p,ukr,eng].mkv
The Black Hole (1979) BDRip [480p,ukr,eng].mkv
The Invention of Lying (2009) [720p,ukr,eng].mkv
The Island of Dr. Moreau.(1977).[720p,ukr].mp4
The Killing.(1956).[SD,ukr,eng].mkv
The Love Guru.(2008).[SD,ukr].avi
The Love Guru.(2008).[SD,ukr].avi
The Manchurian Candidate.(2004).[720p,ukr,eng].mkv
The Mortal Instruments. City of Bones.(2013).[720p,ukr,eng].mkv
The Mutant Chronicles.(2008).[SD,ukr,eng].mkv
The Name of the Rose (1986) [SD,3ukr,eng].mkv
The Number 23 (2007) [720p,ukr,eng].mkv
The People Under the Stairs (1991) [720p,ukr,eng].mkv
The Return (2024) WEB-DLRip [720p,ukr,eng].mkv
The Road to Wellville (1994) [SD,ukr,eng].mkv
The Ruins (2008) [SD,ukr].mkv
The Sound of Music (1965).[720p,ukr].mp4
The Square Peg (1958).[480p,ukr,eng].mkv
Un homme à la hauteur.(2016).[720p,ukr].mkv
Upgrade.(2018).[SD,eng].mkv
Автомобиль, скрипка и собака Клякса.(1974).[SD,rus].avi
Ах, Водевиль, Водевиль...(1979).[SD,rus].avi
Белеет парус одинокий.(1937).[SD,rus].avi
Белое солнце пустыни.(1969).[SD,rus].avi
Берегись автомобиля.(1966).[SD,rus].avi
Берегите женщин.(1981).[SD,rus].avi
Бриллиантовая рука.(1968).[720p,2rus].mkv
В бой идут одни «старики».(1973).[720p,rus].mkv
В моей смерти прошу винить Клаву К.(1979).[480p,rus].mkv
В тринадцатом часу ночи.(1969).[SD,rus].avi
Верные друзья.(1954).[SD,rus].avi
Веселые ребята.(1934).[SD,rus].avi
Взломщик.(1987).[SD,rus].avi
Вий.(1967).[SD,rus].avi
Высота.(1957).[SD,rus].avi
Гиперболоид инженера Гарина.(1965).[SD,rus].avi
Глинка.(1946).[SD,rus].avi
Гостья из будущего (1984) [SD,rus] [tmdbid-20894].mkv
Гроза.(1934).[SD,rus].avi
Гусарская баллада.(1962).[SD,rus].avi
Два капитана.(1955).[SD,rus].avi
Девушка с гитарой.(1958).[SD,rus].avi
Деловые люди (1962) [SD,rus] [tmdbid-92983].avi
Джентльмены удачи.(1971).[SD,rus].avi
Добро пожаловать, или Посторонним вход воспрещен.(1964).[SD,rus].avi
Доживем до понедельника.(1968).[SD,rus].avi
За двома зайцями.(1961).[SD,ukr,rus].mkv
За спичками.(1980).[SD,rus,fin].mkv
Завтра, третьего апреля.(1969).[SD,rus].avi
Зеленый фургон.(1959).[SD,rus].avi
Золотой ключик.(1939).[SD,rus].avi
Золотой телёнок.pt1.(1968).[SD,rus].avi
Золотой телёнок.pt2.(1968).[SD,rus].avi
Иван Васильевич меняет профессию.(1973).[SD,rus].avi
Игла.(1988).[SD,rus].mkv
Иди и смотри.(1985).[SD,rus].avi
Идиот.(1958).[SD,rus].avi
Илья Муромец.(1956).[SD,rus].avi
Интердевочка.(1989).[SD,rus].mkv
Кавказская пленница, или Новые приключения Шурика.(1966).[SD,rus].avi
Карнавальная ночь.(1956).[SD,rus].avi
Конек-Горбунок.(1941).[SD,rus].avi
Королева бензоколонки.(1962).[SD,rus].avi
Королевство кривых зеркал.(1963).[SD,rus].avi
Курьер.(1986).[720p,rus].mkv
Мария, Мирабела в транзистории.(1989).[SD,rus].mpg
Мастер и Маргарита.pt1.(1994).[LQ,rus].wmv
Мастер и Маргарита.pt2.(1994).[LQ,rus].wmv
Мастер и Маргарита.pt3.(1994).[LQ,rus].wmv
Мастер и Маргарита.pt4.(1994).[LQ,rus].wmv
Миллион в брачной корзине.(1985).[SD,rus].avi
Мольба.(1967).[SD,rus].avi
Моцарт и Сальери.(1962).[SD,rus].avi
Не могу сказать «прощай».(1982).[SD,rus].avi
Не может быть!.(1975).[SD,rus].mkv
Невероятные приключения итальянцев в России.(1973).[SD,rus].avi
Неподдающиеся.(1959).[SD,rus].avi
Новый Гулливер.(1935).[SD,rus].avi
Нормандия - Неман.(1960).[SD,rus].avi
Обнаженная в шляпе (1991) [480p,rus] [tmdbid-286638].mkv
Огонь, вода и ... медные трубы.(1967).[SD,rus].avi
Операция «Ы» и другие приключения Шурика.(1965).[SD,rus].avi
Остров ржавого генерала.(1988).[SD,rus].avi
Остров сокровищ (1971) [SD,rus] [tmdbid-135710].avi
По щучьему велению.(1938).[SD,rus].avi
Подземелье ведьм.(1990).[SD,rus].avi
Подкидыш.(1939).[SD,rus].avi
После дождичка в четверг.(1985).[SD,rus].avi
Приключения Тома Сойера и Гекльберри Финна.pt1.(1981).[SD,rus].avi
Приключения Тома Сойера и Гекльберри Финна.pt2.(1981).[SD,rus].avi
Приключения Тома Сойера и Гекльберри Финна.pt3.(1981).[SD,rus].avi
Приключения Хоббита.(1984).[SD,rus].avi
Приморский бульвар.pt1.(1988).[SD,rus].avi
Приморский бульвар.pt2.(1988).[SD,rus].avi
Принцесса на горошине.(1976).[SD,rus].avi
Республика ШКИД.(1966).[SD,rus].mkv
Самые быстрые в мире.(1985).[SD,rus].avi
Свадьба в Малиновке.(1967).[1080p,3rus].mkv
Свой среди чужих, чужой среди своих.(1974).[SD,rus].avi
Сказ про то, как царь Петр арапа женил.(1976).[SD,rus].avi
Сказка о потерянном времени.(1964).[SD,rus].avi
Собачье сердце (1988) [1080p,2rus] [tmdbid-43680].mkv
Совершенно серьезно.(1961).[SD,rus].avi
Соломенная шляпка.(1974).[SD,rus].avi
Спортлото-82.(1982).[SD,rus].avi
Сталкер.(1979).[SD,rus].avi
Тайна острова Бэк-Кап (1958) [SD,rus].mkv
Там на неведомых дорожках.(1982).[SD,rus].avi
Трактористы.(1939).[SD,rus].avi
Три плюс два (1963) [SD,rus].mkv
Три толстяка.(1966).[SD,rus].avi
Трудно быть Богом (1989) [SD,rus] [tmdbid-64508].avi
Трудно быть Богом (2014) WEB-DL [720p,rus].m4v
Трудно первые 100 лет.(1988).[SD,rus].avi
Чародеи.pt1.(1982).[SD,rus].avi
Чародеи.pt2.(1982).[SD,rus].avi
Человек с бульвара Капуцинов (1987) [1080p,rus] [tmdbid-45227].mkv
Человек-амфибия (1961) [SD,rus] [tmdbid-43685].avi
Чук и Гек (1953) [SD,rus] [tmdbid-148412].avi

View File

@@ -0,0 +1,35 @@
import pytest
from pathlib import Path
from renamer.extractors.fileinfo_extractor import FileInfoExtractor
class TestFileInfoExtractor:
@pytest.fixture
def test_file(self):
"""Use the filenames.txt file for testing"""
return Path(__file__).parent / "filenames.txt"
def test_extract_size(self, test_file):
"""Test extracting file size"""
size = FileInfoExtractor.extract_size(test_file)
assert isinstance(size, int)
assert size > 0
def test_extract_modification_time(self, test_file):
"""Test extracting modification time"""
mtime = FileInfoExtractor.extract_modification_time(test_file)
assert isinstance(mtime, float)
assert mtime > 0
def test_extract_file_name(self, test_file):
"""Test extracting file name"""
name = FileInfoExtractor.extract_file_name(test_file)
assert isinstance(name, str)
assert name == "filenames.txt"
def test_extract_file_path(self, test_file):
"""Test extracting file path"""
path = FileInfoExtractor.extract_file_path(test_file)
assert isinstance(path, str)
assert "filenames.txt" in path
assert str(test_file) == path

View File

@@ -0,0 +1,53 @@
import pytest
from pathlib import Path
from ..extractors.filename_extractor import FilenameExtractor
def load_test_filenames():
"""Load test filenames from filenames.txt"""
test_file = Path(__file__).parent / "filenames.txt"
if test_file.exists():
with open(test_file, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
return []
@pytest.mark.parametrize("filename", load_test_filenames())
def test_extract_title(filename):
"""Test title extraction from filename"""
file_path = Path(filename)
title = FilenameExtractor.extract_title(file_path)
# For now, just check it's not None and is string
assert isinstance(title, str) or title is None
@pytest.mark.parametrize("filename", load_test_filenames())
def test_extract_year(filename):
"""Test year extraction from filename"""
file_path = Path(filename)
year = FilenameExtractor.extract_year(file_path)
# Print filename and extracted year clearly
print(f"\nFilename: \033[1;36m{filename}\033[0m")
print(f"Extracted year: \033[1;32m{year}\033[0m")
# Year should be None or 4-digit string
if year:
assert len(year) == 4 and year.isdigit()
@pytest.mark.parametrize("filename", load_test_filenames())
def test_extract_source(filename):
"""Test source extraction from filename"""
file_path = Path(filename)
source = FilenameExtractor.extract_source(file_path)
# Source should be None or string
assert isinstance(source, str) or source is None
@pytest.mark.parametrize("filename", load_test_filenames())
def test_extract_resolution(filename):
"""Test resolution extraction from filename"""
file_path = Path(filename)
resolution = FilenameExtractor.extract_resolution(file_path)
# Resolution should be None or string like '2160p'
if resolution:
assert 'p' in resolution or 'i' in resolution

View File

@@ -0,0 +1,38 @@
import pytest
from pathlib import Path
from renamer.extractors.mediainfo_extractor import MediaInfoExtractor
class TestMediaInfoExtractor:
@pytest.fixture
def extractor(self):
return MediaInfoExtractor()
@pytest.fixture
def test_file(self):
"""Use the filenames.txt file for testing"""
return Path(__file__).parent / "filenames.txt"
def test_extract_resolution(self, extractor, test_file):
"""Test extracting resolution from media info"""
resolution = extractor.extract_resolution(test_file)
# Text files don't have video resolution
assert resolution is None
def test_extract_hdr(self, extractor, test_file):
"""Test extracting HDR info"""
hdr = extractor.extract_hdr(test_file)
# Text files don't have HDR
assert hdr is None
def test_extract_audio_langs(self, extractor, test_file):
"""Test extracting audio languages"""
langs = extractor.extract_audio_langs(test_file)
# Text files don't have audio tracks
assert langs == ''
def test_extract_video_dimensions(self, extractor, test_file):
"""Test extracting video dimensions"""
dims = extractor.extract_video_dimensions(test_file)
# Text files don't have video dimensions
assert dims is None

View File

@@ -0,0 +1,38 @@
import pytest
from pathlib import Path
from renamer.extractors.metadata_extractor import MetadataExtractor
class TestMetadataExtractor:
@pytest.fixture
def test_file(self):
"""Use the filenames.txt file for testing"""
return Path(__file__).parent / "filenames.txt"
def test_extract_title(self, test_file):
"""Test extracting title from metadata"""
title = MetadataExtractor.extract_title(test_file)
# Text files don't have metadata, so should be None
assert title is None
def test_extract_duration(self, test_file):
"""Test extracting duration from metadata"""
duration = MetadataExtractor.extract_duration(test_file)
# Text files don't have duration
assert duration is None
def test_extract_artist(self, test_file):
"""Test extracting artist from metadata"""
artist = MetadataExtractor.extract_artist(test_file)
# Text files don't have artist
assert artist is None
def test_extract_all_metadata(self, test_file):
"""Test extracting all metadata"""
metadata = MetadataExtractor.extract_all_metadata(test_file)
expected = {
'title': None,
'duration': None,
'artist': None
}
assert metadata == expected

54
uv.lock generated
View File

@@ -2,6 +2,24 @@ version = 1
revision = 3 revision = 3
requires-python = ">=3.11" requires-python = ">=3.11"
[[package]]
name = "colorama"
version = "0.4.6"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
]
[[package]]
name = "iniconfig"
version = "2.3.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" },
]
[[package]] [[package]]
name = "linkify-it-py" name = "linkify-it-py"
version = "2.0.3" version = "2.0.3"
@@ -61,6 +79,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b0/7a/620f945b96be1f6ee357d211d5bf74ab1b7fe72a9f1525aafbfe3aee6875/mutagen-1.47.0-py3-none-any.whl", hash = "sha256:edd96f50c5907a9539d8e5bba7245f62c9f520aef333d13392a79a4f70aca719", size = 194391, upload-time = "2023-09-03T16:33:29.955Z" }, { url = "https://files.pythonhosted.org/packages/b0/7a/620f945b96be1f6ee357d211d5bf74ab1b7fe72a9f1525aafbfe3aee6875/mutagen-1.47.0-py3-none-any.whl", hash = "sha256:edd96f50c5907a9539d8e5bba7245f62c9f520aef333d13392a79a4f70aca719", size = 194391, upload-time = "2023-09-03T16:33:29.955Z" },
] ]
[[package]]
name = "packaging"
version = "25.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" },
]
[[package]] [[package]]
name = "platformdirs" name = "platformdirs"
version = "4.5.1" version = "4.5.1"
@@ -70,6 +97,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" },
] ]
[[package]]
name = "pluggy"
version = "1.6.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
]
[[package]] [[package]]
name = "pygments" name = "pygments"
version = "2.19.2" version = "2.19.2"
@@ -92,6 +128,22 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/e7/26/9d50c2a330541bc36c0ea7ce29eeff5b0c35c2624139660df8bcfa9ae3ce/pymediainfo-7.0.1-py3-none-win_amd64.whl", hash = "sha256:13224fa7590e198763b8baf072e704ea81d334e71aa32a469091460e243893c7", size = 3271232, upload-time = "2025-02-12T15:07:13.672Z" }, { url = "https://files.pythonhosted.org/packages/e7/26/9d50c2a330541bc36c0ea7ce29eeff5b0c35c2624139660df8bcfa9ae3ce/pymediainfo-7.0.1-py3-none-win_amd64.whl", hash = "sha256:13224fa7590e198763b8baf072e704ea81d334e71aa32a469091460e243893c7", size = 3271232, upload-time = "2025-02-12T15:07:13.672Z" },
] ]
[[package]]
name = "pytest"
version = "9.0.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
{ name = "iniconfig" },
{ name = "packaging" },
{ name = "pluggy" },
{ name = "pygments" },
]
sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
]
[[package]] [[package]]
name = "python-magic" name = "python-magic"
version = "0.4.27" version = "0.4.27"
@@ -108,6 +160,7 @@ source = { editable = "." }
dependencies = [ dependencies = [
{ name = "mutagen" }, { name = "mutagen" },
{ name = "pymediainfo" }, { name = "pymediainfo" },
{ name = "pytest" },
{ name = "python-magic" }, { name = "python-magic" },
{ name = "textual" }, { name = "textual" },
] ]
@@ -116,6 +169,7 @@ dependencies = [
requires-dist = [ requires-dist = [
{ name = "mutagen", specifier = ">=1.47.0" }, { name = "mutagen", specifier = ">=1.47.0" },
{ name = "pymediainfo", specifier = ">=6.0.0" }, { name = "pymediainfo", specifier = ">=6.0.0" },
{ name = "pytest", specifier = ">=7.0.0" },
{ name = "python-magic", specifier = ">=0.4.27" }, { name = "python-magic", specifier = ">=0.4.27" },
{ name = "textual", specifier = ">=6.11.0" }, { name = "textual", specifier = ">=6.11.0" },
] ]