Content available in Bahasa Indonesia / Indonesian

Using this thread to track content available in Kolibri for Bahasa Indonesia / Indonesian speakers.

Available on the demo:

Services that are already imported, however their Indonesian content is not yet available to Kolibri:

Thanks for sharing this @balupton ! We have also been in contact with @Andrew_Little at Teacher in a Box, and their team recently finished creating a channel with the SIBI curriculum. It’s very thorough and we plan to make it publicly available in the Kolibri Library once it has gone through our internal QA, but in the meantime it’s accessible with the following token: rukit-jujas

1 Like

We’re also now deploying and publishing the updated Indonesian KA channel for inclusion in the Kolibri Library

Update: It’s now available for import with the token pufag-gakaf

1 Like

Thank you, that’s great news!

Importing this one failed:

/cc @richard

INFO 2025-03-04 21:09:25,013 kolibri.core.content.management.commands.importchannel Downloading data for channel id 59cf4846c9e058a5ba35d1824ad111b3
INFO 2025-03-04 21:09:26,291 kolibri.core.content.utils.channel_import Importing LocalFile data
INFO 2025-03-04 21:09:26,302 kolibri.core.content.utils.channel_import Importing Language data
INFO 2025-03-04 21:09:26,304 kolibri.core.content.utils.channel_import Importing ContentNode data
INFO 2025-03-04 21:09:26,546 kolibri.core.content.utils.channel_import Importing File data
INFO 2025-03-04 21:09:26,655 kolibri.core.content.utils.channel_import Importing ChannelMetadata data
INFO 2025-03-04 21:09:26,657 kolibri.core.content.utils.channel_import Importing AssessmentMetaData data
INFO 2025-03-04 21:09:26,668 kolibri.core.content.utils.channel_import Importing ContentNode_related data
INFO 2025-03-04 21:09:26,670 kolibri.core.content.utils.channel_import Importing ContentNode_has_prerequisite data
INFO 2025-03-04 21:09:26,671 kolibri.core.content.utils.channel_import Importing ContentTag data
INFO 2025-03-04 21:09:26,672 kolibri.core.content.utils.channel_import Importing ContentNode_tags data
INFO 2025-03-04 21:09:37,301 kolibri.core.content.utils.channel_import Channel 59cf4846c9e058a5ba35d1824ad111b3 successfully imported into the database
ERROR 2025-03-04 21:09:47,323 kolibri.core.content.utils.resource_import An error occurred during content import: Cannot calculate MD5: Not all chunks are complete
INFO 2025-03-04 21:09:47,712 kolibri.core.content.utils.annotation Setting availability to True of 2 LocalFile objects based on passed in checksums
INFO 2025-03-04 21:09:47,732 kolibri.core.content.utils.annotation Setting availability of non-topic ContentNode objects based on LocalFile availability in 1 batches of 10000
INFO 2025-03-04 21:09:47,817 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for 5 levels
INFO 2025-03-04 21:09:47,827 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for level 5
INFO 2025-03-04 21:09:47,832 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for level 4
INFO 2025-03-04 21:09:47,834 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for level 3
INFO 2025-03-04 21:09:47,835 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for level 2
INFO 2025-03-04 21:09:47,836 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for level 1
ERROR 2025-03-04 21:09:48,156 kolibri.core.tasks.job Job 66abeaf5188f4e1989ebc18d57bcc64f raised an exception: Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/kolibri/core/tasks/job.py", line 326, in execute
    result = func(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/core/tasks/registry.py", line 237, in __call__
    return self.func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/core/content/tasks.py", line 270, in remotecontentimport
    manager.run()
  File "/usr/lib/python3/dist-packages/kolibri/core/content/utils/resource_import.py", line 210, in run
    results = self.run_import()
              ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/core/content/utils/resource_import.py", line 332, in run_import
    raise self.exception
  File "/usr/lib/python3/dist-packages/kolibri/core/content/utils/resource_import.py", line 157, in _handle_future
    future.result()
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 449, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/core/content/utils/resource_import.py", line 128, in _start_file_transfer
    filetransfer.run()
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 691, in inner
    func(self, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 730, in run
    self.complete_close_and_finalize()
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 503, in complete_close_and_finalize
    self.finalize()
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 670, in finalize
    return super(FileDownload, self).finalize()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 572, in finalize
    self._verify_checksum()
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 549, in _verify_checksum
    if self.checksum and not self._checksum_correct():
                             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 684, in _checksum_correct
    return self.dest_file_obj.md5_checksum() == self.checksum
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 418, in md5_checksum
    raise ValueError("Cannot calculate MD5: Not all chunks are complete")
ValueError: Cannot calculate MD5: Not all chunks are complete

This one failed too:

INFO 2025-03-04 21:12:27,521 kolibri.core.content.management.commands.importchannel Downloading data for channel id 9eb397c01bd15c38afc1dd6044720caa
INFO 2025-03-04 21:12:29,059 kolibri.core.content.utils.channel_import Importing LocalFile data
INFO 2025-03-04 21:12:29,088 kolibri.core.content.utils.channel_import Importing Language data
INFO 2025-03-04 21:12:29,090 kolibri.core.content.utils.channel_import Importing ContentNode data
INFO 2025-03-04 21:12:29,473 kolibri.core.content.utils.channel_import Importing File data
INFO 2025-03-04 21:12:29,667 kolibri.core.content.utils.channel_import Importing ChannelMetadata data
INFO 2025-03-04 21:12:29,669 kolibri.core.content.utils.channel_import Importing AssessmentMetaData data
INFO 2025-03-04 21:12:29,671 kolibri.core.content.utils.channel_import Importing ContentNode_related data
INFO 2025-03-04 21:12:29,672 kolibri.core.content.utils.channel_import Importing ContentNode_has_prerequisite data
INFO 2025-03-04 21:12:29,673 kolibri.core.content.utils.channel_import Importing ContentTag data
INFO 2025-03-04 21:12:29,675 kolibri.core.content.utils.channel_import Importing ContentNode_tags data
INFO 2025-03-04 21:12:36,421 kolibri.core.content.utils.channel_import Channel 9eb397c01bd15c38afc1dd6044720caa successfully imported into the database
ERROR 2025-03-04 21:12:56,893 kolibri.core.content.utils.resource_import An error occurred during content import: Cannot calculate MD5: Not all chunks are complete
INFO 2025-03-04 21:12:57,282 kolibri.core.content.utils.annotation Setting availability of non-topic ContentNode objects based on LocalFile availability in 1 batches of 10000
INFO 2025-03-04 21:12:57,668 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for 4 levels
INFO 2025-03-04 21:12:57,703 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for level 4
INFO 2025-03-04 21:12:57,708 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for level 3
INFO 2025-03-04 21:12:57,710 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for level 2
INFO 2025-03-04 21:12:57,713 kolibri.core.content.utils.annotation Annotating ContentNode objects with children for level 1
ERROR 2025-03-04 21:12:58,224 kolibri.core.tasks.job Job f3088729e0fe4366b4104614f7da3364 raised an exception: Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/kolibri/core/tasks/job.py", line 326, in execute
    result = func(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/core/tasks/registry.py", line 237, in __call__
    return self.func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/core/content/tasks.py", line 270, in remotecontentimport
    manager.run()
  File "/usr/lib/python3/dist-packages/kolibri/core/content/utils/resource_import.py", line 210, in run
    results = self.run_import()
              ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/core/content/utils/resource_import.py", line 332, in run_import
    raise self.exception
  File "/usr/lib/python3/dist-packages/kolibri/core/content/utils/resource_import.py", line 157, in _handle_future
    future.result()
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 449, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3.11/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/core/content/utils/resource_import.py", line 128, in _start_file_transfer
    filetransfer.run()
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 691, in inner
    func(self, *args, **kwargs)
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 730, in run
    self.complete_close_and_finalize()
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 503, in complete_close_and_finalize
    self.finalize()
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 670, in finalize
    return super(FileDownload, self).finalize()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 572, in finalize
    self._verify_checksum()
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 549, in _verify_checksum
    if self.checksum and not self._checksum_correct():
                             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 684, in _checksum_correct
    return self.dest_file_obj.md5_checksum() == self.checksum
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/kolibri/utils/file_transfer.py", line 418, in md5_checksum
    raise ValueError("Cannot calculate MD5: Not all chunks are complete")
ValueError: Cannot calculate MD5: Not all chunks are complete

Hrm, it seems like attempting to simultaneously import channels on the Raspberry Pi is taxing the file system overly and causing write issues.

For now, if you could follow the instructions here to locate your options.ini file: Customize Kolibri settings with the options.ini file - Kolibri User Guide

and in that file uncomment or add this section and option values:

[Tasks]
# The number of workers to spin up for regular priority asynchronous tasks.
REGULAR_PRIORITY_WORKERS = 1

# The number of workers to spin up for high priority asynchronous tasks.
HIGH_PRIORITY_WORKERS = 1

This should reduce the number of simultaneous operations that Kolibri is trying to do, while still allowing you to queue up multiple imports at once to leave running.

Kind Regards,
Richard

(You will need to restart Kolibri before these take effect)

Cool, so applied. However, I did get an already started error, which is strange:

pi@kolibri:~/.kolibri $ kolibri stop
/usr/lib/python3/dist-packages/kolibri/dist/requests/__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.20) or chardet (5.1.0)/charset_normalizer (2.0.12) doesn't match a supported version!
  warnings.warn("urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "
INFO     2025-03-04 21:28:16,349 Option DEBUG in section [Server] being overridden by environment variable KOLIBRI_DEBUG
INFO     2025-03-04 21:28:16,355 Option DEBUG_LOG_DATABASE in section [Server] being overridden by environment variable KOLIBRI_DEBUG_LOG_DATABASE
INFO     2025-03-04 21:28:18,372 Kolibri server has successfully been stopped.
pi@kolibri:~/.kolibri $ vim options.ini
pi@kolibri:~/.kolibri $ kolibri start
/usr/lib/python3/dist-packages/kolibri/dist/requests/__init__.py:102: RequestsDependencyWarning: urllib3 (1.26.20) or chardet (5.1.0)/charset_normalizer (2.0.12) doesn't match a supported version!
  warnings.warn("urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported "
INFO     2025-03-04 21:29:38,799 Option DEBUG in section [Server] being overridden by environment variable KOLIBRI_DEBUG
INFO     2025-03-04 21:29:38,799 Option DEBUG_LOG_DATABASE in section [Server] being overridden by environment variable KOLIBRI_DEBUG_LOG_DATABASE
INFO     2025-03-04 21:29:40,445 Running Kolibri with the following settings: kolibri.deployment.default.settings.base
INFO     2025-03-04 21:29:40,902 Starting Kolibri 0.17.5
ERROR    2025-03-04 21:29:45,908 There is another Kolibri server running. Please use `kolibri stop` and try again.
pi@kolibri:~/.kolibri $ cat options.ini
[Paths]
CONTENT_DIR = /KOLIBRI_DATA/content
[Cache]
CACHE_BACKEND = redis
CACHE_REDIS_MAXMEMORY_POLICY = allkeys-lru
CACHE_REDIS_MAXMEMORY = 843930010
[Deployment]
HTTP_PORT = 80
ZIP_CONTENT_PORT = 81
[Database]
[Server]
[Urls]
[Python]
[Tasks]
REGULAR_PRIORITY_WORKERS = 1
HIGH_PRIORITY_WORKERS = 1
[Learn]

Accessing via the interface failed the prior imports (was surprised there wasn’t a retry button):

And after importing them again, they seem to be failing to start:

Ah, on a Raspberry Pi Kolibri is running as a system service, using the kolibri-server package: Debian/Ubuntu - Kolibri User Guide

So it may be simplest just to restart the device to restart the service.

Sweet, so sudo systemctl restart kolibri-server.service seems to have started the import.

Would be good if the kolibri bin detected if it is installed as a service, and adjusted accordingly.

(moving onto the second import now)