Asset nodes now have a new field called "properties.duration_seconds". This holds a copy of the duration stored on the referenced video file and stays in sync using eve hooks. To migrate existing duration times from files to nodes you need to run the following: ./manage.py maintenance reconcile_node_video_duration -ag There are 2 more maintenance commands to be used to determine if there are any missing durations in either files or nodes: find_video_files_without_duration find_video_nodes_without_duration FFProbe is now used to detect what duration a video file has. Reviewed by Sybren.
166 lines
5.1 KiB
Python
166 lines
5.1 KiB
Python
from datetime import timedelta
|
|
|
|
from bson import ObjectId
|
|
|
|
from abstract_cloud_test import AbstractCloudTest
|
|
from cloud.routes import get_random_featured_nodes
|
|
|
|
|
|
class RandomFeaturedNodeTest(AbstractCloudTest):
|
|
def setUp(self, **kwargs):
|
|
super().setUp(**kwargs)
|
|
|
|
self.pid, _ = self.ensure_project_exists()
|
|
self.file_id, _ = self.ensure_file_exists(file_overrides={
|
|
'variations': [
|
|
{'format': 'mp4',
|
|
'duration': 75 # 01:15
|
|
},
|
|
],
|
|
})
|
|
|
|
self.uid = self.create_user()
|
|
|
|
from pillar.api.utils import utcnow
|
|
self.fake_now = utcnow()
|
|
|
|
def test_random_feature_node_returns_3_nodes(self):
|
|
base_node = {
|
|
'name': 'Just a node name',
|
|
'project': self.pid,
|
|
'description': '',
|
|
'node_type': 'asset',
|
|
'user': self.uid,
|
|
}
|
|
base_props = {
|
|
'status': 'published',
|
|
'file': self.file_id,
|
|
'content_type': 'video',
|
|
'order': 0
|
|
}
|
|
|
|
def create_asset(weeks):
|
|
return self.create_node({
|
|
**base_node,
|
|
'_created': self.fake_now - timedelta(weeks=weeks),
|
|
'properties': base_props,
|
|
})
|
|
|
|
all_asset_ids = [create_asset(i) for i in range(20)]
|
|
|
|
with self.app.app_context():
|
|
proj_col = self.app.db('projects')
|
|
proj_col.update(
|
|
{'_id': self.pid},
|
|
{'$set': {
|
|
'nodes_featured': all_asset_ids,
|
|
}})
|
|
|
|
with self.app.test_request_context():
|
|
random_assets = get_random_featured_nodes()
|
|
actual_ids = [asset['_id'] for asset in random_assets]
|
|
|
|
self.assertIs(len(random_assets), 3)
|
|
for aid in actual_ids:
|
|
self.assertIn(ObjectId(aid), all_asset_ids)
|
|
|
|
def test_random_feature_ignore(self):
|
|
def assert_ignored():
|
|
with self.app.test_request_context():
|
|
random_assets = get_random_featured_nodes()
|
|
self.assertIs(len(random_assets), 0)
|
|
|
|
base_node = {
|
|
'name': 'Just a node name',
|
|
'project': self.pid,
|
|
'description': '',
|
|
'node_type': 'asset',
|
|
'user': self.uid,
|
|
}
|
|
base_props = {
|
|
'status': 'published',
|
|
'file': self.file_id,
|
|
'content_type': 'video',
|
|
'order': 0
|
|
}
|
|
|
|
node_id = self.create_node({
|
|
**base_node,
|
|
'_created': self.fake_now - timedelta(days=5),
|
|
'properties': base_props,
|
|
})
|
|
|
|
# Not featured, should be ignored
|
|
assert_ignored()
|
|
|
|
# Featured but project is private, should be ignored
|
|
with self.app.app_context():
|
|
proj_col = self.app.db('projects')
|
|
proj_col.update(
|
|
{'_id': self.pid},
|
|
{'$set': {
|
|
'nodes_featured': [node_id],
|
|
'is_private': True,
|
|
}})
|
|
assert_ignored()
|
|
|
|
# Featured but node is deleted, should be ignored
|
|
with self.app.app_context():
|
|
proj_col = self.app.db('projects')
|
|
proj_col.update(
|
|
{'_id': self.pid},
|
|
{'$set': {
|
|
'nodes_featured': [node_id],
|
|
'is_private': False,
|
|
}})
|
|
|
|
node_col = self.app.db('nodes')
|
|
node_col.update(
|
|
{'_id': node_id},
|
|
{'$set': {
|
|
'_deleted': True,
|
|
}})
|
|
assert_ignored()
|
|
|
|
def test_random_feature_node_data(self):
|
|
base_node = {
|
|
'name': 'Just a node name',
|
|
'project': self.pid,
|
|
'description': '',
|
|
'node_type': 'asset',
|
|
'user': self.uid,
|
|
}
|
|
base_props = {
|
|
'status': 'published',
|
|
'file': self.file_id,
|
|
'content_type': 'video',
|
|
'duration_seconds': 75,
|
|
'order': 0
|
|
}
|
|
|
|
node_id = self.create_node({
|
|
**base_node,
|
|
'_created': self.fake_now,
|
|
'properties': base_props,
|
|
})
|
|
|
|
with self.app.app_context():
|
|
proj_col = self.app.db('projects')
|
|
proj_col.update(
|
|
{'_id': self.pid},
|
|
{'$set': {
|
|
'nodes_featured': [node_id],
|
|
}})
|
|
|
|
with self.app.test_request_context():
|
|
random_assets = get_random_featured_nodes()
|
|
self.assertIs(len(random_assets), 1)
|
|
|
|
asset = random_assets[0]
|
|
self.assertEquals('Just a node name', asset['name'])
|
|
self.assertEquals('Unittest project', asset['project']['name'])
|
|
self.assertEquals('video', asset['properties']['content_type'])
|
|
self.assertTrue(asset.properties.content_type == 'video')
|
|
self.assertEquals(self.fake_now, asset['_created'])
|
|
self.assertEquals(str(node_id), asset['_id'])
|
|
self.assertEquals(75, asset['properties']['duration_seconds']) |