Linux - SoftwareThis forum is for Software issues.
Having a problem installing a new program? Want to know which application is best for the job? Post your question in this forum.
Notices
Welcome to LinuxQuestions.org, a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free. Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
If you have any problems with the registration process or your account login, please contact us. If you need to reset your password, click here.
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
Get a virtual cloud desktop with the Linux distro that you want in less than five minutes with Shells! With over 10 pre-installed distros to choose from, the worry-free installation life is here! Whether you are a digital nomad or just looking for flexibility, Shells can put your Linux machine on the device that you want to use.
Exclusive for LQ members, get up to 45% off per month. Click here for more info.
Hi,
On a new Linux install "Mint 20.1", a old python music converter script that always worked, and also the software "Flacon" (which does about the same work), both act the same. The don't run onto a file unless it is in my /home directory.
With the python script "gcue2track.py" the script hangs at the end of the last files of the album unless that file is in the /home directory.
And "Flacon" does not let me import any files that is not in the /home directory.
I don't see any problem with mount or permission with any other software or script.
All my music is on a different hd.
On the screenshot, you can see on the left, my / directory and on the right "Flacon" does not give me the option of /media or /mnt.
Im puzzled.
Thank You for your help.
With the python script "gcue2track.py" the script hangs at the end of the last files of the album unless that file is in the /home directory.
And "Flacon" does not let me import any files that is not in the /home directory.
Not sure if it ever worked, or if this was always a problem. So that's my first question.
Wouldn't there be a way to enable debug during the py script to be able to see where it hangs? Or at least output sequentially each step to verify that they occurred? Like when you invoke a bash shell script using debug so that you can see more verbose output? Also you could echo in the py script who/what user it thinks it is and what group that user is a member of.
would be nice to see those old scripts. probably it is related to the version change of python, or probably something else. Who knows?
Here is the gCue2tracks.py script, it works if the files it is working on are in my /home but it hangs if they are on another drive...
At first it did not worked at all until i installed python-gtk2.
Second part of the script is on the next post (the forum does not allow more than 30000 characters)
Code:
#!/usr/bin/python
#-*- coding: utf-8 -*-
import gtk
import threading
import subprocess
from string import find
import time
import sys
import gettext
import locale
import pango
import getopt
import gobject
import urllib
import re
from config import *
from decoder import *
import preference as preference
VERSION = '0.5.2'
def get_file_path_from_dnd_dropped_uri(uri):
path = urllib.url2pathname(uri) # escape special chars
path = path.strip('\r\n\x00') # remove \r\n and NULL
# get the path to file
if path.startswith('file://'): # nautilus, rox
path = path[7:]
elif path.startswith('file:'): # xffm
path = path[5:]
return path
def on_mainWindow_drag_data_received(
widget, drag_context, x, y, selection_data, target_type, time):
if target_type == 0:
uri = selection_data.data.strip()
uri_splitted = uri.split()
thread = None
for uri in uri_splitted:
path = get_file_path_from_dnd_dropped_uri(uri)
if os.path.isdir(path): # is it dir?
thread = Searching_cue(thread=thread, folder_cue=path)
thread.start()
else:
if path.endswith('.cue'):
builder.get_object('filename').set_text(path)
gui.bloc = True
gui.getcuetag(path)
gui.add_task(widget)
gui.bloc = False
def treeview_setup_dnd(treeview):
"""Setup a treeview to move rows using drag and drop. """
target_entries = [('MY_TREE_MODEL_ROW', gtk.TARGET_SAME_WIDGET, 0),
('text/plain', 0, 1),
('TEXT', 0, 2),
('STRING', 0, 3), ]
treeview.enable_model_drag_source(
gtk.gdk.BUTTON1_MASK, target_entries, gtk.gdk.ACTION_MOVE)
treeview.enable_model_drag_dest(target_entries, gtk.gdk.ACTION_MOVE)
treeview.connect('drag-data-received', drag_data_received_data)
treeview.connect('drag_data_get', drag_data_get_data)
treeview.connect('cursor-changed', on_selection_changed)
def drag_data_get_data(treeview, context, selection, target_id, etime):
treeselection = treeview.get_selection()
def drag_data_received_data(treeview, context, x, y, selection, info, etime):
model_to_copy, iter_to_copy = treeview.get_selection().get_selected_rows()
model = treeview.get_model()
drop_info = treeview.get_dest_row_at_pos(x, y)
if drop_info:
path, position = drop_info
iter = model.get_iter(path)
if model.iter_depth(iter)is not 0:
return
if (position == gtk.TREE_VIEW_DROP_BEFORE
or position == gtk.TREE_VIEW_DROP_INTO_OR_BEFORE):
model_to_copy.move_before(model.get_iter(iter_to_copy[0]), iter)
else:
model_to_copy.move_after(model.get_iter(iter_to_copy[0]), iter)
else:
model_to_copy.move_after(model.get_iter(iter_to_copy[0]),
model.get_iter(len(model)-1))
for n in range(len(model)):
model[n][0] = n + 1
def on_selection_changed(treeview):
cursor_position = treeview.get_cursor()[0]
if not cursor_position:
return
'''restore parametrs if cursor changes'''
try:
a = gui.bloc
except:
return
gui.bloc = True
dic = treeview.get_model()[cursor_position[0]][5]
widget = [
'quality', 'album', 'date', 'genre', 'composer',
'bin_file', 'filename', 'performer']
map(lambda x: builder.get_object(x).set_text(dic[x]), widget)
var = [
'bitratebtn', 'VBR',
'same_folder', 'qualitybtn']
map(lambda x: builder.get_object(x).set_active(dic[x]), var)
builder.get_object('level').set_active(dic['level_n'])
builder.get_object('codec').set_active(dic['codec_n'])
builder.get_object('bitrate').set_value(float(dic['bitrate']))
builder.get_object('savefolder').set_text(dic['folder'])
gui.bloc = a
if len(cursor_position) > 1:
gui.renderer.set_property('editable', True)
else:
gui.renderer.set_property('editable', False)
#if treeview.get_cursor()[1] is treeview.get_column(0):
#if treeview.row_expanded(cursor_position):
#treeview.collapse_row(cursor_position)
#else:
#treeview.expand_to_path(cursor_position)
def notebook(widget, a, b):
gobject.timeout_add(60, lambda: builder.get_object('start').grab_focus())
def changeg(widget):
builder.get_object('VBR').set_sensitive(
builder.get_object('bitratebtn').get_active())
builder.get_object('bitrate').set_sensitive(
builder.get_object('bitratebtn').get_active())
builder.get_object('quality').set_sensitive(
builder.get_object('qualitybtn').get_active())
codecn = builder.get_object('codec').get_active_text()
if codecn not in ['mp3', 'ogg']:
builder.get_object('VBR').set_sensitive(False)
builder.get_object('bitrate').set_sensitive(False)
builder.get_object('quality').set_sensitive(False)
return
if codecn == 'mp3' and get('mp3advance'):
builder.get_object('VBR').set_sensitive(True)
builder.get_object('bitrate').set_sensitive(True)
builder.get_object('quality').set_sensitive(True)
if codecn == 'ogg':
builder.get_object('bitrate').set_range(32, 500)
else:
builder.get_object('bitrate').set_range(32, 320)
def show_log(widget):
show = builder.get_object('show_log').get_active()
builder.get_object('log').set_property('visible', show)
builder.get_object('mainWindow').resize(1, 1)
set('show_log', show)
def job_down(widget):
cursor_position = gui.treeview.get_cursor()[0][0]
if cursor_position == len(gui.tree_store) - 1:
return
iter = gui.tree_store.get_iter(cursor_position)
gui.tree_store.move_after(iter,
gui.tree_store.get_iter(cursor_position + 1))
for n in range(len(gui.tree_store)):
gui.tree_store[n][0] = n + 1
def job_up(widget):
cursor_position = gui.treeview.get_cursor()[0][0]
if cursor_position == 0:
return
iter = gui.tree_store.get_iter(cursor_position)
gui.tree_store.move_before(iter,
gui.tree_store.get_iter(cursor_position - 1))
for n in range(len(gui.tree_store)):
gui.tree_store[n][0] = n + 1
def isutf(line):
if get('convert_cue'):
try:
s = line.decode('utf-8')
except:
try:
line = line.decode(get('codepage'))
except:
message = _('Bad codepage')
print message
try:
print_log(message, False)
dialog = gtk.MessageDialog(parent=None,
flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_WARNING,
buttons=gtk.BUTTONS_OK)
dialog.set_markup(message)
if len(threading.enumerate()) > 1:
return ''
response = dialog.run()
dialog.destroy()
except:
pass
line = ' '
return line
class Searching_cue(threading.Thread):
def __init__(self, thread=None, folder_cue=None):
threading.Thread.__init__(self)
self.thread = thread
self.folder_cue = folder_cue
def run(self):
if self.thread:
self.thread.join()
self.bloc = True
builder.get_object('find_cue').set_sensitive(False)
treeview = builder.get_object('job queue')
tree_store = treeview.get_model()
if self.folder_cue:
folder_cue = self.folder_cue
else:
folder_cue = builder.get_object('find_cue_folder').get_text()
set('find_cue_folder', folder_cue)
if not os.path.isdir(folder_cue):
return
quality = builder.get_object('quality').get_text()
bitrate = str(int(builder.get_object('bitrate').get_value()))
level = builder.get_object('level').get_active_text()
level_n = builder.get_object('level').get_active()
bitratebtn = builder.get_object('bitratebtn').get_active()
qualitybtn = builder.get_object('qualitybtn').get_active()
VBR = builder.get_object('VBR').get_active()
codec = builder.get_object('codec').get_active_text()
codec_n = builder.get_object('codec').get_active()
folder = builder.get_object('savefolder').get_text()
same_folder = builder.get_object('same_folder').get_active()
prog = re.compile(r'".+"')
for root, dirs, files in os.walk(folder_cue):
for name in files:
if name.endswith('cue'):
filename = os.path.join(root, name)
GuiPart.folder = root
if builder.get_object('same_folder').get_active():
folder = root
'''get tag from cue file'''
dic = {
'performer': '', 'album': '', 'date': '', 'genre': '', 'composer': '',
'bitrate': bitrate, 'quality': quality, 'filename': filename,
'level': level, 'level_n': level_n, 'VBR': VBR, 'codec': codec,
'bitratebtn': bitratebtn, 'qualitybtn': qualitybtn,
'codec_n': codec_n, 'folder': folder, 'same_folder': same_folder,
}
f = open(filename, 'r')
line = f.readline()#.replace('"', '')
result = prog.findall(line)
if result:
result = isutf(result[0].replace('"', ''))
gui.bin_filename = None
track, filename, title, performers = [], [], [], []
while line:
if 'TRACK' in line and 'REM' not in line:
track.append(line.strip()[6:8])
if 'GENRE' in line:
dic['genre'] = line[10:-2].replace('"', '')
if 'DATE' in line:
dic['date'] = line.split(' ')[2][:4]
if 'PERFORMER' in line:
dic['performer'] = result
performers.append(result)
if 'COMPOSER' in line:
dic['composer'] = result
if 'TITLE' in line:
if line[0]==' ':
title.append(result)
else:
dic['album'] = result
if 'FILE' in line:
# if multitrack
seek = f.tell()
line1 = f.readline()
if 'TRACK' in line1:
filename.append(isutf(line)[5:-2].replace(
' WAVE', '').replace('"', ''))
f.seek(seek)
gui.bin_filename = (isutf(line)[5:-2]).replace(
' WAVE', '').replace('"', '')
full_path = os.path.join(root, gui.bin_filename)
if not os.path.isfile(full_path.encode('utf-8')):
gui.bin_filename = gui.find_bin(root)
if not gui.bin_filename:
gui.bin_filename = 'None'
message = _('Bin file not found\n<b>%s</b>') %full_path
gtk.gdk.threads_enter()
print message.replace('<b>', '').replace('</b>', '')
dialog = gtk.MessageDialog(parent=None,
flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_WARNING,
buttons=gtk.BUTTONS_OK)
dialog.set_markup(message)
gobject.timeout_add(10000, lambda: dialog.destroy())
response = dialog.run()
dialog.destroy()
gtk.gdk.threads_leave()
dic['bin_file'] = gui.bin_filename
line = f.readline()
result = prog.findall(line)
if result:
result = isutf(result[0].replace('"', ''))
if gui.bin_filename is None:
f.close()
break
f.close()
'''get album length'''
if len(filename) is not 1:
dic['bin_files'] = filename
if len(performers) is not 1:
dic['performers'] = performers
for n in range(len(performers)-1):
if performers[n] != performers[n + 1]:
dic['performer'] = _('Various artists')
gtk.gdk.threads_enter()
tree_store.append(
None, (str(len(tree_store) + 1), True, '%s - %s' % (
dic['performer'], dic['album']),
None, None, dic))
treeview.set_cursor(len(tree_store) - 1)
iter = tree_store.get_iter(len(tree_store) - 1)
n = 0
for item in title:
n += 1
tree_store.append(iter,
(str(track[n-1]), True, item, None,
treeview.get_style().base[gtk.STATE_SELECTED].to_string(), None))
gtk.gdk.threads_leave()
break
gtk.gdk.threads_enter()
builder.get_object('del_task').set_sensitive(True)
if len(tree_store) > 0:
builder.get_object('start').set_sensitive(True)
builder.get_object('start').grab_focus()
builder.get_object('find_cue').set_sensitive(True)
if len(tree_store) > 1:
builder.get_object('job_up').set_sensitive(True)
builder.get_object('job_down').set_sensitive(True)
gtk.gdk.threads_leave()
print 'searching cue done'
self.bloc = False
class Add_queue(threading.Thread):
def __init__(self, job_name, dic):
threading.Thread.__init__(self)
self.job_name = job_name
self.dic = dic
def run(self):
treeview = builder.get_object('job queue')
tree_store = treeview.get_model()
gtk.gdk.threads_enter()
tree_store.append(
None, (str(len(tree_store)+1), True, self.job_name,
None, None, self.dic))
treeview.set_cursor(len(tree_store) - 1)
if len(tree_store) == 2:
builder.get_object('job_up').set_sensitive(True)
builder.get_object('job_down').set_sensitive(True)
if len(threading.enumerate()) > 2:
progressbar2=builder.get_object('progressbar2')
text = '%s in queue:%s' %(Conversation.job_name,len(tree_store))
progressbar2.set_text(text)
preference.progressbar2.set_text(text)
gtk.gdk.threads_leave()
"""
get tags
please use code tags instead of quote (edit your post). That makes it unreadable. From the other hand can you post the error message when you interrupt the hanging program.
please use code tags instead of quote (edit your post). That makes it unreadable. From the other hand can you post the error message when you interrupt the hanging program.
Done sorry!
Here is where is hangs.
P.S. The xapp-gtk3-module error does not stop the script from working on the files that are in my /home directory.
Code:
normand@normand-X570:~$ cueconverter
Gtk-Message: 14:50:37.649: Failed to load module "xapp-gtk3-module"
[]
start encode
Encoding "Hymnus Paradisi: I. Preludio" (1/6)
/usr/bin/lame --id3v2-only --ta "Choir of King's College, Cambridge; David Willcocks" --tt "Hymnus Paradisi: I. Preludio" --tl "Howells: Hymnus Paradisi [Remastered 2019] (King's, Willcocks)" --ty "" --tc "gCue2tracks" --tn "01/6" --tg "" --nohist -b 320 /tmp/gcue2tracks2bjYfd/split-track01.wav
Encoding "Hymnus Paradisi: II. Requiem aeternam" (2/6)
/usr/bin/lame --id3v2-only --ta "Choir of King's College, Cambridge; David Willcocks" --tt "Hymnus Paradisi: II. Requiem aeternam" --tl "Howells: Hymnus Paradisi [Remastered 2019] (King's, Willcocks)" --ty "" --tc "gCue2tracks" --tn "02/6" --tg "" --nohist -b 320 /tmp/gcue2tracks2bjYfd/split-track02.wav
Encoding "Hymnus Paradisi: III. The Lord is my shepherd" (3/6)
/usr/bin/lame --id3v2-only --ta "Choir of King's College, Cambridge; David Willcocks" --tt "Hymnus Paradisi: III. The Lord is my shepherd" --tl "Howells: Hymnus Paradisi [Remastered 2019] (King's, Willcocks)" --ty "" --tc "gCue2tracks" --tn "03/6" --tg "" --nohist -b 320 /tmp/gcue2tracks2bjYfd/split-track03.wav
Encoding "Hymnus Paradisi: IV. Sanctus - I will lift up my eyes" (4/6)
/usr/bin/lame --id3v2-only --ta "Choir of King's College, Cambridge; David Willcocks" --tt "Hymnus Paradisi: IV. Sanctus - I will lift up my eyes" --tl "Howells: Hymnus Paradisi [Remastered 2019] (King's, Willcocks)" --ty "" --tc "gCue2tracks" --tn "04/6" --tg "" --nohist -b 320 /tmp/gcue2tracks2bjYfd/split-track04.wav
Encoding "Hymnus Paradisi: V. I heard a voice form heaven" (5/6)
/usr/bin/lame --id3v2-only --ta "Choir of King's College, Cambridge; David Willcocks" --tt "Hymnus Paradisi: V. I heard a voice form heaven" --tl "Howells: Hymnus Paradisi [Remastered 2019] (King's, Willcocks)" --ty "" --tc "gCue2tracks" --tn "05/6" --tg "" --nohist -b 320 /tmp/gcue2tracks2bjYfd/split-track05.wav
Encoding "Hymnus Paradisi: VI. Holy is the true light" (6/6)
/usr/bin/lame --id3v2-only --ta "Choir of King's College, Cambridge; David Willcocks" --tt "Hymnus Paradisi: VI. Holy is the true light" --tl "Howells: Hymnus Paradisi [Remastered 2019] (King's, Willcocks)" --ty "" --tc "gCue2tracks" --tn "06/6" --tg "" --nohist -b 320 /tmp/gcue2tracks2bjYfd/split-track06.wav
start copy file
01 - Hymnus Paradisi: I. Preludio.mp3 =>> /media/normand/1F36098A476696C6/Torrent/111/222/333/Choir of King's College, Cambridge; David Willcocks/unknown - Howells: Hymnus Paradisi [Remastered 2019] (King's, Willcocks)
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/home/normand/bin/gCue2tracks/decoder.py", line 739, in run
start()
File "/home/normand/bin/gCue2tracks/decoder.py", line 254, in start
a = a.run()
File "/home/normand/bin/gCue2tracks/decoder.py", line 687, in run
move(newname, newdir)
File "/usr/lib/python2.7/shutil.py", line 325, in move
copy2(src, real_dst)
File "/usr/lib/python2.7/shutil.py", line 153, in copy2
copyfile(src, dst)
File "/usr/lib/python2.7/shutil.py", line 97, in copyfile
with open(dst, 'wb') as fdst:
IOError: [Errno 22] invalid mode ('wb') or filename: u"/media/normand/1F36098A476696C6/Torrent/111/222/333/Choir of King's College, Cambridge; David Willcocks/unknown - Howells: Hymnus Paradisi [Remastered 2019] (King's, Willcocks)"
Traceback (most recent call last):
File "/home/normand/bin/gCue2tracks/gCue2tracks.py", line 837, in stop
a = treads[1].stop()
IndexError: list index out of range
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know.